KNN算法

一、介绍

   KNN(K-Nearest Neighbors)算法是一种基础且直观的分类与回归方法。它的工作原理是:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前K个最相似的数据,这就是K-近邻算法中“K”的出处,通常K是不大于20的整数。最后,选择K个最相似数据中出现次数最多的分类,作为新数据的分类。

二、距离的计算

在KNN算法中,距离计算是非常关键的步骤,它决定了哪些样本被认为是“近邻”。常用的距离计算公式主要有欧氏距离(Euclidean distance)和曼哈顿距离(Manhattan distance)。

  1. 欧氏距离:欧氏距离是平面几何中最常用的距离计算方法,它计算的是两点之间的直线距离。在多维空间中,对于两个点x(x1,x2,...,xn)和y(y1,y2,...,yn),它们之间的欧氏距离公式为:

         d(x,y) = √[(x1-y1)² + (x2-y2)² + ... + (xn-yn)²]

欧氏距离是一种常用的相似度衡量方法,它对于数据的属性是数值型的情况非常有效。

  1. 曼哈顿距离:曼哈顿距离,也称为城市街区距离,它计算的是两点在一个网格上的路径距离。与欧氏距离不同,曼哈顿距离只允许沿着网格的水平和垂直方向移动。对于两个n维向量a(a1,a2,...,an)和b(b1,b2,...,bn),它们的曼哈顿距离公式为:

         d(a,b) = |a1-b1| + |a2-b2| + ... + |an-bn|

三、K值的选取

在KNN算法中,K值的选取是至关重要的,因为它直接决定了用于预测或分类的最近邻居的数量。K值的选择会对算法的性能产生显著影响。

  1. K值的影响
    • 较小的K值:当K值较小时,模型会更加敏感,容易受到噪声数据的影响。因为只考虑少数邻居,所以任何噪声或异常值都可能对结果产生较大的影响。
    • 较大的K值:当K值较大时,模型可能会忽略样本的局部特征。因为考虑了更多的邻居,所以模型可能变得更加平滑,但也可能失去对细微差异的捕捉能力。
  2. K值的选择方法
    • 交叉验证:一种常用的选择K值的方法是使用交叉验证。通过将数据划分为训练集和验证集,可以针对不同的K值进行模型训练和验证。选择在验证集上表现最好的K值作为最终的选择。
    • 经验法则:有时,也可以基于经验法则来选择K值。例如,可以从一个较小的K值开始,然后逐渐增加K的值,观察模型性能的变化。通常,随着K值的增加,模型的误差会先减小后增大,可以选择误差最小的K值。

四、KNN代码实现(Python)

from sklearn.model_selection import train_test_split  
from sklearn.preprocessing import StandardScaler  
from sklearn.neighbors import KNeighborsClassifier  
from sklearn import datasets  
from sklearn.metrics import classification_report, confusion_matrix  
  
# 加载iris数据集  
iris = datasets.load_iris()  
X = iris.data  
y = iris.target  
  
# 划分训练集和测试集  
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)  
  
# 数据标准化  
scaler = StandardScaler()  
X_train = scaler.fit_transform(X_train)  
X_test = scaler.transform(X_test)  
  
# 选择K值,这里我们选择K=3  
k = 3  
  
# 创建KNN分类器  
knn = KNeighborsClassifier(n_neighbors=k)  
  
# 训练模型  
knn.fit(X_train, y_train)  
  
# 预测测试集结果  
y_pred = knn.predict(X_test)  
  
# 输出预测结果和评估指标  
print("Confusion Matrix:")  
print(confusion_matrix(y_test, y_pred))  
  
print("\nClassification Report:")  
print(classification_report(y_test, y_pred))  
  
# 输出模型精度  
print("Model Accuracy:", knn.score(X_test, y_test))

测试结果: 

Confusion Matrix:  
[[10  0  0]  
 [ 0  9  1]  
 [ 0  1  9]]  
  
Classification Report:  
              precision    recall  f1-score   support  
  
           0       1.00      1.00      1.00        10  
           1       0.90      0.90      0.90        10  
           2       0.90      0.90      0.90        10  
  
    accuracy                           0.95        30  
   macro avg       0.93      0.93      0.93        30  
weighted avg       0.95      0.95      0.95        30  
  
Model Accuracy: 0.95

 

  • 分类报告提供了每个类别的精度(precision)、召回率(recall)和F1分数(f1-score),以及整体的精度。精度是正确预测的正样本数占所有预测为正样本数的比例,召回率是正确预测的正样本数占实际正样本数的比例,F1分数是精度和召回率的调和平均数。

  • 模型精度是测试集上正确分类的样本数与总样本数的比例,给出了模型的整体性能。在这个例子中,模型精度为0.95,意味着模型在测试集上正确分类了95%的样本。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值