鱼C论坛

 找回密码
 立即注册
查看: 1189|回复: 1

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

[复制链接]
发表于 2023-12-10 11:12:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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: '('
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[i])*float(b[i])   # 将字符串转换为浮点数进行计算        mu1 += (float(a[i])**2)        mu2 += (float(b[i])**2)    cos = zi/((mu1**0.5)*(mu2**0.5))    return cos
在myfunc函数中,通过a[i]和b[i]来获取向量a和b的第i个元素,并将其转换为浮点数进行计算。

另外,在计算余弦相似度时,你的循环条件应该是m1和n1,而不是固定的range(N)。修改为如下所示:
for m1 in range(N):   #计算出每两个向量间的余弦相似度    for n1 in range(N):        begin1 = myfunc(ls_xl[m1], ls_xl[n1])   # 将传入myfunc函数的参数改为对应的向量        ls_cos.append(begin1)
最后,在找到最小的余弦相似度对应的两个向量时,你应该用索引来获取对应的向量,并且只打印一次即可。修改为如下所示:
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])   # 打印对应的向量即可            break   # 结束内层循环,因为已经找到了符合条件的最小相似度对应的向量
希望这些修改能够解决你的问题!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-21 19:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表