KNN算法实现过程以及每一步的代码实现
时间: 2024-03-08 13:04:28 浏览: 66
KNN(K-Nearest Neighbors)算法是一种基于实例的学习方法,它的基本思想是在训练集中寻找与测试样本最相近的k个样本,然后将这k个样本中出现次数最多的样本标记为测试样本的类别。
下面是KNN算法的实现步骤及每一步的代码实现:
1. 计算测试样本与训练集中每个样本的距离,一般常用欧式距离或曼哈顿距离等:
```python
import numpy as np
def euclidean_distance(x1, x2):
"""
计算两个向量之间的欧式距离
x1, x2: 两个向量
"""
return np.sqrt(np.sum((x1 - x2) ** 2))
def manhattan_distance(x1, x2):
"""
计算两个向量之间的曼哈顿距离
x1, x2: 两个向量
"""
return np.sum(np.abs(x1 - x2))
```
2. 对距离的计算结果进行排序,找出距离最近的k个样本:
```python
def get_k_nearest_neighbors(X_train, x_test, k, distance_metric):
"""
获取距离测试样本最近的k个训练样本
X_train: 训练集
x_test: 测试样本
k: k值
distance_metric: 距离度量方式
"""
distances = []
for i in range(len(X_train)):
dist = distance_metric(X_train[i], x_test)
distances.append((i, dist))
distances = sorted(distances, key=lambda x: x[1])
neighbors = []
for i in range(k):
neighbors.append(distances[i][0])
return neighbors
```
3. 统计k个样本中各类别出现的次数,将出现次数最多的类别作为测试样本的类别:
```python
def predict(X_train, y_train, x_test, k, distance_metric):
"""
对测试样本进行预测
X_train: 训练集
y_train: 训练集对应的标签
x_test: 测试样本
k: k值
distance_metric: 距离度量方式
"""
neighbors = get_k_nearest_neighbors(X_train, x_test, k, distance_metric)
label_counts = {}
for i in neighbors:
label = y_train[i]
label_counts[label] = label_counts.get(label, 0) + 1
sorted_label_counts = sorted(label_counts.items(), key=lambda x: x[1], reverse=True)
return sorted_label_counts[0][0]
```
以上就是KNN算法的实现过程及每一步的代码实现。
阅读全文
相关推荐















