Orig 发表于 2023-12-10 11:12:30

python代码问题,求人工解答!非常感谢!!!

余弦相似度算法:一个向量空间中两个向量夹角间的余弦值作为衡量两个个体之间差异的大小,余弦值接近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)   #找到传入向量的维度


def myfunc(a, b):   #定义计算余弦相似度的函数
    mu1, mu2, zi, cos = 0, 0, 0, 0
    for i in range(D):
      zi += float(a)*float(b)
      mu1 += (float(a)**2)
      mu2 += (float(b)**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), tuple(ls_xl))
      ls_cos.append(begin1)
      
cos_min = min(ls_cos)   #找到最小的余弦相似度

for m2 in range(N):   #找到最小的余弦相似度对应的两个向量
    for n2 in range(N):
      begin2 = myfunc(ls_xl, ls_xl)
      if begin2 == cos_min:
            print(ls_xl, ls_xl)


问题在于我已经把每个向量改为了元组形式而不是字符串,但是运行时还是显示:
    zi += float(a)*float(b)
          ^^^^^^^^^^^
ValueError: could not convert string to float: '('

FishC 发表于 2023-12-10 11:12:56

这个错误是因为你在计算余弦相似度时,将向量的元素当作字符串进行了计算,而不是将其转换为浮点数进行计算。你需要修改一下代码中的myfunc函数。具体修改如下:

def myfunc(a, b):   #定义计算余弦相似度的函数
    mu1, mu2, zi, cos = 0, 0, 0, 0
    for i in range(D):
      zi += float(a)*float(b)   # 将字符串转换为浮点数进行计算
      mu1 += (float(a)**2)
      mu2 += (float(b)**2)
    cos = zi/((mu1**0.5)*(mu2**0.5))
    return cos

在myfunc函数中,通过a和b来获取向量a和b的第i个元素,并将其转换为浮点数进行计算。

另外,在计算余弦相似度时,你的循环条件应该是m1和n1,而不是固定的range(N)。修改为如下所示:

for m1 in range(N):   #计算出每两个向量间的余弦相似度
    for n1 in range(N):
      begin1 = myfunc(ls_xl, ls_xl)   # 将传入myfunc函数的参数改为对应的向量
      ls_cos.append(begin1)

最后,在找到最小的余弦相似度对应的两个向量时,你应该用索引来获取对应的向量,并且只打印一次即可。修改为如下所示:

for m2 in range(N):
    for n2 in range(N):
      begin2 = myfunc(ls_xl, ls_xl)
      if begin2 == cos_min:
            print(ls_xl, ls_xl)   # 打印对应的向量即可
            break   # 结束内层循环,因为已经找到了符合条件的最小相似度对应的向量

希望这些修改能够解决你的问题!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: python代码问题,求人工解答!非常感谢!!!