【scikit-learn】sklearn.neighbors.NearestNeighbors 类:最近邻搜索

sklearn.neighbors.NearestNeighbors(最近邻搜索)

NearestNeighborssklearn.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_neighborsmetric 控制搜索精度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彬彬侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值