如何基于K近邻计算平均值?
我想写一个函数,用来根据最近的K个邻居(这里K=2)来计算一个平均的'z'值。我已经有了这些邻居的索引,但能不能帮我写一个函数,来计算所有邻居的平均z值呢?
这是我目前的代码:
from sklearn.neighbors import NearestNeighbors
X = array([[6,-3, 0.1], [-5,-9, 0.5], [3,-7, 0.8], [-10,6, 0.5], [-4,-16, 0.9], [1,-0.5, 0]])
# X is an array containing x,y,z values
# nbrs reads in the x,y values only
nbrs = NearestNeighbors(n_neighbors=2).fit(X)
distances, indices = nbrs.kneighbors(X)
print(indices)
# psuedocode below
[[0, index for neighbor1, index for neighbor2]
[1, index for neighbor1, index for neighbor2]
[2, index for neighbor1, index for neighbor2]
[3, index for neighbor1, index for neighbor2]
......
# etc. for all 6 points in X
]
现在我有了这些索引,我想计算所有邻居的平均z值。虽然这里只有2个邻居,所以计算起来很简单,但如果我们把邻居的数量改成50个,能不能帮我把这个方法扩展一下呢?
2 个回答
0
如果你想根据最近邻居的值来预测一个连续的数值,可以使用KNeighborsRegressor来解决这个问题。
举个例子:
import numpy as np
from sklearn.neighbors import KNeighborsRegressor
X = np.array([[6,-3, 0.1], [-5,-9, 0.5], [3,-7, 0.8], [-10,6, 0.5], [-4,-16, 0.9], [1,-0.5, 0]])
neigh = KNeighborsRegressor(n_neighbors=2, weights='uniform')
neigh.fit(X[:, :2], X[:, 2])
neigh.predict([[4, -7]])
因为你是想计算所有邻居的平均值,所以我用了 weights='uniform'
。另外一种选择是 weights='distance'
,这个选项会让离得更近的邻居在计算时更重要。
0
要找出每个点在X中邻居的平均z
值,你可以这样做:
all_z_pairs = [[X[index][2] for index in row] for row in indices]
mean_values = [sum(z_pair)/len(z_pair) for z_pair in all_z_pairs]
X[index]
代表每一个邻居,而X[index][2]
就是这个邻居的z值。所以,all_z_pairs就是每个点所有邻居的z值集合。
sum(z_pair)/len(z_pair)
用来计算平均值。为了让这个过程更容易理解,你也可以这样做:
from statistics import mean
...
mean_values = [mean(z_pair) for z_pair in all_z_pairs]
如果这样写能让你更明白,可以把all_z_pairs的计算改成下面的形式。
for row in indices:
for index in row:
all_z_pairs.append(X[index][2])
索引列表中每一行对应X中的一个点。每一行基本上就是该点的所有邻居。所以,第一组列表是在遍历所有邻居的集合,而第二组列表则是在遍历每一个邻居。