如何对定性破产数据集进行模糊聚类

How to perform fuzzy clustering method on Qualitative Bankruptcy dataset

我们被要求在 Qualitative_Bankruptcy Data Set 上使用 MATLAB 构建一个模糊系统,我们被建议在其上实施 模糊聚类方法

数据集(250个实例)上有7个属性(6+1),每个独立的属性有3个可能的值,分别是PositiveAverageNegative .更多内容请参考dataset

根据我们的理解,聚类是通过计算参数之间的距离来对具有相似属性的实例进行分组。所以数据可能是这样的。 下面的图片只是一个虚拟数据,与我的项目无关。

问题是,如何对这样的数据集进行聚类分析。

P,P,A,A,A,P,NB
N,N,A,A,A,N,NB
A,A,A,A,A,A,NB
P,P,P,P,P,P,NB
N,N,N,A,N,A,B
N,N,N,P,N,N,B
N,N,N,N,N,P,B
N,N,N,N,N,A,B

好吧,让我们从读取您的数据开始:

clear();
clc();
close all;

opts = detectImportOptions('Qualitative_Bankruptcy.data.txt');
opts.DataLine = 1;
opts.MissingRule = 'omitrow';
opts.VariableNamesLine = 0;
opts.VariableNames = {'IR' 'MR' 'FF' 'CR' 'CO' 'OR' 'Class'};
opts.VariableTypes = repmat({'categorical'},1,7);
opts = setvaropts(opts,'Categories',{'P' 'A' 'N'});
opts = setvaropts(opts,'Class','Categories',{'B' 'NB'});

data = readtable('Qualitative_Bankruptcy.data.txt',opts);
data = rmmissing(data);
data_len = height(data);

现在,由于 kmeans 函数(参考 here)仅接受数值,我们需要将 categorical 个值的 table 转换为矩阵:

x = double(table2array(data));

最后,我们应用函数:

[idx,c] = kmeans(x,number_of_clusters);

问题来了。 k-means clustering 可以使用多种距离度量和多种选项来执行。您必须使用这些参数才能获得更接近可用输出的聚类。

由于 k-means clustering 将您的数据组织成 n 个簇,这意味着您的输出定义了多个 3 个簇,因为 46 + 71 + 61 = 178... 并且您的数据包含250 个观察结果,其中 72 个被分配到一个或多个我不知道的集群(也许你也不知道)。

如果你想复制那个输出,或者找到更接近你的输出的聚类......你必须找到,如果可用的话,一个算法来最小化错误......或者你可以尝试暴力破解-强制它,例如:

% ...

x = double(table2array(data));

cl1_targ = 46;
cl2_targ = 71;
cl3_targ = 61;

dist = {'sqeuclidean' 'cityblock' 'cosine' 'correlation'};

res = cell(16,3);
res_off = 1;

for i = 1:numel(dist)
    dist_curr = dist{i};

    for j = 3:6
        idx = kmeans(x,j,'Distance',dist_curr); % start parameter needed

        cl1 = sum(idx == 1);
        cl2 = sum(idx == 2);
        cl3 = sum(idx == 3);

        err = abs(cl1 - cl1_targ) + abs(cl2 - cl2_targ) + abs(cl3 - cl3_targ);

        res(res_off,:) = {dist_curr j err};
        res_off = res_off + 1;
    end
end

[min_val,min_idx] = min([res{:,3}]);
best = res(min_idx,1:2);

不要忘记记住 kmeans 函数使用随机选择的起始配置...因此它最终会为不同的起点提供不同的解决方案。使用 Start 参数定义固定起点(方法),否则每次 运行 和 kmeans 函数都会产生不同的结果。

既然你问的是模糊聚类,你就是在自相矛盾。

在模糊聚类中,每个对象属于每个个聚类,只是程度不同(聚类分配为"fuzzy")。

它主要用于数值数据,您可以假设测量值也不精确,但也有模糊误差。所以我认为它对分类数据没有多大意义。

现在,除了计算重复项之外,分类数据往往会非常糟糕地聚类。它的分辨率太粗糙了。人们对虚拟变量进行各种疯狂的黑客攻击,例如 运行 k-means,并且似乎从不质疑他们这样做实际上 compute/optimize 是什么。也不测试他们的结果...