ninaly中linalg.norm的不同结果

时间:2016-03-19 00:51:49

标签: python numpy matrix feature-extraction euclidean-distance

我正在尝试根据某些功能创建一个特征矩阵,然后找到项目的距离b / w。 出于测试目的,我现在只使用2分。

数据:我有的项目清单

specs:项目的特征字典(我使用它们的键值作为项目的特征)

功能:功能列表

这是我的代码,使用numpy零矩阵:

import numpy as np
matrix = np.zeros((len(data),len(features)),dtype=bool)
for dataindex,item in enumerate(data):
    if dataindex > 5:
    break
specs = item['specs']
values = [value.lower() for value in specs.values()]
for idx,feature in enumerate(features):
    if(feature in values):
        matrix[dataindex,idx] = 1
        print dataindex,idx
v1 = matrix[0]
v2 = matrix[1]
# print v1.shape
diff = v2 - v1
dist = np.linalg.norm(diff)
print dist

我得到的dist的值是1.0

这是我使用python列表的代码:

matrix = []
for dataindex,item in enumerate(data):
    if dataindex > 5:
        f = open("Matrix.txt",'w')
        f.write(str(matrix))
        f.close()
        break
    print "Item" + str(dataindex)
    row = []
    specs = item['specs']
    values = [value.lower() for value in specs.values()]
    for idx,feature in enumerate(features):
        if(feature in values):
            print dataindex,idx
            row.append(1)
        else:
            row.append(0)
    matrix.append(row)

v1 = np.array(matrix[0]);
v2 = np.array(matrix[1]);
diff = v2 - v1
print diff
dist = np.linalg.norm(diff)
print dist

在这种情况下,dist的值是4.35889894354

我已经检查了很多次在两种情况下将值1设置在相同的位置,但答案是不同的。

可能是我没有正确使用numpy或逻辑存在问题。 我使用numpy zero based matrix因为它的内存效率。

问题是什么?

1 个答案:

答案 0 :(得分:0)

这是一个类型问题:

In [9]: norm(ones(3).astype(bool))
Out[9]: 1.0

In [10]: norm(ones(3).astype(float))
Out[10]: 1.7320508075688772

您必须确定问题的正常范围,并最终使用astype投放数据。

norm(M)sqrt(dot(M.ravel(),M.ravel())),因此对于布尔矩阵,如果norm(M)M矩阵,False为0, 否则使用ord norm参数来调整函数。