机器学习爱好者Sklearnsklearn机器学习

K邻近算法(KNN)

2019-05-08  本文已影响0人  陨星落云

K邻近算法(KNN)

kNN 可以说是最简单的监督学习分类器了。想法也很简单,就是找出测试数据在特征空间中的最近邻居。我们将使用下面的图片介绍它。

knn.png

上图中的对象可以分成两组,蓝色方块和红色三角。每一组也可以称为一个类。我们可以把所有的这些对象看成是一个城镇中房子,而所有的房子分别属于蓝色和红色家族,而这个城镇就是所谓的特征空间。
现在城镇中来了一个新人,他的新房子用绿色圆盘表示。我们要根据他房子的位置把他归为蓝色家族或红色家族。我们把这过程成为分类。我们应该怎么做呢?因为我们正在学习看 kNN,那我们就使用一下这个算法吧。一个方法就是查看他最近的邻居属于那个家族,从图像中我们知道最近的是红色三角家族。所以他被分到红色家族。这种方法被称为简单近邻,因为分类仅仅决定与它最近的邻居。
但是这里还有一个问题。红色三角可能是最近的,但如果他周围还有很多蓝色方块怎么办呢?此时蓝色方块对局部的影响应该大于红色三角。所以仅仅检测最近的一个邻居是不足的。所以我们检测 k 个最近邻居。谁在这 k 个邻居中占据多数,那新的成员就属于谁那一类。如果 k 等于 3,也就是在上面图261像中检测 3 个最近的邻居。他有两个红的和一个蓝的邻居,所以他还是属于红色家族。但是如果 k 等于 7 呢?他有 5 个蓝色和 2 个红色邻居,现在他就会被分到蓝色家族了。k 的取值对结果影响非常大。更有趣的是,如果 k 等于 4呢?两个红两个蓝。这是一个死结。所以 k 的取值最好为奇数。这中根据 k 个最近邻居进行分类的方法被称为 kNN。

工作原理

距离度量
x_{i}=\left(x_{i}^{(1)}, x_{i}^{(2)}, \cdots, x_{i}^{(n)}\right)^{T}

L_{\infty}\left(x_{i}, x_{j}\right)=\max _{l}\left|x_{i}^{(l)}-x_{j}^{(l)}\right|

K值的选择

K-Nearest Neighbors算法特点

适用数据范围: 数值型和标称型

优点 缺点
精度高 计算复杂度高
对异常值不敏感 空间复杂度高
无数据输入假定

k邻近分类

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier

# 加载iris数据
iris = load_iris()
# 将数据分为训练集和测试集,一般test_size设为0.25,这里设置为3个测试样本便于观察结果.
X_train,X_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size=3,random_state=1) 

# 进行标准化
std = StandardScaler()
X_train = std.fit_transform(X_train)
X_test = std.transform(X_test)
# estimator流程
knn = KNeighborsClassifier(n_neighbors=5,weights='uniform', algorithm='auto',  p=2, metric='minkowski', n_jobs=1)
# 得出模型
knn.fit(X_train,y_train)
#进行预测并得出精度
y_predict = knn.predict(X_test)
print('测试集预测结果:{}'.format(y_predict))
print('测试集预测结果名称:{}'.format(iris.target_names[y_predict]))
print('测试集目标值名称:{}'.format(iris.target_names[y_test]))
print('训练集精度:{:.2f}'.format(knn.score(X_train,y_train)))
score = knn.score(X_test,y_test)
print('测试集精度:{:.2f}'.format(score)) # 等价于print(np.mean(y_predict==y_test))
测试集预测结果:[0 1 1]
测试集预测结果名称:['setosa' 'versicolor' 'versicolor']
测试集目标值名称:['setosa' 'versicolor' 'versicolor']
训练集精度:0.96
测试集精度:1.00

参考资料:
《python机器学习教程》《python机器学习应用》《OpenCV-Python-Toturial》《统计学习方法》《sklearn官方文档》

上一篇 下一篇

猜你喜欢

热点阅读