trybeetle

take it slow!!

Clusteringについて


Posted on July 29, 2018, 11:28 p.m.



Unsupervised learningの一種であるClusteringについて記載します。
CourseraのMachine Learningコースを元にしています。

以下の例では、clusteringの手法の内、k-meansを使用します。


データの読み込み

今回読み込むデータは2Dデータです。また、クラスタリング数を3と設定します。iterations回数を10とします。


    load('ex7data2.mat');
    K = 3; % 3 Centroids
    max_iters = 10;

各クラスタリングのcentroidsの初期値を設定します。初期値は、training dataからランダムに選択することとします。


    function centroids = kMeansInitCentroids(X, K)
    centroids = zeros(K, size(X, 2));
    randidx = randperm(size(X, 1));
    centroids = X(randidx(1:K), :);
    end

K-meansの実行

①各トレーニングデータから、一番近いcentroidを求めます。各トレーニング毎に、属するクラスター番号を振り、idxとします。


    function [idx, J] = findClosestCentroids(X, centroids)
    K = size(centroids, 1);
    m = size(X,1);
    idx = zeros(size(X,1), 1);
    valueidx = zeros(size(X,1), 1);
    diff = zeros(size(centroids),1);
    for i = 1:m
        for j = 1:K
            diff(j) = (centroids(j,:) - X(i,:)) * (centroids(j,:) - X(i,:))';
        endfor
        [value, index] = min(diff);
        idx(i) = index;
        valueidx(i) = value;
    endfor
    J = 1/m * sum(valueidx);
    end

②各クラスターに属するデータの平均値を求め、その平均値をcentroidの値として更新します。


    function centroids = computeCentroids(X, idx, K)
    [m n] = size(X);
    centroids = zeros(K, n);
    for i=1 :K
      centroids(i, :) = mean(X([find(idx == i)], :));
    endfor
    end

上記の2つのステップをiterations回数分繰り返します。その結果算出されたcentroidsの値が、各クラスタの最適なcentroidsの値になります。


    initial_centroids = kMeansInitCentroids(X, K);
    centroids = initial_centroids;

    for i=1:max_iters
        [idx,J] = findClosestCentroids(X, centroids);
        centroids = computeCentroids(X, idx, K);
    endfor

以上により、centroidsとcost function(J)が求まります。


補足

ランダムに設定したcentroidの初期値によって、local optimaに収束する可能性があります。そのため、ランダムな初期値を複数回試し、cost function(J)が最小値となるcentroidを最適解とします。

以上です


Category:ML
Tag: ML Octave
July 29, 2018, 11:28 p.m.

Comments