天天看點

Stanford ML - Clustering 聚類

到無監督機器學習算法了 - 訓練集沒有辨別,算法根據具體的需要自己找到其中的一些規律。首先是聚類算法,這個應用的感覺比較廣泛,比如新聞主題的聚合,市場的劃分,微網誌上圈子的挖掘等。聚類用的K-means算法比較簡單,主要是兩個步驟:找到距離目前元素最近的類,把目前元素劃分到該類;用類中所有元素的均值中心作為新的類中心。重複這兩個步驟,直到類中心不再變化為止(小于某個門檻值)。

Stanford ML - Clustering 聚類

聚類算法的優化目标就是使各個元素與所屬類中心的距離方差最小:

Stanford ML - Clustering 聚類

最開始的聚類中心怎麼選擇呢?可以随機從訓練集裡面選擇K個作為中心,當然前提是K小于訓練集元素數目。這裡有個局部最優問題,也就是依據初始的K個聚類中心,最終得到的聚類不是整體最優的。為了解決這個問題,可以多次運作聚類算法,從中選擇代價方式最小的作為最終的結果。

Stanford ML - Clustering 聚類

怎麼選擇劃分為多少個聚類呢?感覺最靠譜的是由需求來決定,也是聚類之後最終的目的。

找最近點,貌似沒有好辦法,雙重循環:

for i = 1:size(X,1)
    min_dis = intmax;
    for j = 1:K
        gap = (X(i,:) - centroids(j,:));
        distance = gap * gap';
        if (double(min_dis) > distance)
            min_dis = distance;
            idx(i) = j;
        end
    end
end
           

計算Centriod,這個有巧妙的算法,Matlab很強大呀。

for i = 1:K
    centroids(i,:) = (X' * (idx == i))' / sum(idx == i);
end
           

繼續閱讀