前言
1、学习neighbors.kneighbors_graph的distance (mode)的原理
2、neighbors.kneighbors_graph API参数的调试和运用
一、实操
1.API参数介绍
链接: 学习,借鉴参考原文.
sklearn.neighbors.kneighbors_graph(X, n_neighbors, *,mode=‘connectivity’, metric=‘minkowski’, p=2, metric_params=None, include_self=False, n_jobs=None)
Xarray-like of shape (n_samples, n_features) or BallTree样本数据:,以numpy数组或预先计算的 BallTree 的形式。
==n_neighborsint:==每个样本的邻居数量。
mode{‘connectivity’, ‘distance’}: default=’connectivity’ 返回矩阵的类型:‘connectivity’将返回具有1和0的连通性矩阵,而’distance’将根据给定的度量返回邻居之间的距离。
metricstr:, default=’minkowski’:用于计算每个采样点的k邻居的距离度量。DistanceMetric类提供了可用指标的列表。默认距离为’euclidean’(p参数等于2。)当p=1时,相当于使用manhattan_distance (l1)
metric_paramsdict: default=None,计量函数的附加关键字参数。
include_selfbool or ‘auto’: default=False,是否将每个样本标记为其自身的第一个最近邻居。如果为’auto’,则将True用于mode =‘connectivity’,将False用于mode =‘distance’。
n_jobsint: default=None,为邻居搜索运行的并行作业数。 None 意味着 1 除非在 joblib.parallel_backend 上下文中。 -1 表示使用所有处理器。有关更多详细信息,请参阅词汇表。
import numpy as np
from sklearn.neighbors import kneighbors_graph
x= np.array([[0, 1], [1.01, 1.], [2, 0]])
y=[[0],[3],[1]]
connect_dis_T=kneighbors_graph(x,2,include_self=True,mode="distance")
connect_dis_F=kneighbors_graph(x,2,include_self=False,mode="distance")
connect_con_T=kneighbors_graph(x,2,include_self=True,mode="connectivity")
connect_con_F=kneighbors_graph(x,2,include_self=False,mode="connectivity")
connect_1_dis=kneighbors_graph(y,2,mode="distance",include_self=True)
connect_1_con=kneighbors_graph(y,2,mode="connectivity",include_self=True)
print("include_self=True时,包含在n_neighbors参数中")
print("计算距离,根据n_neighbors参数,如果小于样本数,只计算该参数范围内的最近样本之间的距离,较远的样本距离直接为0")
print("找到两个最近样本(其中一个是自身),输出距离值,",connect_dis_T.toarray())
print("找到两个最近样本(不包括自身),输出距离值,",connect_dis_F.toarray())
print("权重只有0或1,也需要根据n_neighbors参数,若参数=样本数,则所有样本都是1,0表示最远,1表示最近")
print("找到两个最近样本(其中一个是自身),输出相邻样本权重,",connect_con_T.toarray())
print("找到两个最近样本(不包括自身),输出相邻样本权重,,",connect_con_F.toarray())
print("特征是1的数据(即只有1列),根据n_neighbor计算距离值,超出则直接为0",connect_1_dis.toarray())
print("特征是1的数据(即只有1列),根据n_neighbor计算权重值,超出则直接为0",connect_1_con.toarray())
###########################输出结果:
include_self=True时,包含在n_neighbors参数中
计算距离,根据n_neighbors参数,如果小于样本数,只计算该参数范围内的最近样本之间的距离,较远的样本距离直接为0
找到两个最近样本(其中一个是自身),输出距离值, [[0. 1.01 0. ]
[1.01 0. 0. ]
[0. 1.40716026 0. ]]
找到两个最近样本(不包括自身),输出距离值, [[0. 1.01 2.23606798]
[1.01 0. 1.40716026]
[2.23606798 1.40716026 0. ]]
权重只有0或1,也需要根据n_neighbors参数,若参数=样本数,则所有样本都是1,0表示最远,1表示最近
找到两个最近样本(其中一个是自身),输出相邻样本权重, [[1. 1. 0.]
[1. 1. 0.]
[0. 1. 1.]]
找到两个最近样本(不包括自身),输出相邻样本权重,, [[0. 1. 1.]
[1. 0. 1.]
[1. 1. 0.]]
特征是1的数据(即只有1列),根据n_neighbor计算距离值,超出则直接为0 [[0. 0. 1.]
[0. 0. 2.]
[1. 0. 0.]]
特征是1的数据(即只有1列),根据n_neighbor计算权重值,超出则直接为0 [[1. 0. 1.]
[0. 1. 1.]
[1. 0. 1.]]
Process finished with exit code 0
二、基本原理
1、只有一个特征(只有一列)
2、特征>=2(两列以上数据)
总结
有时候超出所需样本需求时,距离或权重直接赋值为0,有助于减少内存和计算量