机器学习之K最近邻算法

KNN算法
K-Nearest Neighbor,即K最近邻算法
K指的是最近邻的个数

KNN算法既可用于求解分类问题,也可用于求解回归问题

K值的确定
K值过小,容易造成过拟合
K值过大,容易导致结果固化
经验上,一般取K为5

距离的确定
在这里插入图片描述当q=1时,又称曼哈顿距离
当p=2时,又称欧氏距离
当p=正无穷时,又称切比雪夫距离,它是各个坐标距离的最大值
KNN算法的距离确定一般用欧式距离

权重
权重指的是某一个因素相对于整体事务的重要程度,既可体现各个因素所占的百分比,也强调了因素的相对重要程度和贡献度。
在KNN算法中,距离预测样本点越近的样本越有话语权。

本次解决问题
本次分别以自算与调库两种写KNN算法,目的:在已知数据集不同种类的电影训练下判断新电影的种类

开始
为了学习KNN原理,先自己写一个不调库的

import math
#已知数据,即训练数据集,数字分别代表搞笑镜头,拥抱镜头,打斗镜头
movie_data = {'宝贝当家': [45, 2, 9, '喜剧片'],
              '美人鱼': [21, 17, 5, '喜剧片'],
              '澳门风云3': [54, 9, 11, '喜剧片'],
              '功夫熊猫': [39, 0, 31, '喜剧片'],
              '谍影重重': [5, 2, 57, '动作片'],
              '叶问3': [3, 2, 65, '动作片'],
              '伦敦陷落': [2, 3, 55, '动作片'],
              '我的特工爷爷': [6, 4, 21, '动作片'],
              '奔爱': [7, 46, 4, '爱情片'],
              '夜孔雀': [9, 39, 8, '爱情片'],
              '代理情人': [9, 38, 2, '爱情片'],
              '新步步惊心': [8, 34, 17, '爱情片']
              }
#需判断的新数据
x = [23, 3, 17]
KNN = []
#用欧式距离进行排序
for key, v in movie_data.items():
    d = math.sqrt((x[0]-v[0])**2+(x[1]-v[1])**2+(x[2]-v[2])**2)
    KNN.append([key, round(d, 2)]) #round作用是保留两位小数
KNN.sort(key=lambda c: c[1])
#选取其中距离最近的五个发言者
KNN = KNN[: 5]
labels = {'喜剧片': 0, '动作片': 0, '爱情片': 0}
for s in KNN:
    label = movie_data[s[0]]
    labels[label[3]] += 1
labels = sorted(labels.items(), key=lambda h: h[1])
print(labels)
print(labels[2][0], sep='\n')

运行后的结果
在这里插入图片描述

很明显,KNN算法原理就是找到与新数据最近的几个,跟据这几个的分类判断新数据的种类。
下面,我们用调库的方式再写

首先,我把上面的训练数据保存,目的是模拟以后需要从文件中拿数据

from pandas import DataFrame
#提取字典中的两列值
key = list(movie_data.keys())
value = list(movie_data.values())
gaoxiao = []
yongbao = []
dadou = []
fenlei = []
for i in value:
    gaoxiao.append(i[0])
    yongbao.append(i[1])
    dadou.append(i[2])
    fenlei.append(i[3])
print(key, value)
#利用pandas模块先建立DataFrame类型,然后将两个上面的list存进去
result_excel = DataFrame()
result_excel['剧名'] = key
result_excel['搞笑镜头'] = gaoxiao
result_excel['拥抱镜头'] = yongbao
result_excel['打斗镜头'] = dadou
result_excel['分类'] = fenlei
# print(result_excel)
result_excel.to_excel('电影集.xlsx', header=True, index=False)

运行后的结果
在这里插入图片描述

现在调库代码

import pandas as pd
from sklearn.neighbors import KNeighborsClassifier
movie = pd.read_excel('电影集.xlsx')
X = movie[['搞笑镜头', '拥抱镜头', '打斗镜头']]
y = movie['分类']
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X, y)
movie_new = pd.DataFrame({'搞笑镜头': [23], '拥抱镜头': [3], '打斗镜头': [17]})
movie_new1 = pd.DataFrame({'搞笑镜头': [2, 3], '拥抱镜头': [1, 3], '打斗镜头': [1, 77]})
print(knn.predict(movie_new))
print(knn.predict_proba(movie_new))
print(knn.classes_)
print(knn.predict(movie_new1))
print(knn.predict_proba(movie_new1))
print(knn.classes_)

运行后的结果
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值