首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >K-意思是使用从minhash生成的签名矩阵。

K-意思是使用从minhash生成的签名矩阵。
EN

Stack Overflow用户
提问于 2017-10-21 19:17:00
回答 1查看 1.5K关注 0票数 4

我在文档和它们的标签上使用min散列来从这些文档生成签名矩阵。我已经证实,签名矩阵很好地比较了已知的类似文档的jaccard距离(例如,两篇关于同一运动队的文章或两篇关于同一世界事件的文章)给出了正确的读数。

我的问题是:使用这个签名矩阵来执行k均值聚类有意义吗?

我尝试过使用文档的签名向量,并在迭代的kmeans算法中计算这些向量的欧几里德距离,而我的集群总是没有意义。我知道应该有两个集群(我的数据集是几千篇关于体育或商业的文章),最后,我的两个集群总是随机的。我确信,散列成整数的随机性每次都会使距离函数倾斜,并在两个签名矩阵中覆盖类似的散列值。

编辑以突出显示问题

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-10 13:46:18

TL;DR

简短的回答:不,使用签名矩阵进行K-均值聚类是没有意义的。至少在没有重大操纵的情况下。

一些解释

经过几天的研究,我要自己做同样的事情(文本聚类)。我可能错了,但我的看法是,您犯了我曾经犯过的错误:使用MinHash构建[n_samples x n_perms]矩阵,然后使用它作为运行k-方法的功能矩阵X

我猜你在做这样的事:

代码语言:javascript
复制
# THIS CODE IS AN EXAMPLE OF WRONG! DON'T IMPLEMENT!
import numpy as np
import MinHash
from sklearn.cluster import KMeans
# Get your data. 
data = get_your_list_of_strings_to_cluster()
n_samples = len(data)
# Minhash all the strings
n_perms = 128
minhash_values = np.zeros((n_samples, n_perms), dtype='uint64')
minhashes = []
for index, string in enumerate(data):
    minhash = MinHash(num_perm=n_perms)
    for gram in ngrams(string, 3):
         minhash.update("".join(gram).encode('utf-8'))
     minhash_values[index, :] = minhash.hashvalues
# Compute clusters
clusterer = KMeans(n_clusters=8)
clusters = clusterer.fit_predict(minhash_values)

这将导致可怕的行为,因为这是一个致命的缺陷-- minhash_values数组是而不是,是一个功能矩阵。每一行基本上都是显示在文本示例中的特性(散列)列表.但是它们不是列对齐的,所以特征被分散到错误的维度。

要将其转换为功能矩阵,您必须查看minhash_values中的所有惟一散列,然后创建一个矩阵,即[n_samples x n_unique_hashes],(n_unique_hashes是找到的唯一特性的数量),将其设置为文本示例包含该特性的1,其他地方的0。通常,这个矩阵将是大的和稀疏的。然后你可以在上面聚在一起。

文本聚类的替代方法

不过,真是令人难以置信的麻烦!幸运的是,scikit-learn在那里提供帮助。它提供了一些非常易于使用和可伸缩的向量器

所以你的问题很容易解决:

代码语言:javascript
复制
# Imports
from sklearn.feature_extraction.text import HashingVectorizer
from sklearn.cluster import KMeans

# Get your data
data = get_your_list_of_strings_to_cluster()

# Get your feature matrix
text_features = HashingVectorizer(analyzer="word").fit_transform(data)

# Compute clusters
clusterer = KMeans(n_clusters=2)
clusters = clusterer.fit_predict(text_features)

然后就到了。从那里:

  • 微调您的向量(也尝试TfidfVectorizer,调整输入参数,等等),
  • 试试其他的聚类器(f/ex我发现哈伯斯坦里程比kmeans更好--更快、更健壮、更精确、更少调谐)。

希望这能有所帮助。

汤姆

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46867085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档