k-近邻算法

knn算法原理与步骤

KNN算法工作原理:给定一个已知标签类别的训练数据集,输入没有标签的新数据之后,在训练集中找到与新数据最邻近的k个实例,如果k个实例的多数属于某个类别,那么新数据就属于这个类别。
即由那些离X最近的k个点来投票决定X 归为哪一类
算法步骤:
(1)计算已知类别的数据集中的点与当前点的距离;
(2)按照距离递增次序排序;
(3)选取与当前点距离最小的k个点;
(4)确定前k个点所在类别的出现频率;
(5)返回前k个点出现频率最高的类别作为当前点的预测类别;

knn算法实现

import pandas as pd

# 1.构建数据集
rowdata = {'电影名称': ['无问西东', '后来的我们', '前任3', '红海行动', '唐人街探案', '战狼2'],
           '打斗镜头': [1, 5, 12, 108, 112, 115],
           '接吻镜头': [101, 89, 97, 5, 8, 9],
           '电影类型': ['爱情片', '爱情片', '爱情片', '动作片', '动作片', '动作片']}
movie_data = pd.DataFrame(rowdata)
# 将字典转换为DataFrame数据结构;DataFrame是Python中Pandas库中的一种数据结构,它类似excel,是一种二维表。

# 2.计算距离
new_data = [24, 67]
dist = list((((movie_data.iloc[:6, 1:3] - new_data) ** 2).sum(1)) ** 0.5)
# loc函数:通过行索引 "Index" 中的具体值来取行数据(如取"Index"为"A"的行)
# iloc函数:通过行号来取行数据

# 3.将距离升序排列,然后选取距离最小的k个点
dist_l = pd.DataFrame({'dist': dist, 'labels': (movie_data.iloc[:6, 3])})
k = 4
dr = dist_l.sort_values(by='dist')[:k]
# DataFrame.sort_values(by=‘##’,axis=0,ascending=True, inplace=False, na_position=‘last’)
# by 用于 指定列名(axis=0或’index’)或索引值(axis=1或’columns’)

# 4.确定前k个点所在类别的出现频率
re = dr.loc[:, 'labels'].value_counts()
#value_counts()函数可以对每个值进行计数并且排序

# 5.选择频率最高的类别作为当前点的预测类型
result = []
result.append(re.index[0])

knn函数封装

import pandas as pd

'''
函数功能:KNN分类器
参数说明:
    inX:需要预测分类的数据集
    dataset:已知分类标签的数据集(训练集)
    k:k-近邻算法参数,选择距离最小的k个点
返回:
    result:分类结果
'''


#
def classify0(inX, dataset, k):
    result = []
    dist = list((((movie_data.iloc[:6, 1:3] - new_data) ** 2).sum(1)) ** 0.5)
    dist_l = pd.DataFrame({'dist': dist, 'labels': (movie_data.iloc[:6, 3])})
    dr = dist_l.sort_values(by='dist')[:k]
    re = dr.loc[:, 'labels'].value_counts()
    result.append(re.index[0])
    return result


总结

第一次接触机器学习相关的算法,和之前学习的算法相差很多,习惯了C++的stl算法模板,在Python中书写一个算法的感觉相差甚远。
需要熟悉Python库中各个函数的使用功能与输入输出参数;
需要熟练掌握pycharm与jupyter lab的代码书写工具;
记录一下自己学会的第一个机器学习算法

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值