什么是K-近邻算法
它是一种属于监督学习算法中的分类和回归算法,简单来说,就是通过判断与待分类样本最邻近的已知类别样本的类别,来确定待分类样本的类别。
举个例子,假设有一组已知类别标签的训练样本集,当我们要对一个新的未知样本进行分类时,KNN 算法会计算这个新样本与训练集中所有样本的距离。这里的距离可以采用多种度量方式,比如欧氏距离、曼哈顿距离等。然后,选取距离最近的 K 个样本。最后,根据这 K 个样本的类别,通过投票等方式来确定新样本的类别。如果这 K 个样本中大多数属于某个类别,那么新样本就被判定为这个类别。
KNN核心思想:根据你的“邻居”来推断出你的类别
K - 的取值
在 KNN 算法中,K 值的选择至关重要。如果 K 值设置得太高,会导致计算成本增加;而若 K 值设置得太低,则容易受到异常值的影响。
通过交叉验证的方法来尝试不同的 K 值,观察模型在验证集上的性能表现,从而选择出最佳的 K 值
距离选择
常见的距离度量方式有:
- 欧氏距离
这是最常用的距离度量方式之一。对于两个 n 维空间中的点 A=(x₁,y₁,z₁,…,n₁) 和 B=(x₂,y₂,z₂,…,n₂),欧氏距离计算公式:
d ( A , B ) = ( x 2 − x 1 ) 2 + ( y 2 − y 1 ) 2 + ( z 2 − z 1 ) 2 + . . . + ( n 2 − n 1 ) 2 d(A,B)=\sqrt{(x_2 - x_1)^2+(y_2 - y_1)^2+(z_2 - z_1)^2+...+(n_2 - n_1)^2} d(A,B)=(x2−x1)2+(y2−y1)2+(z2−z1)2+...+(n2−n1)2
比如在二维空间中,点 A (1,2) 和点 B (4,6) 之间的欧氏距离为√((4 - 1)²+(6 - 2)²)=5。
- 曼哈顿距离
也称为城市街区距离。对于两个 n 维空间中的点 A 和 B,曼哈顿距离计算公式为:
d ( A , B ) = ∣ x 2 − x 1 ∣ + ∣ y 2 − y 1 ∣ + ∣ z 2 − z 1 ∣ + . . . + ∣ n 2 − n 1 ∣ d(A,B)=|x_2 - x_1|+|y_2 - y_1|+|z_2 - z_1|+...+|n_2 - n_1| d(A,B)=∣x2−x1∣+∣y2−y1∣+∣z2−z1∣+...+∣n2−n1∣
对于同样的点 A (1,2) 和 B (4,6),曼哈顿距离为 | 4 - 1|+|6 - 2|=7。
KNN 算法的应用举例
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
#鸢尾花种类预测
def knn_iris():
#1.获取数据
iris = load_iris()
#2.划分数据集
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=6)
#3.特征工程:标准化
#如果test也用fit,则test用了自己的计算,就不再与train一致了
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
#4.KNN算法预估器
estimator = KNeighborsClassifier(n_neighbors=3)
estimator.fit(x_train,y_train)
#5.模型评估
#1)直接对比真实值和预测值
y_predict = estimator.predict(x_test)
print("y_predict:\n",y_predict)
print("直接对比真实值和预测值:\n",y_test == y_predict)
#2)计算准确率
score = estimator.score(x_test,y_test)
print("准确率为:\n",score)
return None
if __name__ == '__main__':
knn_iris()
运行结果:
总结
- 优点
- 1.算法简单直观,易于理解和实现。
- 2.对异常值不敏感,因为分类结果是基于多个近邻样本的投票,个别异常值的影响相对较小。
- 3.无需事先对数据进行假设,适用于各种类型的数据。
- 缺点
- 1.当训练集规模很大时,计算新样本与所有训练样本的距离会非常耗时。
- 2.K 值的选择对算法性能有很大影响,如果 K 值选择不当,可能会导致分类结果不准确。
使用场景:小数据场景,几千~几万样本,具体场景具体业务测试