机器学习 K-means算法_0(Matlab实现)
生活随笔
收集整理的這篇文章主要介紹了
机器学习 K-means算法_0(Matlab实现)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一、解析
- 二、效果
- 1、數據展示
- 2、聚點迭代路徑
- 三、代碼
- 1、mian
- 2、K_means
- 3、Dist_Func
- 4、A_Rand
- 5、Show
一、解析
K_means:
接收數據集以及聚點信息
返回聚點軌跡,聚點簇,迭代次數,偏差以及偏差和
Dis_Func:
接收兩點的坐標
返回兩點距離
此處為歐式距離(可根據需求修改)
A_Rand:
接收數據集大小,分組數量,每組數量以及離散程度
返回隨機生成有規律分布的數據集
Show:
接收聚點簇軌跡,并作出聚點移動軌跡
二、效果
1、數據展示
2、聚點迭代路徑
‘+’表示數據集分布
‘*’表示聚點起點
直線表示聚點迭代軌跡
三、代碼
1、mian
%A:數據集 %size_A:數據集大小 %Points:聚點集 %nums_Points:聚點數量 %Error:誤差和 %Max_Iteration:最大迭代次數size_A=[20,2]; A=A_Rand(size_A,4,5,2); %A=Temp; plot(A(:,1),A(:,2),'+') hold on; nums_Points=4; Points=50+5.*rand(nums_Points,size_A(2)); plot(Points(:,1),Points(:,2),'*') Error=9; Max_Iteration=20;%Points:聚點軌跡 %Points_A:聚點簇 %flag:迭代次數 %Points_Centre_Variance:聚點簇偏差 %Points_Centre_Variance_Sum:聚點簇偏差和 [Track_Points,Points_A,flag, Points_Centre_Variance,Points_Centre_Variance_Sum]=K_means(A,size_A,Points,nums_Points,Error,Max_Iteration); %聚點軌跡作圖 Show(A,size_A,Track_Points, nums_Points,flag+1);disp("最終聚點:"); disp(Track_Points((1+flag*nums_Points):(flag+1)*nums_Points,:)); disp("聚點簇:"); disp(Points_A); disp("迭代次數:"); disp(flag); disp("聚點簇偏差:"); disp(Points_Centre_Variance); disp("聚點簇偏差和:"); disp(Points_Centre_Variance_Sum);2、K_means
function [Track_Points,Points_A,flag, Points_Centre_Variance,Points_Centre_Variance_Sum] = K_means(A,size_A,Points,nums_Points,Error,Max_Iteration) %A:���?� %size_A:���?���С %Points:�?? %nums_Points:�?��� %Error:���?�������%聚點軌跡記錄 Track_Points=[]; Track_Points=[Track_Points;Points];%�������� flag=0;%���?�?������ ���� Dist_A_P=zeros(size_A(1),1+nums_Points); Dist_A_P(:,1)=(1:size_A(1))'; for i=1:size_A(1)for j=1:nums_PointsDist_A_P(i,j+1)=Dist_Func(A(i,:),Points(j,:),nums_Points);end end%�?����� ���� �� Points_A=zeros(nums_Points,2+size_A(1)); Points_A(:,1)=(1:nums_Points)'; Points_A(:,2)=0; for i=1:size_A(1)temp=find(Dist_A_P(i,2:1+nums_Points)==min(Dist_A_P(i,2:1+nums_Points)));Points_A(temp(1),2)=Points_A(temp(1),2)+1;Points_A(temp(1),2+Points_A(temp(1),2))=i; end%���?����� ���� �������?����� Points_Centre=zeros(nums_Points,1+size_A(2)); Points_Centre(:,1)=(1:nums_Points)'; for i=1:nums_PointsSum=zeros(1,size_A(2));for j=1:Points_A(i,2)Sum=Sum+A(Points_A(i,2+j),:);endif(Points_A(i,2)~=0)Points_Centre(i,2:1+size_A(2))=Sum./Points_A(i,2);end end%?������ ���� ?�� Points_Centre_Variance=zeros(nums_Points,2); Points_Centre_Variance(:,1)=(1:nums_Points)'; Points_Centre_Variance_Sum=0; for i=1:nums_PointsSum=0;for j=1:Points_A(i,2)Sum=Sum+Dist_Func(Points(i,:),A(Points_A(i,2+j),:),nums_Points);endif(Points_A(i,2)~=0)Points_Centre_Variance(i,2)=Sum./Points_A(i,2);endPoints_Centre_Variance_Sum=Points_Centre_Variance_Sum+Points_Centre_Variance(i,2); endwhile(Points_Centre_Variance_Sum>Error && flag<Max_Iteration)%����������1flag=flag+1;%����Pointsfor i=1:nums_Pointsif(Points_A(i,2)~=0)Points(i,:)=Points_Centre(i,2:1+size_A(2));endend%聚點軌跡記錄Track_Points=[Track_Points;Points];%���?�?������ ���� for i=1:size_A(1)for j=1:nums_PointsDist_A_P(i,j+1)=Dist_Func(A(i,:),Points(j,:),nums_Points);endend%�?����� ���� ��Points_A(:,2)=0;for i=1:size_A(1)temp=find(Dist_A_P(i,2:1+nums_Points)==min(Dist_A_P(i,2:1+nums_Points)));Points_A(temp(1),2)=Points_A(temp(1),2)+1;Points_A(temp(1),2+Points_A(temp(1),2))=i;end%���?����� ���� �������?�����for i=1:nums_PointsSum=zeros(1,size_A(2));for j=1:Points_A(i,2)Sum=Sum+A(Points_A(i,2+j),:);endif(Points_A(i,2)~=0)Points_Centre(i,2:1+size_A(2))=Sum./Points_A(i,2);endend%?������ ���� ?��Points_Centre_Variance_Sum=0;for i=1:nums_PointsSum=0;for j=1:Points_A(i,2)Sum=Sum+Dist_Func(Points(i,:),A(Points_A(i,2+j),:),nums_Points);endif(Points_A(i,2)~=0)Points_Centre_Variance(i,2)=Sum./Points_A(i,2);endPoints_Centre_Variance_Sum=Points_Centre_Variance_Sum+Points_Centre_Variance(i,2);end end end3、Dist_Func
function [ret] = Dist_Func(A,B,nums_Points) ret=round(sqrt(sum((A-B).^2)),3); end4、A_Rand
function [Ret_A] = A_Rand(size_A,nums1,nums2,Dispersion) %size_A:數據集大小 %nums1:分組數量 %nums2:每組數量 %Dispersion:每組離散程度temp=100.*rand(nums1,size_A(2)); Ret_A=Dispersion.*rand(size_A);for i=1:nums1Ret_A((nums2*(i-1)+1):(nums2*i),:)=Ret_A((nums2*(i-1)+1):(nums2*i),:)+temp(i,:); end end5、Show
function [Ret_A] = Show(A,size_A,Track_Points,nums_Point,nums) %A:數據集 %size_A:數據集大小 %Track_Points:聚點軌跡 %nums_Point:聚點數量 %nums:聚點規模 for i=1:nums_Pointtemp1= Track_Points(nums_Point*[0:nums-1]+i,1);temp2= Track_Points(nums_Point*[0:nums-1]+i,2);plot(temp1,temp2);end總結
以上是生活随笔為你收集整理的机器学习 K-means算法_0(Matlab实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Leetcode题库 11.盛水最多的容
- 下一篇: 机器学习 感知机算法_0(Matlab实