9

私は機械学習をいじっていて、Python で K Means アルゴリズムの実装を書きました。2 次元データを取得し、それらをクラスターに編成します。各データ ポイントには、0 または 1 のいずれかのクラス値もあります。

アルゴリズムについて私を混乱させるのは、それを使用して、0 または 1 を持たず、代わりに未知の 2 次元データの別のセットの値を予測する方法です。クラスタごとに、その中のポイントを 0 または 1 に平均化する必要がありますか?不明なポイントがそのクラスタに最も近い場合、その不明なポイントは平均化された値になりますか? または、よりスマートな方法はありますか?

乾杯!

4

4 に答える 4

16

k-means によって作成された一連のクラスターの 1 つに新しいデータ ポイントを割り当てるには、そのポイントに最も近い重心を見つけるだけです。

つまり、元のデータ セットの各ポイントを k 個のクラスターの 1 つに繰り返し割り当てるために使用したのと同じ手順です。ここでの唯一の違いは、この計算に使用している重心が最終的なセット、つまり最後の反復での重心の値であることです。

Pythonでの実装の 1 つを次に示します(NumPy を使用):

>>> import numpy as NP
>>> # just made up values--based on your spec (2D data + 2 clusters)
>>> centroids
      array([[54, 85],
             [99, 78]])

>>> # randomly generate a new data point within the problem domain:
>>> new_data = NP.array([67, 78])

>>> # to assign a new data point to a cluster ID,
>>> # find its closest centroid:
>>> diff = centroids - new_data[0,:]  # NumPy broadcasting
>>> diff
      array([[-13,   7],
             [ 32,   0]])

>>> dist = NP.sqrt(NP.sum(diff**2, axis=-1))  # Euclidean distance
>>> dist
      array([ 14.76,  32.  ])

>>> closest_centroid = centroids[NP.argmin(dist),]
>>> closest_centroid
       array([54, 85])
于 2011-11-19T11:50:34.327 に答える
2

私は遅れるかもしれないことを知っていますが、それはあなたの問題に対する私の一般的な解決策です:

def predict(data, centroids):
    centroids, data = np.array(centroids), np.array(data)
    distances = []
    for unit in data:
        for center in centroids:
            distances.append(np.sum((unit - center) ** 2))                
    distances = np.reshape(distances, data.shape)
    closest_centroid = [np.argmin(dist) for dist in distances]
    print(closest_centroid)
于 2017-10-30T11:00:57.923 に答える
1

最も近いクラスター内の平均値に基づいて値を割り当てることを検討している場合は、座標の正しい値だけでなく、推定値の信頼レベルを推定する何らかの形式の「ソフト デコーダー」について話していることになります。代替手段は、0 と 1 の値のみが有効な (トレーニング データ セットで発生する) 「ハード デコーダー」であり、新しい座標は最も近いクラスター内の値の中央値を取得します。私の推測では、常に既知の有効なクラス値 (0 または 1) のみを各座標に割り当てる必要があり、クラス値の平均化は有効なアプローチではありません。

于 2011-11-19T12:29:57.547 に答える