KNN算法的思路类似于有n多个点(xi,yi),我想要知道一个新点(x0,y0)应该属于哪个分类,计算的方式就是对(xi-x0)^2 + (yi-y0)^2的和开平方根,得到对应的距离值。然后将所有值从小到大排序,根据指定的k个数,找到距离最小的那k个点,然后根据它们哪种特征多,我的(x0,y0)就属于哪个特征。
1.KNN算法实现大概有几个步骤:
1.确定一个参数k
2.依次计算所有其他样本点到我们测试样本点到距离
3.对所有样本点到距离进行排序
4.找出距离测试点最近对k个样本点
5.对这k个样本点所属的类别进行投票,哪个类别多,就将该点预测成哪个类别
2.下面进行实现:
1.设置近邻k
# 确定一个参数k,最近邻个数
k = 3
2.提取前两列数据
# 提取前两列
X = wine_data.iloc[:,:2]
X
3.矢量化运算
# 矢量化运算
X - new_data
4.数学运算
#默认同一列相加运算,这里设置axis=1,让他同一行运算
d = np.sqrt(np.sum((X - new_data)**2, axis=1))
d
5.将数据从小到大排序,取前三个的索引
# 最近的三个点
topK = d.sort_values().iloc[:3].index #从小到大排序,取前三个索引
topK
6.开始投票取值
#对这k个样本点所属的类别进行投票,哪个类别多,就将该点预测成哪个类别
wine_data.loc[topK, '品种']
# 投票
wine_data.loc[topK, '品种'].value_counts()
或者通过下面方式直接获取最多的投票值
wine_data.loc[topK, '品种'].value_counts().index[0]
3.尝试封装成一个方法
def mknn(k, raw_data, new_data):
""""功能:KNN分类器
k:相邻个数
raw_data:原始数据
new_data: 查询数据"""
X = raw_data.iloc[:,:2]
d = np.sqrt(np.sum((X - new_data)**2, axis=1))
topK = d.sort_values().iloc[:k].index #从小到大排序
return wine_data.loc[topK, '品种'].value_counts().index[0]
mknn(3, wine_data, new_data)