我需要计算两个列表之间的余弦相似度,比如列表1,列表2是.我不能使用numpy或统计模块等任何东西.我必须使用通用模块(数学等)(尽可能使用最少的模块,以减少花费的时间).dataSetI
dataSetII
比方说,dataSetI
是[3, 45, 7, 2]
和dataSetII
是[2, 54, 13, 15]
.列表的长度始终相等.
当然,余弦相似度在0和1之间,并且为了它,它将四舍五入到第三或第四个十进制数format(round(cosine, 3))
.
非常感谢您提前帮助.
从Python:tf-idf-cosine:为了找到文档相似性,可以使用tf-idf余弦计算文档相似度.没有导入外部库,是否有任何方法可以计算2个字符串之间的余弦相似度?
s1 = "This is a foo bar sentence ."
s2 = "This sentence is similar to a foo bar sentence ."
s3 = "What is this string ? Totally not related to the other two lines ."
cosine_sim(s1, s2) # Should give high cosine similarity
cosine_sim(s1, s3) # Shouldn't give high cosine similarity value
cosine_sim(s2, s3) # Shouldn't give high cosine similarity value
Run Code Online (Sandbox Code Playgroud) 给定稀疏矩阵列表,计算矩阵中每列(或行)之间的余弦相似度的最佳方法是什么?我宁愿不迭代n次选择两次.
说输入矩阵是:
A=
[0 1 0 0 1
0 0 1 1 1
1 1 0 1 0]
Run Code Online (Sandbox Code Playgroud)
稀疏表示是:
A =
0, 1
0, 4
1, 2
1, 3
1, 4
2, 0
2, 1
2, 3
Run Code Online (Sandbox Code Playgroud)
在Python中,使用矩阵输入格式很简单:
import numpy as np
from sklearn.metrics import pairwise_distances
from scipy.spatial.distance import cosine
A = np.array(
[[0, 1, 0, 0, 1],
[0, 0, 1, 1, 1],
[1, 1, 0, 1, 0]])
dist_out = 1-pairwise_distances(A, metric="cosine")
dist_out
Run Code Online (Sandbox Code Playgroud)
得到:
array([[ 1. , 0.40824829, 0.40824829],
[ …
Run Code Online (Sandbox Code Playgroud) 我对以下关于TF-IDF和Cosine Similarity的评论感到困惑.
我正在读取两个,然后在维基相似性下的维基上我发现这句话"在信息检索的情况下,两个文档的余弦相似度将在0到1的范围内,因为术语频率(tf-idf权重)不能两个术语频率向量之间的角度不能大于90."
现在我想知道......他们不是两件不同的东西吗?
tf-idf已经在余弦相似之内吗?如果是,那么到底是什么 - 我只能看到内点产品和欧几里德长度.
我认为tf-idf是你在文本上运行余弦相似之前可以做的事情.我错过了什么?
我正在使用 HuggingFace Transformers 包来访问预训练模型。由于我的用例需要英语和阿拉伯语的功能,因此我使用了bert-base-multilingual- cased 预训练模型。我需要能够使用诸如余弦相似度之类的东西来比较句子的相似度。要使用它,我首先需要为每个句子获取一个嵌入向量,然后可以计算余弦相似度。
首先,从 BERT 模型中提取语义嵌入的最佳方法是什么?在输入句子后获取模型的最后一个隐藏状态就足够了吗?
import torch
from transformers import BertModel, BertTokenizer
model_class = BertModel
tokenizer_class = BertTokenizer
pretrained_weights = 'bert-base-multilingual-cased'
tokenizer = tokenizer_class.from_pretrained(pretrained_weights)
model = model_class.from_pretrained(pretrained_weights)
sentence = 'this is a test sentence'
input_ids = torch.tensor([tokenizer.encode(sentence, add_special_tokens=True)])
with torch.no_grad():
output_tuple = model(input_ids)
last_hidden_states = output_tuple[0]
print(last_hidden_states.size(), last_hidden_states)
Run Code Online (Sandbox Code Playgroud)
其次,如果这是从我的句子中获得嵌入的充分方法,我现在还有另一个问题,即嵌入向量的长度取决于原始句子的长度。形状输出是[1, n, vocab_size]
,其中n
可以有任何值。
为了计算两个向量的余弦相似度,它们需要具有相同的长度。我怎么能在这里做到这一点?像第一次求和这样幼稚的事情axis=1
还能奏效吗?我还有什么其他选择?
python nlp vector cosine-similarity huggingface-transformers
我有一个N个顶点的图形,其中每个顶点代表一个地方.此外,我有一个向量,每个用户一个,N个系数中的每一个,其中系数的值是在相应位置花费的持续时间(秒),如果没有访问该位置,则为0.
例如图表:
向量:
v1 = {100, 50, 0 30, 0}
Run Code Online (Sandbox Code Playgroud)
意味着我们花了:
100secs at vertex 1
50secs at vertex 2 and
30secs at vertex 4
Run Code Online (Sandbox Code Playgroud)
(未访问的顶点3和5,因此为0).
我想运行k-means聚类,我选择cosine_distance = 1 - cosine_similarity
了距离的度量,其公式为cosine_similarity
:
作为描述在这里.
但我注意到以下情况.假设k=2
其中一个向量是:
v1 = {90,0,0,0,0}
Run Code Online (Sandbox Code Playgroud)
在解决最小化候选质心总距离的优化问题的过程中,假设在某一点上,2个候选质心是:
c1 = {90,90,90,90,90}
c2 = {1000, 1000, 1000, 1000, 1000}
Run Code Online (Sandbox Code Playgroud)
运行cosine_distance
(v1,c1)和(v1,c2)的公式,我们得到0.5527864045
两者的距离完全相同.
我认为v1比c2更接近c1更接近(更接近).显然事实并非如此.
Q1.为什么这个假设错了?
Q2.在这种情况下,余弦距离是否是正确的距离函数?
Q3.考虑到问题的本质,什么会更好?
cluster-analysis distance data-mining k-means cosine-similarity
它看起来像 scipy.spatial.distance.cdist 余弦相似距离:
1 - u*v/(||u||||v||)
Run Code Online (Sandbox Code Playgroud)
与 sklearn.metrics.pairwise.cosine_similarity 不同,后者是
u*v/||u||||v||
Run Code Online (Sandbox Code Playgroud)
有人知道不同定义的原因吗?
对于推荐系统,我需要计算整个Spark DataFrame的所有列之间的余弦相似度.
在熊猫我曾经这样做过:
import sklearn.metrics as metrics
import pandas as pd
df= pd.DataFrame(...some dataframe over here :D ...)
metrics.pairwise.cosine_similarity(df.T,df.T)
Run Code Online (Sandbox Code Playgroud)
这会在列之间生成相似矩阵(因为我使用了转置)
有没有办法在Spark(Python)中做同样的事情?
(我需要将它应用于由数千万行和数千列组成的矩阵,这就是我需要在Spark中执行此操作的原因)
python cosine-similarity apache-spark apache-spark-sql pyspark
我有一个大型数据集,我想集群.我的试运行集大小是2,500个对象; 当我在'真正的交易'上运行时,我将需要处理至少20k的对象.
这些对象之间具有余弦相似性.该余弦相似性不满足作为数学距离度量的要求; 它不满足三角不等式.
我想以一种"自然"的方式将它们聚类在一起,将类似的对象放在一起,而不需要事先指定我期望的簇数.
有谁知道会这样做的算法?真的,我只是在寻找不需要a)距离度量和b)预先指定数量的簇的任何算法.
非常感谢!
这里之前已经提出过这个问题: 从余弦相似度值聚类 (但这个解决方案只提供K均值聚类),这里: 相似度矩阵的有效聚类 (但这个解决方案相当含糊)
cluster-analysis machine-learning distance cosine-similarity
python ×6
data-mining ×2
distance ×2
nlp ×2
similarity ×2
apache-spark ×1
k-means ×1
numpy ×1
pandas ×1
pyspark ×1
python-3.x ×1
scikit-learn ×1
scipy ×1
string ×1
text ×1
tf-idf ×1
vector ×1
vsm ×1