|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
余弦相似度算法:一个向量空间中两个向量夹角间的余弦值作为衡量两个个体之间差异的大小,余弦值接近1,夹角趋于0,表明两个向量越相似,余弦值接近于0,夹角趋于90度,表明两个向量越不相似。
题目:用户输入N个D维向量(A1,A2,...,AD),(B1,B2,...,BD)...。
利用余弦相似度计算公式,分别计算N个向量之间得两两距离,并找出相似度最小的两个。
公式为:(ΣD(Ai+Bi))/((ΣD(Ai)*ΣD(Bi))^1/2), (i的取值为1到D)
以下是我的代码:
ls_xl = [] #用来存储输入的向量的列表
ls_cos = [] #用来存储算出的cos值的列表
N = 0 #计数传入向量的个数
while True:
xl = list(input("请输入一个D维向量:(重复至输入n后停止输入)")) #输入向量并转为列表形式
if xl == ["n"]:
break
else:
ls_xl.append(xl) #以一整个列表作为元素加入至ls_xl列表中
N += 1
D = len(ls_xl[0]) #找到传入向量的维度
def myfunc(a, b): #定义计算余弦相似度的函数
mu1, mu2, zi, cos = 0, 0, 0, 0
for i in range(D):
zi += float(a[i])*float(b[i])
mu1 += (float(a[i])**2)
mu2 += (float(b[i])**2)
cos = zi/((mu1**0.5)*(mu2**0.5))
return cos
for m1 in range(N): #计算出每两个向量间的余弦相似度
for n1 in range(N):
begin1 = myfunc(tuple(ls_xl[m1]), tuple(ls_xl[n1]))
ls_cos.append(begin1)
cos_min = min(ls_cos) #找到最小的余弦相似度
for m2 in range(N): #找到最小的余弦相似度对应的两个向量
for n2 in range(N):
begin2 = myfunc(ls_xl[m2], ls_xl[n2])
if begin2 == cos_min:
print(ls_xl[m2], ls_xl[n2])
问题在于我已经把每个向量改为了元组形式而不是字符串,但是运行时还是显示:
zi += float(a[i])*float(b[i])
^^^^^^^^^^^
ValueError: could not convert string to float: '(' |
|