1.介紹
k-means是一種常見的基于劃分的聚類算法。劃分方法的基本思想是:給定一個有N個元組或者記錄的數(shù)據(jù)集,將數(shù)據(jù)集依據(jù)樣本之間的距離進(jìn)行迭代分裂,劃分為K個簇,其中每個簇至少包含一條實(shí)驗(yàn)數(shù)據(jù)。
2.k-means原理分析
2.1工作原理
(1)首先,k-means方法從數(shù)據(jù)集中隨機(jī)選擇K個數(shù)據(jù)中心點(diǎn),每個點(diǎn)代表初始的聚類中心
(2)計(jì)算剩余各個樣本到每個聚類中心的距離,將每個樣本距離第i個聚類中心的較近的值賦給聚類中心i
分別計(jì)算器距離,容易得出隨機(jī)聚類中心1離1、2、3最近,隨機(jī)聚類中心2離4、5、6最近,隨機(jī)聚類中心3離7、8、9最近
(3)重新計(jì)算每個聚類中心的值,對K個聚類中心的每個值進(jìn)行均值劃分,更新K個聚類中心的坐標(biāo)位置
(4)直至K個聚類中心不再變化
示意圖:
本圖轉(zhuǎn)自:https://blog.csdn.net/Katherine_hsr/article/details/79382249
2.2 K-means算法設(shè)計(jì)
輸入:聚類的個數(shù)K,數(shù)據(jù)集,樣本距離計(jì)算依據(jù)
輸出:K個聚類
算法處理流程同上工作原理
3.matlab程序 (參考至機(jī)器學(xué)習(xí)周志華第9章)
數(shù)據(jù)集下載地址:https://download.csdn.net/download/sinat_38648388/10745809
3.1 matlab自主k-means編程
%% K-mens方法的matlab實(shí)現(xiàn)
%% 數(shù)據(jù)準(zhǔn)備和初始化
clc
clear
x=[0 0; 1 0; 0 1;1 1;2 1; 1 2; 2 2;3 2;6 6;7 6;8 6;6 7; 7 7;8 7;9 7;7 8;8 8;9 8;8 9;9 9];
z=zeros(2,2);
z1=zeros(2,2);
z=x(1:2,1:2);
%% 尋找聚類中心
while 1count=zeros(2,1);allsum=zeros(2,2);for i=1:20 %對每一個樣本i,計(jì)算到2個聚類中心的距離temp1=sqrt((z(1,1)-x(i,1)).^2+(z(1,2)-x(i,2)).^2);temp2=sqrt((z(2,1)-x(i,1)).^2+(z(2,2)-x(i,2)).^2);if(temp1<temp2)count(1)=count(1)+1;allsum(1,1)=allsum(1,1)+x(i,1);allsum(1,2)=allsum(1,2)+x(i,2);elsecount(2)=count(2)+1;allsum(2,1)=allsum(2,1)+x(i,1);allsum(2,2)=allsum(2,2)+x(i,2);endendz1(1,1)=allsum(1,1)/count(1);z1(1,2)=allsum(1,2)/count(1);z1(2,1)=allsum(2,1)/count(2);z1(2,2)=allsum(2,2)/count(2);if(z==z1)break;elsez=z1;end
end
%% 結(jié)果顯示
disp(z1);%輸出聚類終須
plot(x(:,1),x(:,2),'k*',...'LineWidth',2,...'MarkerSize',10,...'MarkerEdgeColor','k',...'MarkerFaceColor',[0.5,0.5,0.5])
hold on
plot(z1(:,1),z1(:,2),'ko',...'LineWidth',2,...'MarkerSize',10,...'MarkerEdgeColor','k',...'MarkerFaceColor',[0.5,0.5,0.5])
set(gca,'linewidth',2);
xlabel('特征x1','fontsize',12);
xlabel('特征x2','fontsize',12);
title('K-means分類圖','fontsize',12);
3.2matlab k-means集成函數(shù)編程
matlan中kmeans中的集成函數(shù)為kidxs=kmeans(bonds,numClust,‘distance’,dist_k);
其中bonds表示輸入的數(shù)據(jù)集,numClust表示輸入的類,distance表示選擇樣本聚類依據(jù),類型有
: % methods = {‘euclidean’; ‘seuclidean’; ‘cityblock’; ‘chebychev’; …
% ‘mahalanobis’; ‘minkowski’; ‘cosine’; ‘correlation’; …
% ‘spearman’; ‘hamming’; ‘jaccard’};
%% 導(dǎo)入數(shù)據(jù)與數(shù)據(jù)預(yù)處理
clc,clear all,close all
load BondData
settle=floor(date);
%數(shù)據(jù)預(yù)處理
bondData.MaturityN=datenum(bondData.Maturity,'dd-mmm-yyyy');
bondData.settleN=settle * ones(height(bondData),1);
%篩選數(shù)據(jù)
corp=bondData(bondData.MaturityN > settle &...bondData.Type =='Corp' &...bondData.Rating >= 'CC'&...bondData.YTM < 30 &...bondData.YTM >= 0,:);
%設(shè)置隨機(jī)數(shù)生成方式保證結(jié)果可重現(xiàn)
rng('default');
%% 探索數(shù)據(jù)
figure
gscatter(corp.Coupon,corp.YTM,corp.Rating)
set(gca,'linewidth',2);
xlabel('票面利率')
ylabel('到期收益率')
%選擇聚類變量
corp.RatingNum=double(corp.Rating);
bonds=corp{:,{'Coupon','YTM','CurrentYield','RatingNum'}};
%設(shè)置類別數(shù)量
numClust=3;
%設(shè)置用于可視化聚類效果的變量
VX=[corp.Coupon,double(corp.Rating),corp.YTM];
%% k-means聚類
dist_k='cosine';
kidx=kmeans(bonds,numClust,'distance',dist_k);
%繪制聚類效果圖
%z=VX(kidx(m,n));表示VX的第m個值,聚類出來的第n類
figure
%VX(kidx==m,n)代表VX中第m列,第n類
F1=plot3(VX(kidx==1,1),VX(kidx==1,2),VX(kidx==1,3),'r*',...VX(kidx==2,1),VX(kidx==2,2),VX(kidx==2,3),'bo',... VX(kidx==3,1),VX(kidx==3,2),VX(kidx==3,3),'kd' );
set(gca,'linewidth',2);
grid on;
set(F1,'linewidth',2,'MarkerSize',8);
xlabel('票面利率','fontsize',12);
ylabel('評級得分','fontsize',12);
zlabel('到期收益率','fontsize',12);
title('Kmeans方法聚類結(jié)果')%% 評估各類的相關(guān)程度
dist_metric_k=pdist(bonds,dist_k);
dd_k=squareform(dist_metric_k);
[~,idx]=sort(kidx);
dd_k=dd_k(idx,idx);
figure
imagesc(dd_k)
set(gca,'linewidth',2);
xlabel('數(shù)據(jù)點(diǎn)','linewidth',2);
ylabel('數(shù)據(jù)點(diǎn)','fontsize',12);
title('K-means聚類結(jié)果相關(guān)程度圖','fontsize',12)
ylabel(colorbar,['距離矩陣:',dist_k])
axis square
總結(jié)
以上是生活随笔為你收集整理的聚类分析(二)k-means及matlab程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。