2016-12-16 8 views
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을 사용하고 있습니다.

답변

1

tree2d3,i3에 예를 들어 당신이 할당하고 있기 때문에 내 생각은 - 잘못된 라인 :

d3, i3 = tree2.query(point, k=5) 

당신은 아마 의미 :

d3, i3 = tree3.query(point, k=5) 

tree3tree2 변경, 다른 제공 결과는 tree3입니다.

+0

와우. 그거였다. 그것을 알아 줘서 고마워. BallTrees와 wminkowski를 사용하는 방법에 대한 문헌은 거의 없으므로이 게시물을 계속 보관할 것입니다. 앞으로 다른 사람이 올 수도 있습니다. – shahins