Постановка проблемы и реализация: У меня есть логическая матрица, которая содержит данные о пользователях и элементах. Если пользователь купил элемент, то значение равно 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