zoukankan      html  css  js  c++  java
  • 解决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”,可对其进行编号,不编号则是会紧接着新弹出一个绘图界面。

  • 相关阅读:
    SQLAlchemy使用merge
    Flask 处理文件 file
    PostgreSQL 常用命令
    Elasticsearch 常用命令
    Python3 encode中的unicode-escape和raw_unicode_escape
    Python 字符串16进制转换为字符串
    利用 Redis 实现接口频次限制
    Flask-Limiter 接口访问频次限制
    博客内容管理(2)-「解决方案」分类的内容设定和编写位置
    踩坑 | u盘 | u盘插入电脑无法识别打开
  • 原文地址:https://www.cnblogs.com/somedayLi/p/9564613.html
Copyright © 2011-2022 走看看