Scikit-learn是Python生态中常用的机器学习库,提供了丰富的算法实现和工具函数,其中距离计算和近邻检索是很多推荐、分类场景的基础能力。NearestNeighbors类封装了多种近邻检索算法和距离度量方式,能够高效完成最近邻查询任务。

Scikit-learn支持的距离计算方式
Scikit-learn的近邻相关接口通过metric参数指定距离计算方式,常用的距离类型包括以下几种:
- 欧氏距离:最常用的距离度量,计算两点之间的直线距离,对应
metric='euclidean' - 曼哈顿距离:计算两点在各维度上的绝对距离之和,对应
metric='manhattan' - 余弦距离:衡量两个向量的夹角余弦,常用于文本、特征向量的相似度计算,对应
metric='cosine' - 闵可夫斯基距离:欧氏距离和曼哈顿距离的通用形式,通过
p参数控制距离类型,对应metric='minkowski'
NearestNeighbors核心参数说明
NearestNeighbors类的主要参数决定了检索的效率和结果,常用参数如下:
| 参数名 | 说明 |
|---|---|
| n_neighbors | 指定查询时返回的最近邻数量,默认值为5 |
| radius | 指定半径检索模式下的半径阈值,仅当algorithm为radius_neighbors相关方法时生效 |
| algorithm | 近邻检索算法,可选auto、ball_tree、kd_tree、brute,默认auto会自动选择最优算法 |
| metric | 距离计算方式,默认值为minkowski,可通过该参数切换不同的距离度量 |
| p | 当metric为minkowski时生效,p=1为曼哈顿距离,p=2为欧氏距离 |
使用NearestNeighbors构建检索系统完整流程
1. 准备测试数据
首先生成一批模拟的特征数据,用于后续的检索系统训练和测试:
import numpy as np from sklearn.neighbors import NearestNeighbors # 生成100条3维特征数据,模拟待检索的样本库 np.random.seed(42) sample_data = np.random.rand(100, 3) # 生成1条查询数据 query_data = np.random.rand(1, 3)
2. 初始化并训练NearestNeighbors模型
选择合适的参数初始化模型,然后拟合样本数据,完成检索系统的构建:
# 初始化模型,指定返回3个最近邻,使用余弦距离计算相似度 model = NearestNeighbors(n_neighbors=3, metric='cosine') # 拟合样本数据,构建检索索引 model.fit(sample_data)
3. 执行检索查询
调用模型的查询方法,获取查询数据对应的最近邻结果:
# 执行最近邻查询,返回距离和对应的样本索引
distances, indices = model.kneighbors(query_data)
print("查询数据与最近邻的距离:")
print(distances)
print("最近邻对应的样本索引:")
print(indices)
4. 半径检索模式示例
除了固定数量的最近邻查询,NearestNeighbors还支持半径检索,返回距离小于指定阈值的所有样本:
# 初始化半径检索模型,指定距离为欧氏距离,半径为0.5
radius_model = NearestNeighbors(radius=0.5, metric='euclidean', algorithm='auto')
radius_model.fit(sample_data)
# 执行半径检索
radius_distances, radius_indices = radius_model.radius_neighbors(query_data)
print("半径内的样本距离:")
print(radius_distances)
print("半径内的样本索引:")
print(radius_indices)
注意事项
在实际使用中需要注意以下几点:
- 不同距离度量的适用场景不同,文本类特征优先选择余弦距离,连续数值特征可优先选择欧氏距离
- 样本量较大时,建议优先选择ball_tree或kd_tree算法,提升检索效率
- 检索前可以对特征数据进行归一化处理,避免不同维度量纲差异影响距离计算的结果
NearestNeighbors仅支持无监督的近邻检索,如果需要结合标签信息进行分类或回归预测,可以使用KNeighborsClassifier或KNeighborsRegressor类。
Scikit-learnNearestNeighbors距离计算检索系统修改时间:2026-06-15 17:48:18