机器学习之K近邻算法

前言

       当有多种类别数据时,我们常常面临着对新加入的数据进行  分类  的问题,例如,根据口味和色泽划分新的葡萄酒的类别,根据内容形式划分新上映电影的类别,根据过往人脸特征进行人脸识别等。这些问题都 可以采用机器学习中非常经典的K近邻算法来解决。

一、 K近邻算法的原理和代码实现       

K近邻算法(英文为K-Nearest Neighbor,简称KNN算法)是 非常经典的机器学习算法。

1.K近邻算法的基本原理

       K近邻算法的原理非常简单:对于一个新样本,K近邻算法的目的就是在已有数据中寻找与它最相似的K个数据,或者说“离它最近”的K 个数据,如果这K个数据大多数属于某个类别,则该样本也属于这个类别。

       以下图为例,假设五角星代表爱情片,三角形代表科幻片。此时加 入一个新样本正方形,需要判断其类别。当选择以离新样本最近的3个近邻点(K=3)为判断依据时,这3个点由1个五角星和2个三角形组成,根据“少数服从多数”原则,可以认为新样本属于三角形的类别,即 新样本是一部科幻片。同理,当选择离新样本最近的5个近邻点(K= 5)为判断依据时,这5个点由3个五角星和2个三角形组成,根据“少数 服从多数”原则,可以认为新样本属于五角星的类别,即新样本是一部 爱情片。

       明白了K的含义后,下面来学习如何判断2个数据的相似度,或者 说2个数据的距离。这里采用最为常见的欧氏距离来定义向量空间内2个 点的距离,对于二维空间而言,样本A的2个特征值为(X1,Y1),样 本B的2个特征值为(X2,Y2),那么2个样本的距离计算公式如下。

这个其实就是常见的两点间距离公式,如下图所示,其适用于只有 2个特征变量的情况。

      实际应用中,数据的特征通常有n个,此时可将该距离公式推广到n 维空间,如n维向量空间内A点坐标为(X1,X2,X3,…,Xn),B点 坐标为(Y1,Y2,Y3,…,Yn),那么A、B两点间的欧氏距离计算公 式如下。

2.K近邻算法的计算步骤

2.1 样本数据

       这里通过一个简单的例子“如何判断葡萄酒的种类”来讲解K近邻算 法的计算步骤。商业实战中用于评判葡萄酒的指标有很多,为方便演 示,这里只根据“酒精含量”和“苹果酸含量”2个特征变量将葡萄酒分为2 类,并且原始样本数据只有5组,见下表。

       其中“酒精含量”代表葡萄酒中酒精的含量,“苹果酸含量”代表葡萄 酒中苹果酸的含量,“分类”取值为0代表葡萄酒A,取值为1代表葡萄酒 B。 现在需要使用K近邻算法对一个新样本进行分类,该新样本的特征 数据见下表,那么这个新样本是属于葡萄酒A还是葡萄酒B呢?

2.2计算距离

       此时可以利用距离公式来计算新样本与已有样本之间的距离,即不 同样本间的相似度。例如,新样本与样本1的距离计算公式如下。

同理可以计算新样本与其他原始样本的距离,结果见下表。

2.3.根据K值判定类别

计算出各个原始样本与新样本的距离后,再根据距离由近到远排 序,结果见下表。

       如果令K值等于1,也就是以离新样本最近的原始样本的种类作为 新样本的种类,此时新样本离样本2最近,则新样本的分类为0,也就是 葡萄酒A。 如果令K值等于3,也就是以离新样本最近的3个原始样本的多数样 本的种类为判断依据,此时最近的3个原始样本是样本2、样本1、样本 4,它们中以分类0居多,所以判定新样本的分类为0,也就是葡萄酒 A

二、K近邻算法分类模型代码实现

1.实现过程

# 忽略警告信息
import warnings
warnings.filterwarnings('ignore')

# 读取数据

import pandas as pd
df = pd.read_excel('./葡萄酒.xlsx')
X_train = df[['酒精含量','苹果酸含量']]
y_train = df['分类']

# 建模

from sklearn.neighbors import KNeighborsClassifier as KNN
knn = KNN(n_neighbors=3)#邻近参数n_neighbors,也就是K值,设置其值为3,即选取最近的3个样本
knn.fit(X_train, y_train)

# 测试
X_test = [[7, 1]] # X_test为测试集的特征变量
answer = knn.predict(X_test)

print(answer)

引入Scikit-Learn库中的K近邻算法分类模型并简写为 KNN;第2行代码创建模型并设置邻近参数n_neighbors,也就是K值, 这里设置其值为3,即选取最近的3个样本,如果不设置则取默认值5;

2.实现结果

打印结果为0, 表示葡萄酒A,与前面计算的结果是一致的。

接着在测试数据中增加一个新样本,例如,增加一个和样本4(分 类1)一样的样本(8%的酒精含量、3%的苹果酸含量),代码如下。

X_test1 = [[7, 1], [8, 3]] # 这行代码能帮助理解为什么要写成二维数组形式
answer1 = knn.predict(X_test1)
print(answer1)

此时得到的预测结果answer1如下所示,可以看到新增样本的确被预 测为和样本4一样的分类1。

三、K近邻算法回归模型

       前面的代码是用K近邻算法中的K近邻算法分类模型 (KNeighborsClassifier)进行分类分析,K近邻算法还可以做回归分 析,对应的模型为K近邻算法回归模型(KNeighborsRegressor)

       K近 邻算法分类模型将离待预测样本点最近的K个训练样本点中出现次数最多的分类作为待预测样本点的分类,K近邻算法回归模型则将离待预测样本点最近的K个训练样本点的平均值作为待预测样本点的分类。

1.K近邻算法回归模型代码演示

from sklearn.neighbors import KNeighborsRegressor
X = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
y = [1, 2, 3, 4, 5]
model = KNeighborsRegressor(n_neighbors=2)
model.fit(X, y)
print(model.predict([[5, 5]]))

        第2行代码中的X是特征变量,共有2个特征;第3行代码中的y是目 标变量;第4行代码创建模型,并设置超参数n_neighbors(K值)为2; 第5行代码用fit()函数训练模型;第6行代码用predict()函数进行预测。预 测结果如下。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青枫浦上看桃花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值