我们需要在Qualitative_Bankruptcy Data Set上建立一个带MATLAB的模糊系统,我们建议在其上实现模糊聚类方法。
数据集上有7个属性(6 + 1)(250个实例),每个独立属性有3个可能的值,即Positive
,Average
和Negative
。有关详情,请参阅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
答案 0 :(得分:0)
好吧,让我们从阅读您的数据开始:
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
值表转换为矩阵:
x = double(table2array(data));
最后,我们应用函数:
[idx,c] = kmeans(x,number_of_clusters);
现在出现了问题。 k-means clustering
可以使用各种距离测量和多种选项来执行。您必须使用这些参数才能获得更接近可用输出的聚类。
由于k-means clustering
将您的数据整理到n
群集中,这意味着您的输出定义了多个3
群集,因为46 + 71 + 61 = 178
...并且由于您的数据包含{{ 1}}观察,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
函数时都会产生不同的结果。
答案 1 :(得分:0)
由于您询问了模糊群集,因此您自相矛盾。
在模糊聚类中,每个对象都属于每个聚类,只是程度不同(聚类分配是"模糊")。
它主要用于数值数据,您可以假设测量结果不准确,但也会出现模糊误差。因此,我认为它对分类数据没有多大意义。
现在,除了计算重复数据之外,分类数据往往非常糟糕。它的分辨率太粗糙了。人们会做各种疯狂的黑客攻击,例如在虚拟变量上运行k-means,并且似乎从来没有质疑他们实际上通过这样做来计算/优化什么。也不测试他们的结果......