AI人工智能 寻找最近邻
若要构建推荐系统(如电影推荐系统、商品推荐系统),就需要掌握寻找最近邻的核心概念——推荐系统的底层逻辑正是基于最近邻算法实现的。
(一)核心概念
寻找最近邻,指从给定数据集中找到与输入数据点距离最近的点的过程。K近邻(KNN)算法是该概念的核心应用,其最主要的用途是构建分类系统,即根据输入数据点与各类别中数据点的邻近程度,对该点进行分类。
(二)Python实现寻找K近邻
以下代码实现从给定数据集中找到指定测试点的K个最近邻,并通过可视化展示结果:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import NearestNeighbors
## 定义输入数据集(二维)
A = np.array([[3.1,2.3],[2.3,4.2],[3.9,3.5],[3.7,6.4],
[4.8,1.9],[8.3,3.1],[5.2,7.5],[4.8,4.7],
[3.5,5.1],[4.4,2.9]])
## 指定寻找的最近邻数量K
k = 3
## 定义测试数据点
test_data = [3.3,2.9]
## 可视化原始输入数据
plt.figure()
plt.title('Input data')
plt.scatter(A[:, 0], A[:, 1], marker='o', s=100, color='black')
plt.show()
## 初始化并训练K近邻模型,算法自动选择最优方式
knn_model = NearestNeighbors(n_neighbors=k, algorithm='auto').fit(A)
## 计算测试点到各数据点的距离,返回距离与对应索引
distances, indices = knn_model.kneighbors([test_data])
## 打印K个最近邻(按距离由近到远排序)
print("\nK Nearest Neighbors:")
for rank, index in enumerate(indices[0][:k], start=1):
print(str(rank) + " is", A[index])
## 可视化K近邻结果,标注测试点与最近邻
plt.figure()
plt.title('Nearest neighbors')
plt.scatter(A[:, 0], A[:, 1], marker='o', s=100, color='k')
## 绘制测试点(红色)
plt.scatter(test_data[0], test_data[1], marker='x', s=200, color='red')
## 绘制K个最近邻(蓝色)
plt.scatter(A[indices][0][:,0], A[indices][0][:,1], marker='o', s=200, color='blue', alpha=0.5)
plt.show()


代码输出示例:
K Nearest Neighbors:
1 is [3.1 2.3]
2 is [4.4 2.9]
3 is [3.9 3.5]
可视化结果中,红色叉号为测试点,蓝色圆点为其3个最近邻,黑色圆点为数据集中其他点。