Как применить булеву матричную факторизацию к задачам кластеризации? - PullRequest
0 голосов
/ 16 января 2020

Постановка проблемы и реализация: У меня есть логическая матрица, которая содержит данные о пользователях и элементах. Если пользователь купил элемент, то значение равно 1, если нет, то 0. У меня около 10 000 пользователей (строк) и 20 000 элементов (столбцов). Мне нужно сгруппировать похожих пользователей, которые купили похожие товары. Я реализовал это в K-режимах. Но силуэт меньше. То есть пользователи недостаточно сгруппированы.

Рекомендуемое решение: Итак, я рекомендовал использовать Булеву матричную факторизацию (BMF), потому что k-means / mode можно использовать только в том случае, если кластеры имеют выпуклые формы и каждая точка принадлежит ровно один кластер. BMF может вычислять кластеры с перекрытием (возможно, это не обязательно важно для вашего приложения), но он также определяет функции, которые важны для создания одного кластера вместе с точками данных, принадлежащими одному кластеру. Особенно, если у вас есть пространство пространственных объектов большого размера, маловероятно, что сходство между точками будет выражено во всем пространстве объектов. BMF определяет пространство объектов, в котором точки образуют кластер.

Вопрос: Я использовал пакеты BMF из python. Но я не уверен, как поступить с результатами алгоритма. Может ли кто-нибудь подсказать, как я могу приступить к формированию кластеров, назвать кластеры и проверить, какие пользователи в каком кластере используют булеву матричную факторизацию?

Реализация K-режимов

#method 1: CAO initialisation, with clusters 2
km_cao = KModes(n_clusters=2, init = "Cao", n_init = 1, verbose=1)
fitClusters_cao = km_cao.fit_predict(pivot_table)
fitClusters_cao

clusterCentroidsDf = pd.DataFrame(km_cao.cluster_centroids_)
clusterCentroidsDf.columns = pivot_table.columns
clusterCentroidsDf

#method 2: Huang initialization, with clusters 2
km_huang = KModes(n_clusters=2, init = "Huang", n_init = 1, verbose=1)
fitClusters_huang = km_huang.fit_predict(pivot_table)
fitClusters_huang

Булева матрица Факторизация, пробованная до сих пор Pivot_table имеет булеву матрицу.

def __fact_factor(X):
    """
    Return dense factorization factor, so that output is printed nice if factor is sparse.

    :param X: Factorization factor.
    :type X: :class:`scipy.sparse` of format csr, csc, coo, bsr, dok, lil, dia or :class:`numpy.matrix`
    """
    return X.todense() if sp.isspmatrix(X) else X


bmf = nimfa.Bmf(pivot_table.values, seed="nndsvd", rank=10, max_iter=12, initialize_only=True, lambda_w=1.1, lambda_h=1.1)
bmf_fit = bmf()

print("=================================================================================================")
print("Factorization method:", bmf_fit.fit)
print("Initialization method:", bmf_fit.fit.seed)
print("Basis matrix W: ")
print(__fact_factor(bmf_fit.basis()))
print("Actual number of iterations: ", bmf_fit.summary('none')['n_iter'])
# We can access sparseness measure directly through fitted model.
# fit.fit.sparseness()
print("Sparseness basis: %7.4f, Sparseness mixture: %7.4f" % (bmf_fit.summary('none')['sparseness'][0], bmf_fit.summary('none')['sparseness'][1]))
# We can access explained variance directly through fitted model.
# fit.fit.evar()
print("Explained variance: ", bmf_fit.summary('none')['evar'])
# We can access residual sum of squares directly through fitted model.
# fit.fit.rss()
print("Residual sum of squares: ", bmf_fit.summary('none')['rss'])
# There are many more ... but just cannot print out everything =] and some measures need additional data or more runs
# e.g. entropy, predict, purity, coph_cor, consensus, select_features, score_features, connectivity
print("=================================================================================================")

Выход для вышеуказанного кода:

=================================================================================================
Factorization method: bmf
Initialization method: nndsvd
Basis matrix W: 
[[1.66625229e+00 1.39154537e+00 1.49951683e+00 1.28801329e+00
  1.30824274e+00 1.49929241e+00 1.49805989e+00 1.45501586e+00
  1.46423781e+00 1.46044597e+00]
 [1.39418572e-03 1.56074288e+00 1.63243924e+00 1.32752612e+00
  1.33121227e+00 1.36615553e+00 1.40162330e+00 1.33175641e+00
  1.35845014e+00 1.37581247e+00].......
.....
Actual number of iterations:  12
Sparseness basis:  0.1438, Sparseness mixture:  0.2611
Explained variance:  0.7680056334943757
Residual sum of squares:  1426.7653540095896


...