我为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 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
答案 0 :(得分:0)
您的功能存在许多问题。
主要是,最终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
根。
最终更新:
使用这样定义的函数:
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
我在Python 3.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