解決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”,顯示為以下錯誤,意思是參數類型不匹配。

(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”,可對其進行編號,不編號則是會緊接着新彈出一個繪圖界面。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM