微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Octave 中的 Kmeans 聚类——在一个轴上绘制多个变量与归一化值以及在旧数据上叠加新数据的问题

如何解决Octave 中的 Kmeans 聚类——在一个轴上绘制多个变量与归一化值以及在旧数据上叠加新数据的问题

背景信息:

我正在开发一个具有多个变量的 kmeans 算法,并且我正在努力解决将所有变量绘制在同一张图上的概念。该数据集包含一组来自棒球的统计数据——列是:Player、BA、OPS、RBI 和 OBP。

这是我的数据集的前几行在我的 CSV 文件中的样子(共 411 行):

Player,BA,OPS,RBI,OBP
SandyAlcantara,0.086,0.22,4,0.117
Petealonso,0.26,0.941,120,0.358
BrandonLowe,0.27,0.85,51,0.336
MikeSoroka,0.077,3,0.143

为了完成这项工作,我实际上创建了一个文件(称为 MLBn.txt),其中删除了第一行和第一列,因此在缩放它们时没有字符串值。

看起来是这样的:

0.086   0.22    4   0.117
0.26    0.941   120 0.358
0.27    0.85    51  0.336
0.077   0.22    3   0.143
0.233   0.774   25  0.324
0.329   0.852   19  0.381
0.287   0.785   17  0.325
0.271   0.82    77  0.34
0.207   0.691   13  0.324

我使用此代码(在单独的文件中)来缩放值:

    function dataout = scaledata(datain,minval,maxval)
  dataout = datain - min(datain(:));
  dataout = (dataout/range(dataout(:)))*(maxval-minval);
  dataout = dataout + minval;
  end

由此产生的输出如下所示: 在命令窗口中:

load MLBn.txt
dataout = scaledata(MLBn,-1,1);

enter image description here

我的问题就从这里开始

有了这些数据,我想创建一个函数用户可以在其中输入新值,并将它们的值与现有数据文件结合起来,以便用户能够看到输入值在参考中的聚集位置到现有数据。我对该代码的尝试在这里

### define function where user can input new data for rookie players

 function newKmeansData([OPS BatAv OBP RBI])
   
###combine new matrix and old matrix for k means and plotting purposes
   [v1,v2] = meshgrid (newdata,dataout)
   
   totaldata = [v1(:),v2(:)] 
           
###scale data

load MLBn.txt
dataout = scaledata(totaldata,1);

我使用下一个算法对数据进行聚类和绘制之前引入上述有问题的函数,并且能够创建包含一些点的实际图形,尽管它本身似乎有问题:

### cluster the data 
K = 3
[idx,centers] = kmeans(dataout,K);


### Plot the result
 figure;
 plot (dataout (idx==1,1),dataout (idx==1,2),'ro','MarkerSize',10);
 hold on;
 plot (dataout (idx==2,dataout (idx==2,'bs',10);
 plot (centers (:,centers (:,'kv',14,'linewidth',3)
 legend('Cluster 1','Cluster 2','Centroids','Location','NW')
title ('Input Value Compared to Allstar Data')
xlabel('Hitter Statistics')
ylabel('Standardized Data Scale')
set(gca,'XTickLabel',{'OPS','BatAv','OBP','RBI'})

 hold off;
 

这是代码创建的图表:

Plot of clusters with no user input

终极问题

我觉得我的问题是我错误地缩放了图,只是没有在图中正确标记所有内容。我觉得好像我应该单独标准化并以不同的形状或颜色在旧数据之上绘制新用户输入的数据,只是我不知道如何去做。

有没有办法将我的数据集中的每个变量分配给它自己的 x 轴刻度线,并根据标准化值绘制它,以便用户能够查看每个玩家的特定统计数据?

我对此的一些想法:

我可以尝试将列定义为我想要的各种标签

#like the cell2table function
C = {MLBn}
T = cell2table(C,...
    'VariableNames',{'BA' 'OPS' 'RBI' 'OBP'})

或者单独绘制新数据

   figure;
     plot (newdata (idx==1,newdata (idx==1,5);
     hold on;
     plot (newdata (idx==2,newdata (idx==2,5);
     plot (dataout (idx==1,'*',5);
     hold on;
     plot (dataout (idx==2,'.',5);

对此的任何指导或帮助将不胜感激!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。