sklearn.neighbors.NearestNeighbors
(最近邻搜索)
NearestNeighbors
是 sklearn.neighbors
提供的 最近邻(Nearest Neighbors)搜索算法,它用于 无监督最近邻搜索,适用于 高效地查找最近邻点,常用于 推荐系统、异常检测、聚类等任务。
1. NearestNeighbors
作用
- 用于最近邻搜索(nearest neighbors search),适用于 无监督学习。
- 支持 KD 树(
kd_tree
)、Ball 树(ball_tree
)和暴力搜索(brute
),可根据数据类型选择最佳方法。 - 适用于高维数据,但计算量较大。
2. NearestNeighbors
代码示例
(1) 训练 NearestNeighbors
并查找最近邻
from sklearn.neighbors import NearestNeighbors
import numpy as np
# 生成数据
X = np.random.rand(10, 2) # 10 个二维点
# 训练最近邻模型
model = NearestNeighbors(n_neighbors=3, algorithm="auto", metric="euclidean")
model.fit(X)
# 查找最近邻
distances, indices = model.kneighbors(X[:5]) # 查询前 5 个样本的最近邻
print("前 5 个样本的最近邻索引:\n", indices)
print("对应距离:\n", distances)
解释
n_neighbors=3
:返回 3 个最近邻样本。metric="euclidean"
:使用 欧几里得距离 计算最近邻。kneighbors(X[:5])
:查询前 5 个样本的最近邻索引和对应距离。
3. NearestNeighbors
主要参数
NearestNeighbors(n_neighbors=5, algorithm="auto", metric="minkowski")
参数 | 说明 |
---|---|
n_neighbors | 返回最近邻的数量(默认 5 ,值大时计算量增加) |
algorithm | 最近邻搜索算法(默认 "auto" ,可选 "ball_tree" 、"kd_tree" 、"brute" ) |
metric | 距离度量(默认 "minkowski" ,可选 "euclidean" 、"manhattan" ) |
4. 选择不同的 algorithm
algorithms = ["ball_tree", "kd_tree", "brute", "auto"]
for algo in algorithms:
model = NearestNeighbors(n_neighbors=3, algorithm=algo)
model.fit(X)
distances, indices = model.kneighbors(X[:5])
print(f"算法: {algo}, 最近邻索引:\n", indices)
解释
ball_tree
:适用于低维数据,基于球形分割加速搜索。kd_tree
:适用于中等维度数据,基于二分树加速搜索。brute
:适用于高维数据,直接计算所有点的距离。
5. 计算不同距离度量
dist_metrics = ["euclidean", "manhattan", "chebyshev"]
for metric in dist_metrics:
model = NearestNeighbors(n_neighbors=3, metric=metric)
model.fit(X)
distances, indices = model.kneighbors(X[:5])
print(f"距离度量: {metric}, 最近邻索引:\n", indices)
解释
euclidean
(欧几里得距离):标准度量(p=2
)。manhattan
(曼哈顿距离):适用于格子状数据(p=1
)。chebyshev
(切比雪夫距离):适用于最大坐标差影响较大的数据。
6. kneighbors_graph()
获取最近邻图
from sklearn.neighbors import kneighbors_graph
# 计算最近邻图(邻接矩阵)
A = kneighbors_graph(X, n_neighbors=3, mode="connectivity").toarray()
print("最近邻图(邻接矩阵):\n", A)
解释
kneighbors_graph(X, n_neighbors=3, mode="connectivity")
生成 邻接矩阵。mode="distance"
返回 距离矩阵。
7. NearestNeighbors
vs. KNeighborsClassifier
vs. KNeighborsRegressor
模型 | 适用情况 | 主要区别 |
---|---|---|
NearestNeighbors | 无监督最近邻搜索 | 用于最近邻查询 |
KNeighborsClassifier | 分类任务 | 基于最近邻投票分类 |
KNeighborsRegressor | 回归任务 | 基于最近邻均值回归 |
示例
from sklearn.neighbors import KNeighborsClassifier
knn_model = KNeighborsClassifier(n_neighbors=3)
knn_model.fit(X, np.random.randint(0, 2, size=len(X))) # 生成随机标签
print("KNN 分类器最近邻预测:", knn_model.predict(X[:5]))
解释
KNeighborsClassifier
用于分类,NearestNeighbors
仅用于最近邻搜索。
8. 适用场景
- 最近邻搜索(如 推荐系统、数据索引)。
- 无监督学习,查找相似样本。
- 聚类分析前的相似度计算。
9. 结论
NearestNeighbors
适用于无监督最近邻搜索任务,支持多种搜索算法和距离度量,可以 调整n_neighbors
和metric
控制搜索精度。