最近在自学python的数据分析,还想稍微蹭一蹭深度学习,于是不可避免地接触到了最简单的机器学习算法——KNN算法。该方法的思路非常简单直观:如果一个样本在特征空间中的K个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。
用人话说就是:如果要对一个样本进行分类,就看看这个样本周围都是些什么东西。要是跟样本比较接近的人是一群小混混,那么,这个样本估计比小混混也好不到哪儿去,要是跟样本比较接近的都是一群酒肉朋友,那样本估计就是朱一旦本旦了(非洲警告) 。
所以具体要怎么实现KNN算法呢?
其实,python的sklearn库中是内置了KNN算法的,我也尝试着把鸢尾花数据集放进去跑了一下,然而,随着硬盘的一声嗡鸣,计算结果一览无余,眼前的一切突然变得索然无味,进入了贤者模式的我开始反思自己的所作所为: 连这么一个简单的算法都要调库进行实现的我配敲代码吗?(调库的代码很无脑,所以我没有保留,但是我把有关的博客链接放到了文末,看官老爷们要是感兴趣的话可自行移步学习)
所以,我开始尝试自己自己实现KNN算法
算法的大体思路就是提取待分析样本的特征,然后将特征与原有的特征库进行比对,量化样本与原有数据之间的差距,找出与样本最接近的K个点,哪一类的点最多,这个样本归属于哪一类的概率也就越大
当然了,为了节省看官老爷们的时间,该调的辅助计算库还得调:)
from scipy.spatial import distance#这是为了简化计算,方便调用内置计算函数
import matplotlib.pyplot as plt #这是为了做一点基本的可视化图表
import numpy as np #这是因为np.array骚操作太多太快乐了
import operator #这个就厉害了,用途我后面再说
一、首先我得有个样本库,并对样本库的特征进行提取。但是特征提取可是一门大学问,作为还没有达到朋友圈平均水平的菜鸡本鸡只好用最简单的距离特征作为今天的主要测试材料:
好了,下面是我费尽九牛二虎之力提取(编造)的距离信息
#我的数据库,有亿点点寒酸
x1 = np.array([3,2,1,6,5,4])
y1 = np.array([104,100,81,110,105,103])
x2 = np.array([101,99,98,97,96,95])
y2 = np.array([10,5,2,1,3,1])
#为了让数据变得好看一点,同时便于计算,用坐标形式保存
#知道有些看官老爷们没仔细研究过numpy库,我在下面对我用的一些骚函数进行一下解释
A_data = np.concatenate((x1.reshape(6,1),y1.reshape(6,</