資源簡介
之前總結了一篇k-中心點算法的文章后,現給出Matlab代碼實現,代碼含有詳細的注釋便于讀者理解。

代碼片段和文件信息
clc;??
clear;??
%讀取數據文件生成點矩陣??
fileID?=?fopen(‘E:\MySoftware\matlabWorks\textK_Mediods\sample.txt‘);??
?C=textscan(fileID‘%f?%f‘);?%textscan函數讀取數據
?fclose(fileID);?%關閉一個打開的fileID的文件
?%顯示數組結果??
?%celldisp(C);??
?%將cell類型轉換為矩陣類型這里只假設原數據為二維屬性,且是二維的坐標點??
?CC_init=cat(2C{1}C{2});%用來保存初始加載的值??
?CC=CC_init;??%cat函數用于連接兩個矩陣或數組
??%獲得對象的數量??
?num=length(C{1});??
?%顯示初始分布圖??
?grid?on;%顯示表格
?scatter(C{1}C{2}‘filled‘);??%filled為實心圓,該函數可以把C中所有坐標的點都畫出來。
?%%設置任意k個簇??
k=4;??
%臨時存放k個中心點的數組??
C_temp=zeros(k2);??
%判斷所設置的k值是否小于對象的數量??
if?k ????%產生隨機的k個整數??
???randC=randperm(num);??
???randC=randC(1:k);??
???%從原數組中提出這三個點?????
???for?i=1:k??
???????C_temp(i:)=CC(randC(1i):);??
???end??
???%將原數組中的這三個點清空??
????for?j=1:k??
???????CC(randC(1j):)=zeros(12);??
????end????
????idZero=find(CC(:1)==0);??
????%刪除為零的行??
????[i1j1]=find(CC==0);??
????row=unique(i1);??
????CC(row:)=[];??
???%分配k個二維數組,用來存放聚類點??
???%分配行為k的存儲單元??
???cluster=cell(k11);???
????%將剔除的三個點加入到對應的三個存儲單元每個單元的第一行置為0,為了存儲相對應的簇中心??
???for?m=1:k??
???????cluster{m}=C_temp(m:);??
???end????
???%計算其他點到這k個點的距離,然后分配這些點,第一次遍歷??
???for?i=1:num-k??
???????%分別計算到三個點的距離?????????
???????minValue=1000000;%最小值,要根據實際情況設定該值??
???????minNum=-1;%最小值序號??
???????for?j=1:k??
???????????if?minValue>sqrt((CC(i1)-C_temp(j1))*(CC(i1)-C_temp(j1))+(CC(i2)-C_temp(j2))*(CC(i2)-C_temp(j2)))??
???????????????minValue=sqrt((CC(i1)-C_temp(j1))*(CC(i1)-C_temp(j1))+(CC(i2)-C_temp(j2))*(CC(i2)-C_temp(j2)));??
???????????????minNum=j;??
???????????end??
???????end??
???????cluster{minNum}=cat(1cluster{minNum}CC(i:));?????????
???end??
???%隨機選擇p點??
???flag=1;??
???count=0;??
???while?flag==1??
???????randC=randperm(num-k);??
???????randC=randC(1:1);????
???????o_random=CC(randC:);??
???????%找出該隨機點所在的簇??
???????recordN=0;??
???????for?i=1:k????????
???????????for?j=1:size(cluster{i}1)????????
???????????????cc=cluster{i}(j:);??
???????????????cc=cc-o_random;??
???????????????if?cc==0??
???????????????????recordN=i;??
???????????????????break;??
???????????????end??
???????????end??
???????end??
???????%將選擇的隨機點從點集中刪除??
???????CC(randC:)=[];??
???????%計算替換代價??
???????o=cluster{recordN}(1:);??
???????o_rand_sum=0;??
???????o_sum=0;??
???????for?i=1:length(CC)??
???????????o_rand_sum=o_rand_sum+sqrt((CC(i1)-o_random(11))*(CC(i1)-o_random(11))+(CC(i2)-o_random(12))*(CC(i2)-o_random(12)));??
???????????o_sum=o_sum+sqrt((CC(i1)-o(11))*(CC(i1)-o(11))+(CC(i2)-o(12))*(CC(i2)-o(12)));??
???????end??
???????%如果隨機選擇的點的代價小于原始代表點的代價,則替換該代表點,然后重新聚類??
???????if?o_rand_sum ???????????cluster{recordN}(1:)=o_random;??
???????????%將代表點放入對象集??
???????????CC=cat(1CCo);??
???????????%對所有對象重新進行聚類??
???????????%將cluster除第一行之外的數據全部清空??
???????????for?i=1:k??
???????????????c=cluster{i}(1:);??
???????????????cluster{i}=[];??
???????????????cluster{i}=c;??
???????????end???
???????????%重新聚類??
??????????
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????4422??2018-06-14?22:00??textK_Mediods\k_medoids.m
?????文件????????8976??2018-06-07?19:19??textK_Mediods\sample.txt
- 上一篇:分形維數MATLAB程序
- 下一篇:canny邊緣檢測算法的matlab實現
評論
共有 條評論