两个字符串之间的 sklearn cosine_distances 取决于总数据集的大小?

Posted

技术标签:

【中文标题】两个字符串之间的 sklearn cosine_distances 取决于总数据集的大小?【英文标题】:sklearn cosine_distances between two strings varies depending on size of total data set? 【发布时间】:2018-05-01 17:11:21 【问题描述】:

我正在尝试使用 DBSCAN 对一堆字符串进行聚类,并在进行 TfidfVectorizer 转换后使用 cosine_distances 作为度量。假设我有两个字符串。当它们只是这两个字符串时,它们之间的 cosine_distance(使用 sklearn.metrics.pairwise.cosine_distance 计算)与它们是更大数据集(具有许多其他字符串)的一部分时它们之间的距离不同。

为什么会发生这种情况?如何确保任意两个字符串之间的距离相同,而不管它们所属的数据集的大小如何?

这样,我的 DBSCAN 就可以可靠地进行聚类了!

编辑:按要求添加示例代码:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_distances

X = [
    'this is a string',
    'this was a string'
    ]

Y = [
    'this could be a string',
    'this may be a string'
    ]

Z = [
    'this is a string',
    'this was a string',
    'this could be a string',
    'this may be a string'
    ]

for d in [X, Y, Z]:
    tv = TfidfVectorizer()
    print(cosine_distances(tv.fit_transform(d)))

输出:

[[ 0.          0.49689739]
 [ 0.49689739  0.        ]]

[[ 0.          0.39702518]
 [ 0.39702518  0.        ]]

[[ 0.          0.64740127  0.70225689  0.70225689]
 [ 0.64740127  0.          0.70225689  0.70225689]
 [ 0.70225689  0.70225689  0.          0.46163155]
 [ 0.70225689  0.70225689  0.46163155  0.        ]]

正如您在此处看到的,this is a stringthis was a string 之间的距离在数据集X 中为0.497,但在数据集Z 中为0.647。数据集中YZ 中的字符串this could be a stringthis may be a string 相同

在上面的例子中,如果我选择 DBSCAN 的最大距离 (eps) 参数为 0.6,那么在数据集 X 中,两个字符串将放在同一个簇中,但在数据集 Z 中,它们将放在不同的簇中.

【问题讨论】:

请添加示例/代码,让您的目标更明确 【参考方案1】:

余弦相似度适用于长文档

短字符串没有足够的单词。

距离的变化是由于 TFIDF 的 IDF 部分。您选择了逆文档频率加权,因此如果文档频率发生变化,距离也会发生变化。

【讨论】:

aw snap.. 完全正确!我不知道为什么我没有想到。在那种情况下,处理我的要求的正确方法是什么?我应该使用什么? 我不知道。这取决于您的数据以及您需要解决的任务。您的数据可能不是this is a string 我可能需要使用 CountVectorizer 而不是 TfIdf 来使距离不受文档频率的影响。会考虑的。谢谢。

以上是关于两个字符串之间的 sklearn cosine_distances 取决于总数据集的大小?的主要内容,如果未能解决你的问题,请参考以下文章

使用 sklearn 计算两个不同列的单独 tfidf 分数

sklearn DecisionTreeClassifier 中 min_samples_split 和 min_samples_leaf 之间的区别

是否可以在内存映射文件中存储python对象(特别是sklearn模型)?

sklearn中的pairwise_distance

为啥 sklearn.cluster.AgglomerativeClustering 不给我们合并集群之间的距离?

sklearn中带有词袋和附加情感特征的文本分类器