sklearn:最近邻搜索sklearn.neighbors

http://blog.csdn.net/pipisorry/article/details/53156836

ball tree

k-d tree也有问题[最近邻查找算法kd-tree]。矩形并不是用到这里最好的方式。偏斜的数据集会造成我们想要保持树的平衡与保持区域的正方形特性的冲突。另外,矩形甚至是正方形并不是用在这里最完美的形状,由于它的角。如果图6中的圆再大一些,即黑点距离目标点点再远一些,圆就会与左上角的矩形相交,需要多检查一个区域的点,而且那个区域是当前区域双亲结点的兄弟结点的子结点。为了解决上面的问题,我们引入了ball tree。

ball tree

解决上面问题的方案就是使用超球面而不是超矩形划分区域。使用球面可能会造成球面间的重叠,但却没有关系。ball tree就是一个k维超球面来覆盖这些观测点,把它们放到树里面。图7(a)显示了一个2维平面包含16个观测实例的图,图7(b)是其对应的ball tree,其中结点中的数字表示包含的观测点数。

图 7  ball tree对二维平面的划分和ball tree

不同层次的圆被用不同的风格画出。树中的每个结点对应一个圆,结点的数字表示该区域保含的观测点数,但不一定就是图中该区域囊括的点数,因为有重叠的情况,并且一个观测点只能属于一个区域。实际的ball tree的结点保存圆心和半径。叶子结点保存它包含的观测点。
    使用ball tree时,先自上而下找到包含target的叶子结点,从此结点中找到离它最近的观测点。这个距离就是最近邻的距离的上界。检查它的兄弟结点中是否包含比这个上界更小的观测点。方法是:如果目标点距离兄弟结点的圆心的距离大于这个圆的圆心加上前面的上界的值,则这个兄弟结点不可能包含所要的观测点。(如图8)否则,检查这个兄弟结点是否包含符合条件的观测点。

图 8 点与超圆
    那么,ball tree的分割算法是什么呢?
    选择一个距离当前圆心最远的观测点i1,和距离i1最远的观测点 i2,将圆中所有离这两个点最近的观测点都赋给这两个簇的中心,然后计算每一个簇的中心点和包含所有其所属观测点的最小半径。对包含n个观测点的超圆进行分割,只需要线性的时间。
    与k-d tree一样,如果结点包含的观测点到达了预先设定的最小值,这个顶点就可以不再分割了。

[【机器学习】K-means聚类算法初探]

kdtree和balltree的区别和联系

个人见解,
kd-tree基于欧氏距离的特性:
balltree基于更一般的距离特性:
因此:
kd-tree只能用于欧氏距离,并且处理高维数据效果不佳。
balltree在kd-tree能够处理的数据范围内要慢于kd-tree。

皮皮blog

sklearn中使用kdtree和balltree

这个库的tree实现不太好,输入的数据会转换成ndarray,输出也是ndarray,这样就没办法传递附加数据了。。。也是烦人。。。

参数训练

KDTree(X, leaf_size=40, metric=’minkowski’, **kwargs)

BallTree(X, leaf_size=40, metric=’minkowski’, **kwargs)

参数解释

X : array-like, shape = [n_samples, n_features] 但也可以是dataframe类型(只要输入原始df数据的float类型的列(或者提前转换成)就可以)

leaf_size : positive integer (default = 40)
改变leaf_size不会改变查询结果,但是会显著影响查询速度(其实应该也包含训练速度吧)和存储内存。The amount of memory needed to store the tree scales as approximately n_samples / leaf_size.

metric : string or DistanceMetric object 用于树的距离度量:the distance metric to use for the tree. Default=’minkowski’with p=2 (that is, a euclidean metric). See the documentationof the DistanceMetric class for a list of available metrics.ball_tree.valid_metrics gives a list of the metrics whichare valid for BallTree.

查看可用的度量方法

from sklearn import neighbors

neighbors.KDTree.valid_metrics

[‘chebyshev‘,
 ‘manhattan‘,
 ‘infinity‘,
 ‘p‘,
 ‘l1‘,
 ‘cityblock‘,
 ‘euclidean‘,
 ‘minkowski‘,
 ‘l2‘]

