2
저는 BallTree와 그것이 제공하는 다양한 측정 항목을 가지고 놀았습니다. 그러나 나는 wminkowski를 사용할 때, 무게가 결과에 아무런 영향이없는 것 같다sklearn의 BallTree에서 가중치가 적용된 minkowski 메트릭을 사용합니다.
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]]
피쳐와 샘플 그리고 나는 tree3에 의해 반환 된 결과가 다를 것으로 기대하면서 모든 세 개의 트리가 똑같은 출력을 반환 할 때마다. 왜 그런가요? 나는 sklearn 버전 0.18.1을 사용하고 있습니다.
와우. 그거였다. 그것을 알아 줘서 고마워. BallTrees와 wminkowski를 사용하는 방법에 대한 문헌은 거의 없으므로이 게시물을 계속 보관할 것입니다. 앞으로 다른 사람이 올 수도 있습니다. – shahins