如何基于K近邻计算平均值?

0 投票
2 回答
58 浏览
提问于 2025-04-14 17:50

我想写一个函数,用来根据最近的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中的一个点。每一行基本上就是该点的所有邻居。所以,第一组列表是在遍历所有邻居的集合,而第二组列表则是在遍历每一个邻居。

撰写回答