Python minkowski距离forumla的环路故障
我为Minkowski距离编写的代码不会存储任何值。我做错了什么/错过了什么?用户是字典对象,Veronica只是字典中的一个成员Python minkowski距离forumla的环路故障,python,loops,python-3.x,Python,Loops,Python 3.x,我为Minkowski距离编写的代码不会存储任何值。我做错了什么/错过了什么?用户是字典对象,Veronica只是字典中的一个成员 ##not working,not storing values always returns -1 def minkowski(r,rating1,rating2): distance = 0 commonRatings = False for band in rating1: if band i
##not working,not storing values always returns -1
def minkowski(r,rating1,rating2):
distance = 0
commonRatings = False
for band in rating1:
if band in rating2:
distance += abs((rating1[band]-rating2[band])* r) * 1/r
commonRatings = True
if commonRatings:
return distance
else:
return -1
print(minkowski(2,"Veronica",users))
这个函数工作得很好。r有个问题。无论出于何种原因,当涉及r时,函数只返回-1。即使将r值更改为平方版本,也只返回-1
#manhattan function
def sum_manhattan(rating1,rating2):
total = 0
commonRatings = False
for band in rating1:
if band in rating2:
total += abs(rating1[band]-rating2[band])
commonRatings = True
if commonRatings:
return total
else:
return -1
你的功能有很多问题 主要是,最后的
if
语句的缩进是可疑的。如前所述,此循环保证在循环的第一次通过时退出:
for band in rating1:
if band in rating2:
distance += abs((rating1[band]-rating2[band])* r) * 1/r
commonRatings = True
if commonRatings:
return distance
else:
return -1
评估初始if
语句后,commonRatings
要么是True
,要么是False
。然后第二个if
语句在循环内,两个分支都包含return
语句
因此,您将永远无法进入循环的第二个过程
将函数重写为
def minkowski(r,rating1,rating2):
distance = 0
commonRatings = False
for band in rating1:
if band in rating2:
distance += abs((rating1[band]-rating2[band])* r) * 1/r
commonRatings = True
if commonRatings:
return distance
else:
return -1
你应该得到非常不同的结果
接下来,当两个参数都是字符串时,rating[band]-rating2[band]
的值是多少
最后,对距离的计算进行了讨论
abs((a - b) * r) / r
相乘然后除以r
有什么意义,除非将r
的符号应用于结果
为了测试修改后的代码,我定义了如图所示(使用修改后的缩进),然后调用它:
In [4]: minkowski(2,{"A" : 1 }, {"B": 2, "A": 4})
Out[4]: 3
更新:
r
之谜已经解开。根据维基百科,你需要做:
distance += abs(rating1[band] - rating2[band]) ** r
然后返回
distance ** (1.0/r)
也就是说,在循环中需要求幂而不是乘法,然后返回r
th根
最后更新:
对于这样定义的功能:
def minkowski(r,rating1,rating2):
distance = 0
commonRatings = False
for band in rating1:
if band in rating2:
distance += abs(rating1[band]-rating2[band]) ** r
commonRatings = True
if commonRatings:
return distance ** (1.0/r)
else:
return -1
我在Python3.4中得到了以下内容
In [1]: minkowski(2,{"A" : 1 }, {"B": 2, "A": 4})
Out[1]: 3.0
In [2]: minkowski(2,{"A" : 1, "B": 4 }, {"B": 2, "A": 4})
Out[2]: 3.605551275463989
In [3]: minkowski(4,{"A" : 1, "B": 4 }, {"B": 2, "A": 4})
Out[3]: 3.138288992714996
In [4]: minkowski(1,{"A" : 1, "B": 4 }, {"B": 2, "A": 4})
Out[4]: 5.0
“用户”是什么样子的。“if band in rating2”似乎总是错误的。
对于等级1中的band:
遍历等级1中的每个字母,在本例中,该字母是“Veronica”
。我怀疑你想要的是什么?用户是一本大字典,里面有很多小字典。有所有用户名的主词典。在每个用户名中都有另一个字典,其中包含他们所评定的级别。如果您的示例传入了两个示例字典,这将非常有用。无论如何,缩进的问题是另一个问题……“if band in rating2:”不会递归地检查特定字符串的所有子字典。如果有嵌套结构,则必须在适当的级别应用逻辑。同样,即使是一个小样本输入也会有帮助。该函数仍然返回-1 rating[band]不是字符串。波段是字符串,但它们包含数值评级。如果没有指定r值,代码工作得非常好。如果我们在函数参数中取r,只取额定值1和额定值2,然后取abs值,那么我们得到所有的距离。代码在这方面起作用,并不完全可怕。但是,当我将参数r和r值添加到function中时,它突然只返回-1。您现在是否使用合理的数据调用它?它需要两个dict
s。你要交什么?我要交两本字典,据我所知,是为我写的。。查看我的最新编辑。您使用的是哪个python版本?