解决MATLAB在K-means提示“KMEANS does not accept complex data.”错误

昨天开始看聚类方法,结果才看到第一个K-means聚类方法就卡壳了。我先大致了解了K-means聚类方法的原理,然后照着老师的代码逐步实现,就在使用kmeans函数进行聚类时,命令窗口报出了“KMEANS does not accept complex data.”的错误,百度也没有查询到相关的解决办法。自己前后经历了反复看原理以及kmeans函数的使用方法,但也没什么进展。直到后面突然想起看报告的错误的源代码,不到五分钟解决了问题。以下为解决方案:

(1)命令窗口报出“错误使用 kmeans (line 159) KMEANS does not accept complex data.”错误,点击“line 159”,显示为以下错误,意思是参数类型不匹配。

《解决MATLAB在K-means提示“KMEANS does not accept complex data.”错误》

(2)我的kmeans聚类的那两行代码是:

bonds = corp(:,{'Coupon','YTM','CurrentYield','RatingNum'});%取出含有'Coupon','YTM','CurrentYield','RatingNum'的列
kidx = kmeans(bonds,numClust,'distance',dist_k);

通过在命令窗口输入“class(bonds)”发现竟然是table类型,肯定不能识别啊,于是我使用table2array()函数将其改成了数组类型,一切问题迎刃而解。

改后的代码是:

bonds = corp(:,{'Coupon','YTM','CurrentYield','RatingNum'});%取出含有'Coupon','YTM','CurrentYield','RatingNum'的列
% bonds = table2array(bonds);
%%%%%!!!!!!!注意:!!!!!!
%%%%%问题就在这,必须将之前table类型的bonds转化为array类型
%%%%%否则将会报“KMEANS does not accept complex data.”这样的错误
%设置类别数量
kidx = kmeans(bonds,numClust,'distance',dist_k);

(3)通过这个问题,才领悟到一种新的改错方式,就是查看错误报告。看来是之前老师教授的知识没有吸收啊,只有遇到问题通过不断尝试才能够真正学会。

下面介绍一下这个K-means聚类MATLAB实例:

【题目背景】

 《解决MATLAB在K-means提示“KMEANS does not accept complex data.”错误》

下面是MATLAB源代码介绍:

(1)导入数据和预处理数据

 1 load 'BondData.mat';
 2 settle = floor(date);%floor朝无穷大方向取整
 3 %数据预处理
 4 bondData.MaturityN = datenum(bondData.Maturity,'dd-mmm-yyyy');%将时间化为数值
 5 bondData.SettleN = settle*ones(height(bondData),1);
 6 %筛选数据
 7 corp = bondData(bondData.MaturityN>settle&...
 8                 bondData.Type == 'Corp'&...
 9                 bondData.Rating >='CC'&...
10                 bondData.YTM<30&...
11                 bondData.YTM>=0,:);
12 %设置随机数生成方式,保证结果可重现
13 rng('default');

 

(2)探索数据

 1 figure
 2 gscatter(corp.Coupon,corp.YTM,corp.Rating)
 3 set(gca,'lineWidth',2);
 4 xlabel('票面利率')
 5 ylabel('到期收益率')
 6 %选择聚类变量
 7 corp.RatingNum = double(corp.Rating);
 8 bonds = corp(:,{'Coupon','YTM','CurrentYield','RatingNum'});%取出含有'Coupon','YTM','CurrentYield','RatingNum'的列
 9 bonds = table2array(bonds);%!!!!!!!!
10 %%%%%!!!!!!!注意:!!!!!!
11 %%%%%问题就在这,必须将之前table类型的bonds转化为array类型
12 %%%%%否则将会报“KMEANS does not accept complex data.”这样的错误
13 %设置类别数量
14 numClust = 3;
15 %设置用于可视化聚类效果的变量
16 VX = [corp.Coupon,double(corp.Rating),corp.YTM]; 

(3)K-means聚类

 1 dist_k = 'cosine';
 2 kidx = kmeans(bonds,numClust,'distance',dist_k);
 3 %绘制聚类效果图
 4 figure
 5 F1 = plot3(VX(kidx==1,1),VX(kidx==1,2),VX(kidx==1,3),'r*',...
 6            VX(kidx==2,1),VX(kidx==2,2),VX(kidx==2,3),'bo',...
 7            VX(kidx==3,1),VX(kidx==3,3),VX(kidx==3,3),'kd');
 8 set(gca,'lineWidth',2);
 9 grid on;
10 set(F1,'lineWidth',2);
11 xlabel('票面利率','fontsize',12);
12 ylabel('评级得分','fontsize',12);
13 ylabel('到期收益率','fontsize',12);
14 title('K-means聚类')
15 %评估各类别的相关程度
16 dist_metric_k = pdist(bonds,dist_k);
17 dd_k = squareform(dist_metric_k);
18 [~,idx]  = sort(kidx);
19 dd_k = dd_k(idx,idx);
20 figure
21 imagesc(dd_k)
22 set(gca,'linewidth',2);
23 xlabel('数据点','fontsize',12)
24 ylabel('数据点','fontsize',12)
25 title('K-means聚类结果相关程度图','fontsize',12);
26 ylabel(colorbar,['距离矩阵:',dist_k])
27 axis square

 运行结果图如下:

figure1:

《解决MATLAB在K-means提示“KMEANS does not accept complex data.”错误》

figure2:

《解决MATLAB在K-means提示“KMEANS does not accept complex data.”错误》

figure3:

《解决MATLAB在K-means提示“KMEANS does not accept complex data.”错误》

本题中,还遇到了一个小问题,MATLAB无法识别“Figure”,绘图应为“figure”,可对其进行编号,不编号则是会紧接着新弹出一个绘图界面。

 

    原文作者:Someday&Li
    原文地址: https://www.cnblogs.com/somedayLi/p/9564613.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