机器学习KNN算法实现例子

KNN算法(k近邻算法)是一种有监督分类算法,它的原理非常简单,下面以一个简单的例子引入。
已知两种酒的标签:赤霞珠和黑皮诺,在这个情景中,我们对酒进行分类的依据是酒精浓度和颜色深度,如下图所示:红色代表赤霞珠,紫色代表黑皮诺,图中有一分类未知的黄点,给定一个K值,我们找到距离黄点最近的K个点,假设K取3,我们发现距离黄点最近的3个点都是红点,0个紫点,根据少数服从多数原则,红:紫 = 3:0,所以认为黄点属于红色这一类,即赤霞珠。

1.算法实现步骤
根据上面那个例子,我们可以把KNN算法过程总结为以下几个步骤:

①确定一个K值, K值我一般取奇数,方便投票;
②计算距已知类别数据集中的点与当前点的距离 ;
③找到离最小的K个点 ;
④确认这K个点的类别 ;
⑤把出现次数最多的类别作为当前点的预测类别 ;
python实现knn算法例子

导入需要的库

import numpy as np
import pandas as pd`
import matplotlib.pyplot as plt

训练数据

rowdata = {'颜色深度':[14.23,13.2,13.16,14.37,13.24,12.07,12.43,11.79,12.37,12.04],
'酒精浓度':[5.64,4.38,5.68,4.80,4.32,2.76,3.94,3. ,2.12,2.6 ],
'品种':[0,0,0,0,0,1,1,1,1,1]}

rowdata中的品种为 0 代表 “黑皮诺”,1 代表 “赤霞珠”, 设置一个未知类别的点,变量名为new_data

新设置一个未知类别的点

new_data = np.array([4.1,12.8])

把rowdata转换为DataFrame

wine_data = pd.DataFrame(rowdata)

wine_data信息如下:

颜色深度	酒精浓度	品种

0 14.23 5.64 0
1 13.20 4.38 0
2 13.16 5.68 0
3 14.37 4.80 0
4 13.24 4.32 0
5 12.07 2.76 1
6 12.43 3.94 1
7 11.79 3.00 1
8 12.37 2.12 1
9 12.04 2.60 1

绘制散点图

修改样式

plt.style.use('ggplot')

windows电脑电脑正常显示中文

plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(6,4),dpi = 300)
plt.scatter(wine_data[wine_data.品种 == 0]['酒精浓度'], wine_data[wine_data.品种 == 0]['颜色深度'], c = 'purple', label = '黑皮诺' )
plt.scatter(wine_data[wine_data.品种 == 1]['酒精浓度'], wine_data[wine_data.品种 == 1]['颜色深度'], c = 'red' , label = '赤霞珠' )
plt.scatter(new_data[0] , new_data[1] ,c = 'yellow')
plt.scatter(3.5 , 12.2 ,c = 'green')
plt.title('10瓶红酒')
plt.xlabel('酒精浓度')
plt.ylabel('颜色深度')

图例添加 1. scatter 里面 添加 label 2. 添加plt.legend()

plt.legend(loc = 2)

将新的数据new_data绘制上来

plt.show()

画出的图形如下,我们可以简单的清晰的看到各点分布情况

KNN算法实现步骤:

1.确定一个k值 为 3

k = 3

2.计算已知类别数据集中的点与当前点的距离

distance = np.sqrt(np.sum((wine_data[['酒精浓度','颜色深度']] - new_data)**2,axis=1))
distance

3.找到距离最小的K个点

argsort对其排序,返回其索引值,再切片得到最近的k个值

distance.argsort()[:k]

4.确认这K个点的类别

k_vote = wine_data.loc[distance.argsort()[:k]]['品种']

5.把出现次数最多的类别作为当前点的预测类别

结果为0;

knn算法例子结束。

posted @ 2024-04-01 16:45  蓝裕安  阅读(22)  评论(0编辑  收藏  举报