数据分析

机器学习2——KNN算法之实现

2020-11-10  本文已影响0人  valiant_xin

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)
上一篇下一篇

猜你喜欢

热点阅读