介绍
定义
在模式识别领域中,最近邻居法(k-Nearest Neighbors algorithm,KNN算法,又译K-近邻算法)是一种用于分类和回归的非参数统计方法。
起源
TODO
优点
- 简单,易于理解,易于实现,无需估计参数,无需训练;
- 适合对稀有事件进行分类;
- 特别适合于多分类问题(multi-modal,对象具有多个类别标签)。
缺点
- 主要的不足:当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。 该算法只计算“最近的”邻居样本,某一类的样本数量很大,那么或者这类样本并不接近目标样本,或者这类样本很靠近目标样本。无论怎样,数量并不能影响运行结果。
- 计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。
- 可理解性差,无法给出像决策树那样的规则。
应用领域
文本分类,聚类分析,数据挖掘,机器学习,预测分析,减少维度,模式识别,图像处理
相关
然而k最近邻居法因为计算量相当的大,所以相当的耗时,Ko与Seo提出一算法TCFP(text categorization using feature projection),尝试利用特征投影法来降低与分类无关的特征对于系统的影响,并借此提升系统效能,其实实验结果显示其分类效果与k最近邻居法相近,但其运算所需时间仅需k最近邻居法运算时间的五十分之一。
除了针对文件分类的效率,尚有研究针对如何促进k最近邻居法在文件分类方面的效果,如Han等人于2002年尝试利用贪心法,针对文件分类实做可调整权重的k最近邻居法WAkNN(weighted adjusted k nearest neighbor),以促进分类效果;而Li等人于2004年提出由于不同分类的文件本身有数量上有差异,因此也应该依照训练集合中各种分类的文件数量,选取不同数目的最近邻居,来参与分类。
解法
实现
Python
Scikit-Learn
http:///stable/modules/neighbors.html
KNN分类器使用sklearn.neighbors.KNeighborsClassifier ,参数设置参考 http:///stable/modules/generated/sklearn.neighbors.KNeighborsClassifier.html
- knn_classification_example.py
python
X = [[0, 100], [1, 99], [99, 1], [100, 0]]
y = [0, 0, 1, 1]
from sklearn.neighbors import KNeighborsClassifier
classifier = KNeighborsClassifier(n_neighbors=3)
classifier.fit(X, y)
print(classifier.predict([[10, 90], [90, 10]]))
print(classifier.predict_proba([[10, 90], [90, 10]]))
print(classifier.kneighbors([[10, 90], [90, 10]], return_distance=False))
- output
text
>>> print(classifier.predict([[10, 90], [90, 10]]))
[0 1]
>>> print(classifier.predict_proba([[10, 90], [90, 10]]))
[[ 0.66666667 0.33333333]
[ 0.33333333 0.66666667]]
>>> print(classifier.kneighbors([[10, 90], [90, 10]], return_distance=False))
[[1 0 2]
[2 3 1]]
KNN回归器使用sklearn.neighbors.KNeighborsRegressor ,参数设置参考 http:///stable/modules/generated/sklearn.neighbors.KNeighborsRegressor.html
- knn_regression_example.py
python
X = [[0], [1], [2], [3]]
y = [0, 0, 1, 1]
from sklearn.neighbors import KNeighborsRegressor
regressor = KNeighborsRegressor(n_neighbors=2)
regressor.fit(X, y)
print(regressor.predict([[1.5]]))
应用
TODO
参考
- https://zh./wiki/最近鄰居法
- http://baike.baidu.com/view/1485833.htm
- http://blog.sina.com.cn/s/blog_7fc305440101d0vr.html
|