2016-08-30 6 views
3

編集:この質問の答えが頻繁にで議論されていますSum in Spark gone badCompute Cost of KmeansKMeansのアンバランス要因?


、我々は1つが彼の関数kmeansモデルのコストを計算する方法を説明しました。不均衡の要因を計算できるかどうか疑問に思っていましたか?

Sparkが提供する機能がない場合は、これを実装する簡単な方法はありますか?


私はアンバランスの要因のための参照を見つけることができませんでしたが、それは(私のコメント)ヤエルのunbalanced_factorのようになります。

// @hist: the number of points assigned to a cluster 
// @n: the number of clusters 
double ivec_unbalanced_factor(const int *hist, long n) { 
    int vw; 
    double tot = 0, uf = 0; 

    for (vw = 0 ; vw < n ; vw++) { 
    tot += hist[vw]; 
    uf += hist[vw] * (double) hist[vw]; 
    } 

    uf = uf * n/(tot * tot); 

    return uf; 

} 

私はhereを発見しました。

したがって、(合計)はクラスタに割り当てられたポイントの数(データセットのサイズに等しい)に等しくなり、uf(不平衡係数の場合)はクラスタに割り当てられたポイント。

最後に、uf = uf * n/(tot * tot);を使用して計算します。それはのようなものかもしれないpython

+0

あなたはバランス係数であるかについての言及を示してもらえますか? –

+0

@AlbertoBonsantoそれは重心ごとにいくつのポイントがあるかです。すなわち、データセットのポイントを重心に割り当てた後(推測すると 'predict() 'となります)、データが重心を超えてバランスされているかどうかを示す係数を計算します。興味深いことに、私は良い評判を見つけることができませんが、あなたは正しいアイデアを得ることができますか?私は2セントロイドがあり、100ポイントが第1の重心に割り当てられ、10が第2のセントロイドに割り当てられる場合、バランス係数は悪くなければならない。 1位に60ポイント、2位に50ポイントがある場合、バランス係数は可能なはずです。だから基本的に1つの#pointsを数えたいと思っています。 – gsamaras

+0

しかし、私は不均衡のために、@AlbertoBonsantoが見つかりました! – gsamaras

答えて

2

# I suppose you are passing an RDD of tuples, where the key is the cluster and the value is a vector with the features. 
def unbalancedFactor(rdd): 
    pdd = rdd.map(lambda x: (x[0], 1)).reduceByKey(lambda a, b: a + b) # you can obtain the number of points per cluster 
    n = pdd.count() 
    total = pdd.map(lambda x: x[1]).sum() 
    uf = pdd.map(lambda x: x[1] * float(x[1])).sum() 

    return uf * n/(total * total) 
+0

作品!したがって、その係数の値が小さいほど(最小値が1)、より良い(すなわち、クラスタが理想的にバランスされる)。同意しますか? – gsamaras

+0

たとえば、すべての重心が1点しか割り当てられない場合、 'uf = 1'を設定します。 1つのクラスタに割り当てられるデータセットの合計ポイントの半分を設定し、他のすべてのポイントを異なるクラスタに割り当てるように設定すると、 'uf = 2'となります。クラスタを1ポイント、別のクラスタを別のポイント、それ以外のポイントをすべて別のクラスタに割り当てると、 'uf = 2' ...うーん...あなたのコードでいくつかのバグを修正しました。 ! :) – gsamaras

+0

私ははいと言うでしょう。しかし、私の経験では、Kmeansはカテゴリ変数を扱うことができないので、期待通りに強力ではなく、有用ではありません。また、次元数が増えると、あなたの結論ははっきりしません。かなり先進的ないくつかの他の選択肢があります(私はこの瞬間に私のものを持っていません)。私はこれまでに働いていませんが、有望です。 –