上一篇我们讲过Kmeans,初学者常常把这两者搞混,虽然KNN是有监督算法,Kmeans是无监督算法,但KNN和Kmeans确实有相同之处:
K近邻算法的计算流程:
说明: KNN 没有显示的训练过程,它是「懒惰学习」的代表,它在训练阶段只是把数据保存下来,训练时间开销为 0,等收到测试样本后进行处理。
不同类别的样本点,分布在空间的不同区域。K近邻是基于空间距离较近的样本类别来进行分类,本质上是对于特征空间的划分。
K近邻算法依赖于空间中相近的点做类别判断,判断距离远近的度量标准非常重要
距离的度量标准,对很多算法来说都是核心要素(比如无监督学习的 聚类算法也很大程度依赖距离度量),也对其结果有很大的影响。
Lp距离(又称闵可夫斯基距离,Minkowski Distance)不是一种距离,而是一组距离的定义。
对于 KNN 算法而言,K的大小取值也至关重要,如果选择较小的K值,意味着整体模型变得复杂(模型容易发生过拟合),模型学习的近似误差(approximation error)会减小,但估计误差(estimation error)会增大。
如果选择较大的K值,就意味着整体的模型变得简单,减少学习的估计误差,但缺点是学习的近似误差会增大。
我们看到,对于样本 X,通过 KNN 算法,我们显然可以得到 X 应属于红色类别。但对于样本 Y,KNN 算法判定的结果是 Y应属于蓝色类别,然而从距离上看
Y和红色的批次样本点更接近。因此,原始的 KNN 算法只考虑近邻不同类别的样本数量,而忽略掉了距离
KNN 还存在如下缺点:
1、标准化 提升计算速度,标准差标准化:
2、浓缩训练样本,从原始训练样本集中选择最优的参考子集进行K近邻寻找,从而减少训练样本的存储量和提高计算效率
• sklearn
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
X, y = make_blobs(n_samples = 500, n_features = 2, centers = 4,cluster_std = 1.5, random_state = 4)
plt.style.use('seaborn')
plt.figure(figsize = (10,10))
plt.scatter(X[:,0], X[:,1], c=y, marker= '*',s=100,edgecolors='black')
plt.show()
PythonCopy
from sklearn.metrics import accuracy_score
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 0)
knn5 = KNeighborsClassifier(n_neighbors = 5)
knn1 = KNeighborsClassifier(n_neighbors=1)
knn5.fit(X_train, y_train)
knn1.fit(X_train, y_train)
y_pred_5 = knn5.predict(X_test)
y_pred_1 = knn1.predict(X_test)
print("Accuracy with k=5", accuracy_score(y_test, y_pred_5)*100)
print("Accuracy with k=1", accuracy_score(y_test, y_pred_1)*100)
plt.figure(figsize = (15,5))
plt.subplot(1,2,1)
plt.scatter(X_test[:,0], X_test[:,1], c=y_pred_5, marker= '*', s=100,edgecolors='black')
plt.title("Predicted values with k=5", fontsize=20)
plt.subplot(1,2,2)
plt.scatter(X_test[:,0], X_test[:,1], c=y_pred_1, marker= '*', s=100,edgecolors='black')
plt.title("Predicted values with k=1", fontsize=20)
plt.show()
PythonCopy

阅读量:1076
点赞量:0
收藏量:0