如何使用Python使用最近邻算法对数据进行分类?

如何使用Python使用最近邻算法对数据进行分类?,python,machine-learning,Python,Machine Learning,我需要用(我希望是)最近邻算法对一些数据进行分类。我用谷歌搜索了这个问题,找到了很多库(包括PyML、mlPy和Orange),但我不确定从哪里开始 我应该如何使用Python实现k-NN?特别是考虑到您在Q中提到的技术(k-近邻),我强烈推荐。[注:在发布此答案后,该项目的首席开发人员通知我该项目有一个解决方案。] 我认为有几个特性将此库与其他库(至少是我使用过的其他Python ML库,其中大部分是这些库)区分开来: 广泛的诊断和测试库(包括绘图) 模块,通过Matplotlib)——包括

我需要用(我希望是)最近邻算法对一些数据进行分类。我用谷歌搜索了这个问题,找到了很多库(包括PyML、mlPy和Orange),但我不确定从哪里开始


我应该如何使用Python实现k-NN?

特别是考虑到您在Q中提到的技术(k-近邻),我强烈推荐。[注:在发布此答案后,该项目的首席开发人员通知我该项目有一个解决方案。]

我认为有几个特性将此库与其他库(至少是我使用过的其他Python ML库,其中大部分是这些库)区分开来:

  • 广泛的诊断和测试库(包括绘图) 模块,通过Matplotlib)——包括特征选择算法, 、ROC、精确召回等

  • “含电池”数据集的不错选择(包括 手写数字、面部图像等),特别适用于ML技术

  • 大量的文档(考虑到这个项目 仅两年左右)包括教程和逐步学习 示例代码(使用提供的数据集)

毫无例外(至少我现在能想到),python ML库是一流的。(关于十几个最流行的python ML库的列表,请参见e。)

例如,在过去的12个月里,我使用了ffnet(用于MLP)、neurolab(也用于MLP)、PyBrain(Q-Learning)、neurolab(MLP)和PyMVPA(SVM)(都可以从中获得)——它们在成熟度、范围和提供的基础设施方面都有很大的不同,但我发现它们都具有非常高的质量

不过,最好的可能是scikits;例如,除了scikits.learn之外,我不知道有任何python ML库包含我上面提到的三个特性中的任何一个(尽管有一些具有可靠的示例代码和/或教程,但据我所知,没有一个将它们与研究级数据集和诊断算法库集成在一起)

其次,考虑到您打算使用的技术(k-最近邻),scikits.learn是一个特别好的选择。Scikits.learn包括(返回分数)和(返回类标签)的kNN算法,以及每个算法的详细示例代码

使用scikits.learn k-最近邻模块(字面意思)再简单不过了:

>>> # import NumPy and the relevant scikits.learn module
>>> import numpy as NP
>>> from sklearn import neighbors as kNN

>>> # load one of the sklearn-suppplied data sets
>>> from sklearn import datasets
>>> iris = datasets.load_iris()
>>> # the call to load_iris() loaded both the data and the class labels, so
>>> # bind each to its own variable
>>> data = iris.data
>>> class_labels = iris.target

>>> # construct a classifier-builder by instantiating the kNN module's primary class
>>> kNN1 = kNN.NeighborsClassifier()

>>> # now construct ('train') the classifier by passing the data and class labels
>>> # to the classifier-builder
>>> kNN1.fit(data, class_labels)
      NeighborsClassifier(n_neighbors=5, leaf_size=20, algorithm='auto')
更重要的是,与几乎所有其他ML技术不同,k-最近邻的关键不是编码一个有效的分类器生成器,而是构建生产级k-最近邻分类器/回归器的困难步骤是持久层——即。,存储和快速检索选择最近邻的数据点。对于kNN数据存储层,scikits.learn包含一个用于球树的算法(我对球树几乎一无所知),它明显优于kd树(k-NN的传统数据结构),因为它的性能在高维特征空间中不会降低

此外,k-最近邻需要适当的相似性度量(欧几里德距离是通常的选择,但并不总是最好的)。Scikits.learn包括一个由各种距离度量组成的备用模块,以及用于选择适当距离度量的测试算法

最后,有几个库我没有提到,或者是因为它们超出了范围(PyML,Bayesian);它们主要不是开发人员的“库”,而是最终用户的应用程序(例如Orange),或者它们有不寻常的或难以安装的依赖项(例如,mlpy,它需要gsl,而gsl又必须从源代码构建)至少对于我的操作系统(即Mac OS X)


(注意:我不是scikits.learn的开发者/提交者。)

感谢您提供如此详细的答案。我可能会从scikit.learn开始。感谢Doug的回答。作为scikit learn的开发人员,我感到非常荣幸。我有几句话大家可能会觉得从长远来看是有用的。首先,从版本0.10开始,导入已从scikit.learn更改为sklearn。其次,是scikit learn正在迁移到@GaelVaroquaux,这非常有用,Gael——我将把编辑我的答案包括在内。(感谢您创建了一个世界级的ML库——正如您可以从我上面的答案中看出的,我显然是一个粉丝。)