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的代码书写工具;
记录一下自己学会的第一个机器学习算法