两个字符串之间的 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 string
和this was a string
之间的距离在数据集X
中为0.497
,但在数据集Z
中为0.647
。数据集中Y
和Z
中的字符串this could be a string
和this 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模型)?