我有一个大数据集和它们之间的余弦相似度。我想使用余弦相似度对它们进行聚类,将相似的对象放在一起,而无需事先指定我期望的聚类数量。
我阅读了 DBSCAN 和 Affinity Propagation 的 sklearn 文档,它们都需要距离矩阵(不是余弦相似度矩阵)。
真的,我只是在寻找不需要a) 距离度量和 b) 预先指定数量的集群的任何算法。
有谁知道可以做到这一点的算法?
我有一个大数据集和它们之间的余弦相似度。我想使用余弦相似度对它们进行聚类,将相似的对象放在一起,而无需事先指定我期望的聚类数量。
我阅读了 DBSCAN 和 Affinity Propagation 的 sklearn 文档,它们都需要距离矩阵(不是余弦相似度矩阵)。
真的,我只是在寻找不需要a) 距离度量和 b) 预先指定数量的集群的任何算法。
有谁知道可以做到这一点的算法?
首先,每个聚类算法都使用某种距离度量。这实际上很重要,因为每个指标都有自己的属性,并且适用于不同类型的问题。
你说你的记录之间有余弦相似度,所以这实际上是一个距离矩阵。您可以将此矩阵用作某些聚类算法的输入。
现在,我建议从层次聚类开始 - 它不需要定义数量的聚类,您可以输入数据并选择距离,或输入距离矩阵(以某种方式计算距离)。
请注意,层次聚类的计算成本很高,因此如果您有大量数据,则可以从样本开始。
我会使用 sklearn 的分层聚类
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
from scipy.cluster import hierarchy
#Vectorizing
X = CountVectorizer().fit_transform(docs)
X = TfidfTransformer().fit_transform(X)
#Clustering
X = X.todense()
threshold = 0.1
Z = hierarchy.linkage(X,"average", metric="cosine")
C = hierarchy.fcluster(Z, threshold, criterion="distance")
C
是您对文档的聚类docs
。
您可以使用其他指标代替cosine
,并使用不同的阈值0.1
DBSCAN可以用相似性度量而不是距离来轻松实现。您只需要将 <= epsilon 更改为 >= epsilon。
如果您交换“min”和“max”(您希望以最大相似性而不是最小相似性合并距离)。
如果你懒惰,你也可以将你的相似度转化为距离。如果你有一个固定的最大值, dist=max-sim 通常会这样做。
我认为clustMixType包可能会给你更好的结果/见解。
通过使用这个包,您可以直接使用分类和数字数据的组合,它不需要任何类型的热编码。
您只需要输入数据,它就会自动分离为分类数据和数值数据,如果您在分离时发现任何问题,您可以使用 和 之类的as.factor(to convert to a categorical)
函数as.numeric(to convert to a Numeric field)
。
您可以Lambda(mean Distance value)
事先计算并作为算法的输入输入。
如果您不知道最佳聚类数,可以使用WSS(within Sum of Squares)
,plot(elbow chart)
来确定最佳聚类数。