[sklearn距离度量函数[sklearn.neighbors.DistanceMetric?]

近邻查找

query(X[, k, return_distance, dualtree, ...]) query the tree for the k nearest neighbors
query_radius query_radius(self, X, r, count_only = False)

query查询时返回的是距离和下标,下标对应的是输入的原始数据的下标,所以原始数据可以附加很多字段(只是不输入到树的构建数据中)就可以了。

query

dist, inds = loc_kdtree.query(l_array[0].reshape(1, -1), k=5)

query返回值是距离(这里的数值就是metrics计算出来的那个数值)和samples的下标。

Note: 要注意的是index返回的是一个二维数组,第个一维数组元素对应的是一个查询的近邻结果。所以如果训练数据直接调用l_array[inds]返回的是一个三维数组,只查询一个二维数据的近邻时应该使用l_array[inds[0]]。

i : array of integers - shape: x.shape[:-1] + (k,). each entry gives the list of indices ofneighbors of the corresponding point.

query_radius半径查找

默认只返回index:ind = tree.query_radius(X[0], r=0.3)

count : if count_only == True

ind : if count_only == False and return_distance == False

(ind, dist) : if count_only == False and return_distance == True. 注意返回顺序还和query还不一样。。。

count : array of integers, shape = X.shape[:-1]  each entry gives the number of neighbors withina distance r of the corresponding point.

其它参数及其含义

# variables to keep track of building & querying stats
    cdef int n_trims
    cdef int n_leaves
    cdef int n_splits
    cdef int n_calls

def get_tree_stats(self):
        return (self.n_trims, self.n_leaves, self.n_splits)

def reset_n_calls(self):
        self.n_calls = 0

def get_n_calls(self):
        return self.n_calls

def get_arrays(self):
        return (self.data_arr, self.idx_array_arr,
self.node_data_arr, self.node_bounds_arr)

[scikit-learn/sklearn/neighbors/binary_tree.pxi]

皮皮blog

kdtree实现时的错误

还有一个坑就是sklearn版本问题,本地错误解决,放到服务器上远程跑还是出错,发现从0.18升级到0.18.1就不会报错了,也是醉了。。。

ValueError: metric PyFuncDistance is not valid for KDTree

The ball tree works with any of the following distance metrics, which match those found in the module scipy.spatial.distance:[‘euclidean‘, ‘minkowski‘, ‘manhattan‘, ‘chebyshev‘,  ‘seuclidean‘, ‘mahalanobis‘, ‘wminkowski‘, ‘hamming‘,  ‘canberra‘, ‘braycurtis‘, ‘matching‘, ‘jaccard‘,  ‘dice‘, ‘kulsinski‘, ‘rogerstanimoto‘, ‘russellrao‘,  ‘sokalmichener‘, ‘sokalsneath‘, ‘haversine‘]
Alternatively, the user can specify a callable Python function to act as the distance metric. While this will be quite a bit slower than using one of the optimized metrics above, it adds nice flexibility.
    The kd-tree works with only the first four of the above metrics. This limitation is primarily because the distance bounds are less efficiently calculated for metrics which are not axis-aligned.

[Benchmarking Nearest Neighbor Searches in Python]

直接将metric写成一个函数会出错,因为metric参数接受的类型为:string or DistanceMetric object

loc_kdtree = neighbors.KDTree(l_array, metric=lambda i, j: distance.vincenty(tuple(i), tuple(j)).miles)

if callable(metric):
            if algorithm == ‘kd_tree‘:
                # callable metric is only valid for brute force and ball_tree
                raise ValueError(
                    "kd_tree algorithm does not support callable metric ‘%s‘" % metric)
        elif metric not in VALID_METRICS[alg_check]:
            raise ValueError("Metric ‘%s‘ not valid for algorithm ‘%s‘" % (metric, algorithm))

ValueError: func must be a callable taking two arrays

[Sklearn kNN usage with a user defined metric]

[Sklearn kNN usage with a user defined metric (again)]

[Sklearn kNN usage with a user defined metric]

TypeError: __init__() takes exactly 1 positional argument (0 given)

参数是func=lambda不是pyfunc=lambda

loc_kdtree = neighbors.KDTree(l_array, metric=‘pyfunc‘, func=lambda i, j: distance.vincenty(i, j).miles)

或者loc_kdtree = neighbors.KDTree(l_array, metric=neighbors.DistanceMetric.get_metric(‘pyfunc‘,func=lambda i, j: distance.vincenty(i, j).miles))

sklearn Deprecation Warning

Deprecation Warning: Passing 1d arrays as data is deprecated in 0.17 and will raise ValueError in 0.19

出错问题:

分类器分类预测时:clf.predict([1, 1])

最近邻查询时:kdtree.query(l_array[0])...

原因:输入的预测或者查询不是二维的而是一维的

解决:改成二维的:clf.predict([[1, 1]]), kdtree.query([l_array[0]])

Note: 这个warning有点坑啊,应该可以通过修复sklearn代码解决吧。

[Getting deprecation warning in Sklearn over 1d array, despite not having a 1D array]

皮皮blog

最近邻查找的应用

[Is a kd-tree suitable for 4D space-time data (x,y,z,time)?]

[Datetime as a dimension in python KDTree]

from: http://blog.csdn.net/pipisorry/article/details/53156836

ref: [scikit-learn modules 1.6. Nearest Neighbors]

[scikit-learn/sklearn/neighbors/]

时间: 2024-09-30 14:43:14

sklearn:最近邻搜索sklearn.neighbors的相关文章

OpenCV Machine Learning 之 K最近邻分类器 K-Nearest Neighbors

K-Nearest Neighbors 该算法存储所有的训练样本(已知标签),然后通过分析新给的样本(标签未知)与已知标签的训练样本的相似度,选出其中的K个最相似的训练样本进行投票得到新样本的标签,并计算加权和等. 该方法有时被称为是"learning by example",因为他总是根据新样本的特征向量与已知标签的样本特征向量的相似度来判断新样本的类别. CvKNearest class CvKNearest : public CvStatModel 该类实现了 K-Nearest

快速近似最近邻搜索库 FLANN - Fast Library for Approximate Nearest Neighbors

What is FLANN? FLANN is a library for performing fast approximate nearest neighbor searches in high dimensional spaces. It contains a collection of algorithms we found to work best for nearest neighbor search and a system for automatically choosing t

sklearn系列之 sklearn.svm.SVC详解

首先我们应该对SVM的参数有一个详细的认知: sklearn.svm.SVC 参数说明: 本身这个函数也是基于libsvm实现的,所以在参数设置上有很多相似的地方.(PS: libsvm中的二次规划问题的解决算法是SMO). sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3, gamma='auto', coef0=0.0, shrinking=True, probability=False, tol=0.001, cache_size=200, cla

LSH︱python实现局部敏感随机投影森林——LSHForest/sklearn(一)

关于局部敏感哈希算法,之前用R语言实现过,但是由于在R中效能太低,于是放弃用LSH来做相似性检索.学了python发现很多模块都能实现,而且通过随机投影森林让查询数据更快,觉得可以试试大规模应用在数据相似性检索+去重的场景. 私认为,文本的相似性可以分为两类:一类是机械相似性:一类是语义相似性. 机械相似性代表着,两个文本内容上的相关程度,比如"你好吗"和"你好"的相似性,纯粹代表着内容上字符是否完全共现,应用场景在:文章去重: 语义相似性代表着,两个文本语义上的相

sklearn库调用k近邻算法

python实现KNN算法的全体流程代码#1-1KNN算法的原理底层代码import numpy as npimport matplotlib.pyplot as plt #导入相应的数据可视化模块raw_data_X=[[3.393533211,2.331273381], [3.110073483,1.781539638], [1.343808831,3.368360954], [3.582294042,4.679179110], [2.280362439,2.866990263], [7.4

[转]使用sklearn进行集成学习——理论

转:http://www.cnblogs.com/jasonfreak/p/5657196.html 目录 1 前言2 集成学习是什么?3 偏差和方差 3.1 模型的偏差和方差是什么? 3.2 bagging的偏差和方差 3.3 boosting的偏差和方差 3.4 模型的独立性 3.5 小结4 Gradient Boosting 4.1 拟合残差 4.2 拟合反向梯度 4.2.1 契机:引入损失函数 4.2.2 难题一:任意损失函数的最优化 4.2.3 难题二:无法对测试样本计算反向梯度 4.

SK-Learn 全家福

SK-Learn API 全家福 最近SK-Learn用的比较多, 以后也会经常用,将Sk-Learn 所有内容整理了一下,整理思路,并可以备查. (高清图片可以用鼠标右键在单独窗口打开,或者保存到本地) 基础公用 base sklearn.cluster sklearn.datasets Loaders Samples generator sklearn.exceptions sklearn.pipeline sklearn.utils 方法工艺 sklearn.cluster classes

机器学习之sklearn数据集

数据集划分 机器学习一般的数据集会划分为两个部分: 训练数据:用于训练,构建模型 测试数据:在模型检验时使用,用于评估模型是否有效 sklearn数据集划分API sklearn.model_selection.train_test_split x 数据集的特征值 y 数据集的标签值 test_size 测试集的大小,一般为float random_state 随机数种子,不同的种子会造成不同的随机采样结果.相同的种子采样结果相同. return 训练集特征值,测试集特征值,训练标签,测试标签(

python库之——sklearn

机器学习库sklearn 官方documentation(资料)中分为不同的部分: 其中我们主要讲User Guide(机器学习算法理论介绍).API(程序实现方法): 一.User Guide https://scikit-learn.org/stable/user_guide.html 模块 说明 Supervised learning监督学习 监督学习的各种算法介绍 Unsupervised learning非监督学习 非监督学习的各种算法介绍 Model selection and ev