在 sklearn 的 BallTree 中使用加权 minkowski 度量
Using weighted minkowski metric in sklearn's BallTree
我一直在研究 BallTree 及其提供的不同指标。但是,当我使用 wminkowski 时,权重似乎对结果没有任何影响:
df = pd.DataFrame()
num_features = 4
num_samples = 100
for i in range(num_features):
df['A_%s'%(i+1)] = np.random.rand(num_samples)
df['A_%s'%(i+1)] = df['A_%s'%(i+1)].apply(lambda x: 500 - (1000 * x ** 3))
point = np.array([int(1000 * r ** 3) for r in np.random.rand(num_features)]).reshape(1, -1)
weights = [int(10000 * r ** 2) for r in np.random.rand(num_features)]
tree1 = sklearn.neighbors.BallTree(df, metric='minkowski')
tree2 = sklearn.neighbors.BallTree(df, metric='wminkowski', p=2, w=[1] * num_features) # Should be just like tree1
tree3 = sklearn.neighbors.BallTree(df, metric='wminkowski', p=2, w=weights)
d1, i1 = tree1.query(point, k=5)
d2, i2 = tree2.query(point, k=5)
d3, i3 = tree2.query(point, k=5)
print 'Point:'
print point
print 'Weights:'
print weights
print 'Distances:'
print d1
print d2
print d3
print 'Indices:'
print i1
print i2
print i3
输出为:
Point:
[[ 16 58 0 884]]
Weights:
[2869, 46, 1558, 5835]
Distances:
[[ 451.55203926 537.61234492 601.29840519 601.74059138 647.46934474]]
[[ 451.55203926 537.61234492 601.29840519 601.74059138 647.46934474]]
[[ 451.55203926 537.61234492 601.29840519 601.74059138 647.46934474]]
Indices:
[[61 31 86 43 93]]
[[61 31 86 43 93]]
[[61 31 86 43 93]]
我已经尝试 运行 上面的代码具有不同数量的特征和样本,我每次都将所有三棵树 return 完全相同的输出,而我期望输出 return 由 tree3 编辑是不同的。这是为什么?我正在使用 sklearn 版本 0.18.1.
我的猜测是因为在示例中您将 tree2
分配给 d3,i3
-- 有问题的行:
d3, i3 = tree2.query(point, k=5)
当你的意思可能是:
d3, i3 = tree3.query(point, k=5)
将 tree2
更改为 tree3
,在 tree3
中提供了不同的结果。
我一直在研究 BallTree 及其提供的不同指标。但是,当我使用 wminkowski 时,权重似乎对结果没有任何影响:
df = pd.DataFrame()
num_features = 4
num_samples = 100
for i in range(num_features):
df['A_%s'%(i+1)] = np.random.rand(num_samples)
df['A_%s'%(i+1)] = df['A_%s'%(i+1)].apply(lambda x: 500 - (1000 * x ** 3))
point = np.array([int(1000 * r ** 3) for r in np.random.rand(num_features)]).reshape(1, -1)
weights = [int(10000 * r ** 2) for r in np.random.rand(num_features)]
tree1 = sklearn.neighbors.BallTree(df, metric='minkowski')
tree2 = sklearn.neighbors.BallTree(df, metric='wminkowski', p=2, w=[1] * num_features) # Should be just like tree1
tree3 = sklearn.neighbors.BallTree(df, metric='wminkowski', p=2, w=weights)
d1, i1 = tree1.query(point, k=5)
d2, i2 = tree2.query(point, k=5)
d3, i3 = tree2.query(point, k=5)
print 'Point:'
print point
print 'Weights:'
print weights
print 'Distances:'
print d1
print d2
print d3
print 'Indices:'
print i1
print i2
print i3
输出为:
Point:
[[ 16 58 0 884]]
Weights:
[2869, 46, 1558, 5835]
Distances:
[[ 451.55203926 537.61234492 601.29840519 601.74059138 647.46934474]]
[[ 451.55203926 537.61234492 601.29840519 601.74059138 647.46934474]]
[[ 451.55203926 537.61234492 601.29840519 601.74059138 647.46934474]]
Indices:
[[61 31 86 43 93]]
[[61 31 86 43 93]]
[[61 31 86 43 93]]
我已经尝试 运行 上面的代码具有不同数量的特征和样本,我每次都将所有三棵树 return 完全相同的输出,而我期望输出 return 由 tree3 编辑是不同的。这是为什么?我正在使用 sklearn 版本 0.18.1.
我的猜测是因为在示例中您将 tree2
分配给 d3,i3
-- 有问题的行:
d3, i3 = tree2.query(point, k=5)
当你的意思可能是:
d3, i3 = tree3.query(point, k=5)
将 tree2
更改为 tree3
,在 tree3
中提供了不同的结果。