与minkowski距离forumla循环麻烦

时间:2015-11-10 00:04:17

标签: 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 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 

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语句后,commonRatingsTrueFalse。然后第二个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