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

时间:2011-09-06 22:35:58

标签: python machine-learning

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

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

1 个答案:

答案 0 :(得分:61)

特别是考虑到你在Q中提到的技术(k-Nearest Neighbors),我强烈推荐 scikits.learn 。 [注意:在本答案发布后,本项目的首席开发人员告诉我该项目的new homepage。]

我相信一些功能可以将这个库与其他功能区分开来(至少我使用过的其他Python ML库,其中大部分都是这样):

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

  • 精选的“电池供电”数据集(包括 手写数字,面部图像等)特别适合ML技术;

  • 广泛的文档(鉴于此项目是一个很好的惊喜 只有两年左右),包括教程和一步一步 示例代码(使用提供的数据集);

毫无例外(至少我能想到这一点)python ML库非常棒。 (有关十几个最受欢迎的python ML库的列表,请参阅PyMVPA homepag e。)

例如,在过去的12个月中,我使用了 ffnet (用于MLP), neurolab (也用于MLP), PyBrain ( Q-Learning), neurolab (MLP)和 PyMVPA (SVM)(均可从Python Package Index获得) - 这些因人而异r / t成熟度,范围和提供的基础设施,但我发现它们都具有非常高的质量。

尽管如此,其中最好的可能是 scikits.learn ;例如,我不知道任何python ML库 - 除了scikits.learn - 包括我上面提到的三个功能中的任何一个(虽然有一些具有可靠的示例代码和/或教程,但我不知道集成这些包括研究级数据集和诊断算法库。)

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

使用scikits.learn k-nearest neighbor模块(字面意思)可能不容易:

>>> # 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近邻分类器/回归器的困难步骤是持久层 - -ie,存储和快速检索从中选择最近邻居的数据点。对于kNN数据存储层,scikits.learn包含 球树 的算法(除了显然优于 kd-之外,我几乎一无所知。树(k-NN的传统数据结构),因为它的性能在高维特征空间中不会降低。

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

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

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