Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python minkowski距离forumla的环路故障_Python_Loops_Python 3.x - Fatal编程技术网

Python minkowski距离forumla的环路故障

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

我为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 

你的功能有很多问题

主要是,最后的
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版本?