2016-08-30 3 views
3

Edit: Ответ эти вопросы сильно обсуждается в: Sum in Spark gone badНесбалансированный коэффициент KMeans?


В Compute Cost of Kmeans, мы увидели, как можно вычислить стоимость его модели 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.

Так идея заключается в том, что tot (для всего) будет равно числу точек, назначенных для кластеров (т.е. равен размеру нашего набора данных), в то время как uf (для несбалансированного фактора) имеет квадрат числа точек, назначенных кластеру.

И, наконец, он использует uf = uf * n/(tot * tot);, чтобы вычислить его.

+0

Не могли бы вы показать ссылку о том, что является фактором баланса? –

+0

@AlbertoBonsanto - это то, сколько точек у каждого центроида есть, т. Е. После присвоения точек набора данных центроидам (с помощью 'прогноза(), я думаю), вычислите коэффициент, который будет указывать, сбалансированы ли данные по центроидам. Интересно, что я не могу найти хорошую ссылку, но вы поняли, что правильно? Если у меня есть 2 центроида и 100 очков назначены на 1-й центроид, а 10 на 2-й, то коэффициент баланса должен быть плохим. Если 1-й имеет 60 пунктов и 2-й 50, то коэффициент баланса должен быть. Поэтому в основном хотелось бы подсчитать #points, которым присваивается каждый centroid – gsamaras

+0

Но я нашел для неуравновешенного @AlbertoBonsanto, обновленный! – gsamaras

ответ

2

В python это может быть что-то вроде:

# 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'. Если я установил половину всех точек набора данных, которые будут назначены одному кластеру, и все остальные точки, которые должны быть назначены для разных кластеров, тогда 'uf = 2'. Если я назначу кластеру одной точке, другой кластер - другой точке, а все остальные - другому кластеру, тогда 'uf = 2' ... Хм ... Я исправил некоторые ошибки в вашем коде, как вы уже должны были видеть ! :) – gsamaras

+0

Я бы сказал, да. Однако, по моему опыту, Kmeans не так силен/полезен, как вы ожидали, потому что он не может обрабатывать категориальные переменные, и когда число измерений увеличивается, выводы, которые вы получаете, не столь ясны. Есть и другие альтернативы (в настоящий момент у меня их нет в моем классе), которые довольно продвинуты, и я не работал, но они кажутся многообещающими. –

Смежные вопросы