K-近邻算法(KNN) 预测电影类型

k-近邻算法原理

K-近邻算法采用测量不同特征值之间的距离方法进行分类。
• 优点:精度高、对异常值不敏感、无数据输入假定。
• 缺点:时间复杂度高、空间复杂度高。
适用数据范围:数值型和标称型。

工作原理

存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据 与所属分类的对应关系。输人没有标签的新数据后,将新数据的每个特征与样本集中数据对应的 特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们 只选择样本数据集中前K个最相似的数据,这就是K-近邻算法中K的出处,通常K是不大于20的整数。 最后 ,选择K个最相似数据中出现次数最多的分类,作为新数据的分类。

# -*- coding: utf-8 -*-
# @Time    : 2019/11/9 11:46
# @Author  :

import pandas as pd
import numpy as np
from sklearn.neighbors import KNeighborsClassifier

# 准备样本(如图1)
df = pd.DataFrame(data={'电影名称': ['功夫熊猫', '叶问3', '二次曝光', '代理情人', '新步步惊心', '谍影重重', '美人鱼', '宝贝当家', '唐人街探案'],
                        '搞笑镜头': [39, 3, 2, 9, 8, 5, 21, 45, 23], '拥抱镜头': [0, 2, 3, 38, 34, 2, 17, 2, 3],
                        '打斗镜头': [31, 65, 55, 2, 17, 57, 5, 9, 17],
                        '电影类型': ['喜剧片', '动作片', '爱情片', '爱情片', '爱情片', '动作片', '喜剧片', '喜剧片', np.NaN]})

# 获取待求的电影名称的下标
idx = df[df.电影名称 == "唐人街探案"].index

# 样本分离
# 已知电影类型的电影(如图2)
df_konw = df.drop(index=idx)
# 不知电影类型的电影(如图3)
df_test = df.iloc[idx]

# 构建KNN分类器对象,k_neighbors查询默认使用的邻居数
knnclf = KNeighborsClassifier(n_neighbors=5, algorithm='auto')
# 这是一个训练样本集   而且必须是一个二维数组
X_train = np.array(df_konw.loc[:, ["搞笑镜头", "拥抱镜头", "打斗镜头"]])
Y_train = np.array(df_konw["电影类型"])

# 生成训练模型
knnclf.fit(X_train, Y_train)

# 输入测试值
X_test = np.array(df_test.loc[:, ["搞笑镜头", "拥抱镜头", "打斗镜头"]])

# 预测
y_test = knnclf.predict(X_test)

# array(['喜剧片'], dtype=object)
# 输出准确率
# ret = knnclf.score(X_test, y_test)

图1
(图1)
在这里插入图片描述
(图2)
在这里插入图片描述
(图3)

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
从豆瓣批量获取看过电影的用户列表,并应用kNN算法预测用户性别 首先从豆瓣电影的“看过这部电影 的豆瓣成员”页面上来获取较为活跃的豆瓣电影用户。 获取数据 链接分析 这是看过"模仿游戏"的豆瓣成员的网页链接:http://movie.douban.com/subject/10463953/collections。 一页上显示了20名看过这部电影的豆瓣用户。当点击下一页时,当前连接变为:http://movie.douban.com/subject/10463953/collections?start=20。 由此可知,当请求下一页内容时,实际上就是将"start"后的索引增加20。 因此,我们可以设定base_url='http://movie.douban.com/subject/10463953/collections?start=',i=range(0,200,20),在循环中url=base_url+str(i)。 之所以要把i的最大值设为180,是因为后来经过测试,豆瓣只给出看过一部电影的最近200个用户。 读取网页 在访问时我设置了一个HTTP代理,并且为了防止访问频率过快而被豆瓣封ip,每读取一个网页后都会调用time.sleep(5)等待5秒。 在程序运行的时候干别的事情好了。 网页解析 本次使用BeautifulSoup库解析html。 每一个用户信息在html中是这样的: 七月 (银川) 2015-08-23   首先用读取到的html初始化soup=BeautifulSoup(html)。本次需要的信息仅仅是用户id和用户的电影主页,因此真正有用的信息在这段代码中: 因此在Python代码中通过td_tags=soup.findAll('td',width='80',valign='top')找到所有的块。 td=td_tags[0],a=td.a就可以得到 通过link=a.get('href')可以得到href属性,也就用户的电影主页链接。然后通过字符串查找也就可以得到用户ID了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cocktail_py

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值