极稀疏数据的聚类算法

机器算法验证 聚类 算法 k-均值
2022-04-01 14:11:44

我正在尝试对一个极其稀疏的文本语料库进行聚类,并且我知道聚类的数量(我的数据是科学出版物的标题和作者列表,我已经知道类别的数量)。

我的语料库中的每个条目都有 5 到 20 个特征;整个语料库有 80000 个样本和 5000-120000 个特征(我可以过滤掉一些很少出现的特征,或者那些非常频繁出现的特征)。如您所见,数据非常稀疏。

我试图通过创建数据的 TF-IDF 矩阵并在其上运行k均值来识别集群。该算法完全失败,即它将超过 99% 的数据放在同一个集群中。我在这两个步骤中都使用 Python scikit-learn。这是一些示例代码(关于实际工作的数据),以防它对某人有所帮助:

    from sklearn.cluster import KMeans 
    from sklearn.feature_extraction.text import TfidfVectorizer
    vectorizer = TfidfVectorizer()
    data = ['aa ab','aa ab','ac a_b','ac a_b','bc ba', 'bc ba', 'ba bc'] 
    vectorized = vectorizer.fit_transform(data)
    km = KMeans(n_clusters=3, init='random', n_init=1, verbose=1)
    km.fit(vectorized)
    print km.labels_

    [1 1 0 0 2 2 2]

我的问题是:对于这个问题,有没有更好的替代 TF-IDF 的方法,然后是k方法?开始在我的 TF-IDF 数据上寻找不同的距离度量(例如余弦相似度)是否有意义,或者我是否会因为缺乏数据而失败?谢谢!

1个回答

对于文本向量,有众所周知的相似性——余弦,以及在 Lucene 中用于文本检索的变体。

然而,k-means 可能不合适。因为计算的均值不会具有实际的稀疏性,但会更加密集。

无论如何,文本存在一些 k-means 变体,例如球形 k-means。您可能想尝试 CLUTO,它似乎是一种更流行的文本聚类工具。

层次聚类也可能是一个不错的选择。但它不能扩展到大型数据集,因为通常的实现是O(n3). 对于 80000 个文档,这将需要相当长的时间。