机器学习 K-means算法_0(Matlab实现)
生活随笔
收集整理的這篇文章主要介紹了
机器学习 K-means算法_0(Matlab实现)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- 一、解析
- 二、效果
- 1、數(shù)據(jù)展示
- 2、聚點(diǎn)迭代路徑
- 三、代碼
- 1、mian
- 2、K_means
- 3、Dist_Func
- 4、A_Rand
- 5、Show
一、解析
K_means:
接收數(shù)據(jù)集以及聚點(diǎn)信息
返回聚點(diǎn)軌跡,聚點(diǎn)簇,迭代次數(shù),偏差以及偏差和
Dis_Func:
接收兩點(diǎn)的坐標(biāo)
返回兩點(diǎn)距離
此處為歐式距離(可根據(jù)需求修改)
A_Rand:
接收數(shù)據(jù)集大小,分組數(shù)量,每組數(shù)量以及離散程度
返回隨機(jī)生成有規(guī)律分布的數(shù)據(jù)集
Show:
接收聚點(diǎn)簇軌跡,并作出聚點(diǎn)移動(dòng)軌跡
二、效果
1、數(shù)據(jù)展示
2、聚點(diǎn)迭代路徑
‘+’表示數(shù)據(jù)集分布
‘*’表示聚點(diǎn)起點(diǎn)
直線表示聚點(diǎn)迭代軌跡
三、代碼
1、mian
%A:數(shù)據(jù)集 %size_A:數(shù)據(jù)集大小 %Points:聚點(diǎn)集 %nums_Points:聚點(diǎn)數(shù)量 %Error:誤差和 %Max_Iteration:最大迭代次數(shù)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:聚點(diǎn)軌跡 %Points_A:聚點(diǎn)簇 %flag:迭代次數(shù) %Points_Centre_Variance:聚點(diǎn)簇偏差 %Points_Centre_Variance_Sum:聚點(diǎn)簇偏差和 [Track_Points,Points_A,flag, Points_Centre_Variance,Points_Centre_Variance_Sum]=K_means(A,size_A,Points,nums_Points,Error,Max_Iteration); %聚點(diǎn)軌跡作圖 Show(A,size_A,Track_Points, nums_Points,flag+1);disp("最終聚點(diǎn):"); disp(Track_Points((1+flag*nums_Points):(flag+1)*nums_Points,:)); disp("聚點(diǎn)簇:"); disp(Points_A); disp("迭代次數(shù):"); disp(flag); disp("聚點(diǎn)簇偏差:"); disp(Points_Centre_Variance); disp("聚點(diǎn)簇偏差和:"); 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:���?�������%聚點(diǎn)軌跡記錄 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%聚點(diǎn)軌跡記錄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:數(shù)據(jù)集大小 %nums1:分組數(shù)量 %nums2:每組數(shù)量 %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:數(shù)據(jù)集 %size_A:數(shù)據(jù)集大小 %Track_Points:聚點(diǎn)軌跡 %nums_Point:聚點(diǎn)數(shù)量 %nums:聚點(diǎn)規(guī)模 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總結(jié)
以上是生活随笔為你收集整理的机器学习 K-means算法_0(Matlab实现)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Leetcode题库 11.盛水最多的容
- 下一篇: 机器学习 感知机算法_0(Matlab实