我需要使用(希望是)最近邻算法对一些数据进行分类。我在谷歌上搜索了这个问题,发现了很多库(包括PyML、mlPy和Orange),但我不确定从哪里开始。
我应该如何使用Python实现k-NN算法?
回答:
鉴于您在问题中提到的技术(k-最近邻),我强烈推荐使用scikit.learn。[注意:在发布此回答后,该项目的首席开发者告知我该项目有一个新主页。]
我认为该库与其他库(至少是我使用过的其他Python机器学习库,大部分都是如此)有几个显著的特点:
-
一个广泛的诊断和测试库(包括通过Matplotlib的绘图模块)——包括特征选择算法,混淆矩阵、ROC、精确-召回等;
-
一系列不错的“开箱即用”的数据集(包括手写数字、面部图像等),特别适合机器学习技术;
-
广泛的文档(考虑到这个项目只有大约两年的历史,这是一个令人愉快的惊喜),包括教程和逐步的示例代码(使用提供的数据集);
毫无例外(至少我目前能想到的),Python的机器学习库都非常出色。(请参见PyMVPA主页,了解十几个最受欢迎的Python机器学习库的列表。)
例如,在过去的12个月中,我使用过ffnet(用于MLP)、neurolab(也用于MLP)、PyBrain(Q学习)、neurolab(MLP)和PyMVPA(SVM)(所有这些都可以在Python包索引中找到)——这些库在成熟度、范围和提供的基础设施方面差异显著,但我发现它们质量都很高。
尽管如此,这些库中最好的可能是scikit.learn;例如,我不知道除了scikit.learn之外的任何Python机器学习库包含我上面提到的三个功能中的任何一个(虽然一些库有很好的示例代码和/或教程,但我所知道的没有一个将这些与研究级数据集和诊断算法的库集成)。
其次,考虑到您打算使用的技术(k-最近邻),scikit.learn是一个特别好的选择。Scikit.learn包括用于回归(返回一个分数)和分类(返回一个类标签)的kNN算法,以及每个算法的详细示例代码。
使用scikit.learn的k-最近邻模块(字面上)再简单不过了:
>>> # 导入NumPy和相关的scikit.learn模块>>> import numpy as NP>>> from sklearn import neighbors as kNN>>> # 加载scikit.learn提供的一个数据集>>> from sklearn import datasets>>> iris = datasets.load_iris()>>> # load_iris()调用加载了数据和类标签,所以>>> # 将每个绑定到自己的变量>>> data = iris.data>>> class_labels = iris.target>>> # 通过实例化kNN模块的主要类来构建分类器构建器>>> kNN1 = kNN.NeighborsClassifier()>>> # 现在通过将数据和类标签传递给分类器构建器来构建(训练)分类器>>> kNN1.fit(data, class_labels) NeighborsClassifier(n_neighbors=5, leaf_size=20, algorithm='auto')
更重要的是,与几乎所有其他机器学习技术不同,k-最近邻的关键不在于编写一个工作的分类器构建器,而是在构建生产级k-最近邻分类器/回归器时,困难的步骤在于持久层——即,存储和快速检索从中选择最近邻的数据点。对于kNN数据存储层,scikit.learn包括一个用于球树的算法(除了它显然优于kd树(k-NN的传统数据结构)之外,我对它几乎一无所知,因为它的性能在高维特征空间中不会下降)。
此外,k-最近邻需要一个合适的相似性度量(通常选择欧几里得距离,尽管不总是最好的选择)。Scikit.learn包括一个由各种距离度量组成的独立模块,以及用于选择适当度量的测试算法。
最后,还有一些我没有提到的库,要么是因为它们超出了范围(PyML,贝叶斯);它们不是主要为开发者设计的“库”,而是为最终用户设计的应用程序(例如,Orange),或者它们有不寻常或难以安装的依赖项(例如,mlpy,需要gsl,而gsl又必须从源代码构建)至少对于我的操作系统Mac OS X来说是这样。
(注意:我不是scikit.learn的开发者/提交者。)