昨天开始看聚类方法,结果才看到第一个K-means聚类方法就卡壳了。我先大致了解了K-means聚类方法的原理,然后照着老师的代码逐步实现,就在使用kmeans函数进行聚类时,命令窗口报出了“KMEANS does not accept complex data.”的错误,百度也没有查询到相关的解决办法。自己前后经历了反复看原理以及kmeans函数的使用方法,但也没什么进展。直到后面突然想起看报告的错误的源代码,不到五分钟解决了问题。以下为解决方案: (1)命令窗口报出“错误使用 kmeans (line 159) KMEANS does not accept complex data.”错误,点击“line 159”,显示为以下错误,意思是参数类型不匹配。 (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源代码介绍: (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: figure2: figure3: 本题中,还遇到了一个小问题,MATLAB无法识别“Figure”,绘图应为“figure”,可对其进行编号,不编号则是会紧接着新弹出一个绘图界面。
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论