我想编写一个函数来根据 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 个邻居,有人可以帮助我扩大规模吗?
要找到 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 中的每个点都有一行。一行基本上是该点的所有邻居。因此,第一个列表在所有邻居集合上循环,第二个列表在每个邻居集合上循环。