國內部落格,上介紹實現的k-medodis方法為:
與k-means演算法類似。只是距離選擇與聚類中心選擇不同。
距離為曼哈頓距離
聚類中心選擇為:依次把乙個聚類中的每乙個點當作當前類的聚類中心,求出代價值最小的點當作當前聚類中心。
維基百科上,實現的方法為pam演算法。
分成k類,把每個點都嘗試當作聚類中心,並求出當前組合聚類中心點組合的代價值。找到總最小代價值的中心點。
國內實現:
kmedoids.m**:
function [cx,cost] =kmedoids(k,data,num)main.m%生成將data聚成k類的最佳聚類
%k為聚類數目,data為資料集,num為隨機初始化次數
[cx,cost] =kmedoids1(k,data);
for i = 2:num
[cx1,min] =kmedoids1(k,data);
if min
cost =min;
cx =cx1;
endend
endfunction [cx,cost] =kmedoids1(k,data)
%把分類資料集data聚成k類
% [cx,cost] =kmeans(k,data)
%k為聚類數目,data為資料集
%cx為樣本所屬聚類,cost為此聚類的代價值
%選擇需要聚類的數目
%隨機選擇聚類中心
centroids = data(randperm(size(data,1),k),:);
%迭代聚類
centroids_temp =zeros(size(centroids));
num =0;
while (~isequal(centroids_temp,centroids)&&num<20)
centroids_temp =centroids;
[cx,cost] =findclosest(data,centroids,k);
centroids =compuecentroids(data,cx,k);
num = num+1;
end% cost = cost/size(data,1);
endfunction [cx,cost] =findclosest(data,centroids,k)
%將樣本劃分到最近的聚類中心
cost =0;
n = size(data,1);
cx = zeros(n,1);
for i = 1:n
%曼哈頓距離
[m,i] = min(sum(abs((data(i,:)-centroids))'
)); cx(i) =i;
cost = cost+m;
endendfunction centroids =compuecentroids(data,cx,k)
%計算新的聚類中心
centroids = zeros(k,size(data,2));
for i = 1:k
%尋找代價值最小的當前聚類中心
temp = data((cx==i),:);
[~,i] =min(sum(squareform(pdist(temp))));
centroids(i,:) =temp(i,:);
endend
%主函式執行main.m結果為:%生成符合高斯分布的資料
mu = [5,5];
sigma = [16,0;0,16];
sigma1 = [0.5,0;0,0.5];
data = gaussiansample(8,50,mu,sigma,sigma1);
%聚類k = 6;
[cx,cost] = kmedoids(k,data,10);
plotmedoids(data,cx,k);
聚類演算法 近鄰聚類演算法
time is always too short for those who need it,but for those who love,it lasts forever.dracula untold 近鄰聚類法同樣是一種基於距離閾值的聚類演算法。coding utf 8 近鄰聚類演算法的pyth...
聚類演算法 層次聚類演算法
層次聚類演算法 hierarchical clustering method 又稱為系統聚類法 分級聚類法。層次聚類演算法又分為兩種形式 凝聚層次聚類 首先將每個物件作為乙個簇,然後合併這些原子簇為越來越大的簇,直到某個終結條件被滿足。層次聚類 首先將所有物件置於乙個簇中,然後逐漸細分為越來越小的簇...
聚類演算法 什麼是聚類
聚類分析或聚類演算法就是通過一些方法或手段使資料集集聚成不同的類別,或者叫 簇。簇內部每乙個單位都是相似的。簇與簇之間都是不相似的。但是聚類其實是一種思想,它不是一種具體的方法。這裡千萬不要搞混。但是可以實現聚類的演算法有很多種。我們通常就使用這些演算法來實現聚類的。比如 k means就是最為經典...