写一份wknn的python代码
时间: 2023-07-10 15:40:47 浏览: 43
以下是一个简单的加权kNN的Python代码示例:
```python
import numpy as np
from scipy.spatial.distance import euclidean
def weighted_knn(X_train, y_train, X_test, k=5):
y_pred = []
for x_test in X_test:
# 计算测试样本与所有训练样本之间的距离
distances = [euclidean(x_test, x_train) for x_train in X_train]
# 找到距离最近的k个训练样本的索引
k_idx = np.argsort(distances)[:k]
# 计算每个邻居的权重(距离越近,权重越大)
weights = [1 / d for d in distances[k_idx]]
# 对所有邻居的权重进行归一化
weights /= np.sum(weights)
# 使用加权平均来预测目标值
y_pred.append(np.dot(weights, y_train[k_idx]))
return y_pred
```
在这个代码中,我们使用了NumPy和SciPy库来处理数组和计算距离。`weighted_knn`函数接受训练数据`X_train`和`y_train`,以及测试数据`X_test`,并返回一个包含预测目标值的列表`y_pred`。我们默认使用5个邻居进行预测,但是可以通过将k参数传递给函数来更改这个值。
在函数内部,我们首先循环遍历所有测试样本,并计算它们与所有训练样本之间的距离。我们使用SciPy库中的`euclidean`函数来计算欧几里得距离,但是也可以使用其他距离度量。
接下来,我们找到距离最近的k个训练样本的索引,并计算每个邻居的权重。在这个例子中,我们简单地使用距离的倒数作为权重,但是也可以使用其他函数来计算权重。
最后,我们对所有邻居的权重进行归一化,并使用加权平均来预测目标值。