我正在尝试根据某些功能创建一个特征矩阵,然后找到项目的距离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因为它的内存效率。
问题是什么?
答案 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
参数来调整函数。