到無監督機器學習算法了 - 訓練集沒有辨別,算法根據具體的需要自己找到其中的一些規律。首先是聚類算法,這個應用的感覺比較廣泛,比如新聞主題的聚合,市場的劃分,微網誌上圈子的挖掘等。聚類用的K-means算法比較簡單,主要是兩個步驟:找到距離目前元素最近的類,把目前元素劃分到該類;用類中所有元素的均值中心作為新的類中心。重複這兩個步驟,直到類中心不再變化為止(小于某個門檻值)。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiQ3chVEa0V3bT9CX5RXa2Fmcn9CXwczLcVmds92czlGZvwVP9EUTDZ0aRJkSwk0LcxGbpZ2LcBDM08CXlpXazRnbvZ2LcRlMMVDT2EWNvwFdu9mZvwFdshUYvFzVlZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39jN0gDOyYzMzIDOygDM0EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
聚類算法的優化目标就是使各個元素與所屬類中心的距離方差最小:
最開始的聚類中心怎麼選擇呢?可以随機從訓練集裡面選擇K個作為中心,當然前提是K小于訓練集元素數目。這裡有個局部最優問題,也就是依據初始的K個聚類中心,最終得到的聚類不是整體最優的。為了解決這個問題,可以多次運作聚類算法,從中選擇代價方式最小的作為最終的結果。
怎麼選擇劃分為多少個聚類呢?感覺最靠譜的是由需求來決定,也是聚類之後最終的目的。
找最近點,貌似沒有好辦法,雙重循環:
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