1、数据集下载

https://grouplens.org/datasets/movielens

2、数据集下文件格式

u.user用户属性文件

包含user.id用户ID    gender性别   occupation职业    ZIP code邮编等属性,每个属性之间用|分割

u.item电影元数据

包含movie.id电影ID    title电影标题    release date电影上映日期    IMDB link 电影分类向量等属性,每个属性之间用|分割

u.data用户对电影的评级

包含user.id用户ID    movie.id电影ID    rating评分(从1-5)    timestamp时间戳等属性,每个属性之间用制表符\t分割

3、用户数据分析

使用jupyter notebook进入编辑器

from pyspark import SparkContext
#导入Spark上下文
sc = SparkContext("local","movielens")
#初始化Spark上下文,指定master为local,即本地运行,应用名称为movielens
user_data = sc.textFile("file:///home/chenjie/ml-100k/u.user")
#加载本地movielens文件中的用户信息文件,file://开头,后接本地文件路径;也可上传至HDFS,hdfs://192.168.1.101:9000/ml-100k/u.user
user_data.first()
#输出第一行#u'1|24|M|technician|85711'
#用户信息文件包含   用户ID|年龄|性别|职业|邮编user_fields = user_data.map(lambda line: line.split("|"))
#将用户信息文件的每一行以|为分隔符【分开】
num_users = user_fields.map(lambda fields: fields[0]).count()
#将用户信息文件的用户ID列取出,并且【计算总数】,得到用户数目
num_genders = user_fields.map(lambda fields: fields[2]).distinct().count()
#将用户信息文件的性别列取出,并进行【去重】,并且计算总数,得到性别数目
num_occupations = user_fields.map(lambda fields: fields[3]).distinct().count()
#将用户信息文件的职业列取出,并进行去重,并且计算总数,得到职业数目
num_zipcodes = user_fields.map(lambda fields: fields[4]).distinct().count()
print "Users: %d, genders: %d, occupations: %d, ZIP codes: %d" % (num_users, num_genders, num_occupations, num_zipcodes)
#输出上述信息
#Users: 943, genders: 2, occupations: 21, ZIP codes: 795ages = user_fields.map(lambda x : int(x[1])).collect()
#将用户信息文件的年龄列取出
import matplotlib.pyplot
#导入pyplot库
matplotlib.pyplot.hist(ages,bins=20,color='lightblue',normed=True)
#画直方图,参数列表如下"""
matplotlib.pyplot.hist(x, bins=None, range=None, normed=False, weights=None, cumulative=False, bottom=None, histtype=’bar’, align=’mid’, orientation=’vertical’, rwidth=None, log=False, color=None, label=None, stacked=False, hold=None, data=None, **kwargs)Parameters:
x : (n,) array or sequence of (n,) arrays(可以是一个array也可以是多个array)
integer or array_like or ‘auto’, optional(可以是整型来设置箱子的宽度,也可以是array,指定每个箱子的宽度)
range : tuple or None, optional(设置显示的范围,范围之外的将被舍弃)
normed : boolean, optional(?)
weights : (n, ) array_like or None, optional(?)
cumulative : boolean, optional(?)
bottom : array_like, scalar, or None(?)
histtype : {‘bar’, ‘barstacked’, ‘step’, ‘stepfilled’}, optional(选择展示的类型,默认为bar)
align : {‘left’, ‘mid’, ‘right’}, optional(对齐方式)
orientation : {‘horizontal’, ‘vertical’}, optional(箱子方向)
log : boolean, optional(log刻度)
color : color or array_like of colors or None, optional(颜色设置)
label : string or None, optional(刻度标签)
stacked : boolean, optional(?)return
n : array or list of arrays(箱子的值)
bins : array(箱子的边界)
patches : list or list of lists
"""fig = matplotlib.pyplot.gcf()
#得到一个当前画图的引用
fig.set_size_inches(16,10)"""
fig.set_size_inches(w,h,forward=False)
atplotlib 包中提供的函数,用于设置图形的尺寸,单位为英寸。1英寸等于 2.54 cm。
参数forward = True表示自动更新画布大小。
"""
matplotlib.pyplot.show()
#显示

用户的年龄段分布图

下面进行用户职业分布图,可以使用map+reduce,也可以使用countByValue函数

count_by_occupation = user_fields.map(lambda fields: (fields[3], 1)).reduceByKey(lambda x, y : x+y).collect()
#统计每个职业的总数
import numpy as np
x_axis1 =  np.array([c[0] for c in count_by_occupation])
#将python数组转为numpy数组
y_axis1 = np.array([c[1] for c in count_by_occupation])
x_axis1 = x_axis1[np.argsort(y_axis1)]
y_axis1 = y_axis1[np.argsort(y_axis1)]
#argsort以数量升序从各数组中选取元素
pos = np.arange(len(x_axis1))
#np.arange(5)返回 array([0,1,2,3,4])
width = 1.0
ax = matplotlib.pyplot.axes()
#向图中添加一个轴
ax.set_xticks(pos + (width / 2))
ax.set_xticklabels(x_axis1)
#要修改X轴的刻度,最简单的办法是使用set_xticks和set_xticklabels。前者告诉matplotlib要将刻度放在数据范围中的哪些位置,默认情况下,这些位置也就是刻度标签。但我们可以通过#set_xticklabels将任何其他的值用作标签
matplotlib.pyplot.bar(pos,y_axis1,width,color='green' )
matplotlib.pyplot.xticks(rotation=30)
fig = matplotlib.pyplot.gcf()
fig.set_size_inches(16,10)
matplotlib.pyplot.show()count_by_occupation2 = user_fields.map(lambda fields: (fields[3], 1)).countByValue()
print "Map-reduce approach:"
print dict(count_by_occupation2)
print """""
Map-reduce approach:
{(u'homemaker', 1): 7, (u'marketing', 1): 26, (u'healthcare', 1): 16, (u'administrator', 1): 79, (u'doctor', 1): 7, (u'writer', 1): 45, (u'salesman', 1): 12, (u'librarian', 1): 51, (u'other', 1): 105, (u'lawyer', 1): 12, (u'engineer', 1): 67, (u'programmer', 1): 66, (u'entertainment', 1): 18, (u'artist', 1): 28, (u'none', 1): 9, (u'executive', 1): 32, (u'educator', 1): 95, (u'technician', 1): 27, (u'student', 1): 196, (u'scientist', 1): 31, (u'retired', 1): 14}
"""print "countByValue approach:"
print dict(count_by_occupation)
print ""
"""
countByValue approach:
{u'administrator': 79, u'executive': 32, u'retired': 14, u'doctor': 7, u'entertainment': 18, u'marketing': 26, u'writer': 45, u'none': 9, u'healthcare': 16, u'scientist': 31, u'homemaker': 7, u'student': 196, u'educator': 95, u'technician': 27, u'librarian': 51, u'programmer': 66, u'artist': 28, u'salesman': 12, u'other': 105, u'lawyer': 12, u'engineer': 67}
"""

用户的职业分布图

下面进行电影年龄分析

注意到电影数据中有些数据不归整,需要进行解析处理,如缺失年份的情况下将其设置为1900,然后后续处理中过滤掉这些数据

movie_data = sc.textFile("file:///home/chenjie/ml-100k/u.item")
print movie_data.first()#1|Toy Story (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Toy%20Story%20(1995)|0|0|0|1|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0num_movies = movie_data.count()
print "Movie: %d" % num_movies#Movie: 1682def conver_year(x):try:return int(x[-4:])except :return 1900#若数据缺失年份则将其设为1900。在后续处理中会过滤掉这类数据movie_fields = movie_data.map(lambda lines: lines.split("|"))
years = movie_fields.map(lambda fields: fields[2]).map(lambda x : conver_year(x))
years_filtered = years.filter(lambda x : x != 1900)movie_ages = years_filtered.map(lambda yr: 2017-yr).countByValue()
values = movie_ages.values()
bins = movie_ages.keys()
matplotlib.pyplot.hist(values, bins=bins, color='green', normed=True)
fig = matplotlib.pyplot.gcf()
fig.set_size_inches(16,10)
matplotlib.pyplot.show()

电影的年龄分布

5、评级数据分析

自己实现统计功能或者使用states函数

rating_data = sc.textFile("file:///home/chenjie/ml-100k/u.data")
print rating_data.first()
num_ratings = rating_data.count()
print "评分:%d条" % num_ratings#196  242 3   881250949
#评分:100000条rating_data_fields = rating_data.map(lambda line : line.split("\t"))
ratings = rating_data_fields.map(lambda fields : int(fields[2]))
max_rating = ratings.reduce(lambda x, y : max (x,y))
min_rating = ratings.reduce(lambda x,y : min(x,y))
mean_rating = ratings.reduce(lambda x,y : x+y) / num_ratings ating_data = sc.textFile("file:///home/chenjie/ml-100k/u.data")
print rating_data.first()
num_ratings = rating_data.count()
print "评分:%d条" % num_ratings#196  242 3   881250949
#评分:100000条rating_data_fields = rating_data.map(lambda line : line.split("\t"))
ratings = rating_data_fields.map(lambda fields : int(fields[2]))
max_rating = ratings.reduce(lambda x, y : max (x,y))
min_rating = ratings.reduce(lambda x,y : min(x,y))
mean_rating = ratings.reduce(lambda x,y : x+y) / num_ratings
median_rating  = np.median(ratings.collect())user_data = sc.textFile("file:///home/chenjie/ml-100k/u.user")
user_fields = user_data.map(lambda line: line.split("|"))
num_users = user_fields.map(lambda fields: fields[0]).count()
ratings_per_user = num_ratings /  num_users
movie_data = sc.textFile("file:///home/chenjie/ml-100k/u.item")
num_movies = movie_data.count()
ratings_per_movie = num_ratings / num_movies
print max_rating
print min_rating
print mean_rating
print median_rating
print ratings_per_user
print ratings_per_movieratings.stats()
#Spark自带统计函数count_by_rating = ratings.countByValue()
x_axis = np.array(count_by_rating.values())
y_axis = np.array([float(c) for c in count_by_rating.values()])
y_axis_normed = y_axis / y_axis.sum()
pos = np.arange(len(x_axis))
width = 1.0
import matplotlib.pyplot as plt
plt.bar(pos, y_axis_normed, width, color='green')
plt.xticks(rotation=30)
fig = plt.gcf()
fig.set_size_inches(16, 10)
plt.show()

电影评级分布

rating_data = sc.textFile("file:///home/chenjie/ml-100k/u.data")
print rating_data.first()
rating_data_fields = rating_data.map(lambda line : line.split("\t"))
print rating_data_fields.first()
user_ratings_grouped = rating_data_fields.map(lambda fields : ( int (fields[0]), int(fields[2]) ) ).groupByKey()
user_ratings_buuser = user_ratings_grouped.map(lambda (k,v) : (k, len(v)))
user_ratings_buuser.take(5)
user_ratings_buuser_local = user_ratings_buuser.map(lambda (k,v) : v).collect()
import matplotlib.pyplot as plt
plt.hist(user_ratings_buuser_local, bins=200, color='green', normed=True)
fig = plt.gcf()
fig.set_size_inches(16,10)
plt.show()

各用户的电影评级分布图

《Spark机器学习》笔记——基于MovieLens数据集使用Spark进行电影数据分析相关推荐

  1. 机器学习笔记:常用数据集之scikit-learn在线下载开源数据集

    目录 1. 前言 2. 来自真实世界的开源数据集 3. 函数接口 4. 使用代码示例 例1 kddcup99数据集 例2 20类新闻分类数据集 例3 带标签的人脸数据集 1. 前言 机器学习算法是以数 ...

  2. 机器学习笔记:常用数据集之scikit-learn内置玩具数据集

    目录 1. 前言 2. Scikit-learn内置数据集 3. 数据加载示例 例1:鸢尾花数据集 例2:糖尿病数据集 例3:手写数字数据集 1. 前言 机器学习算法是以数据为粮食的,所以机器学习开发 ...

  3. 机器学习Tensorflow基于MNIST数据集识别自己的手写数字(读取和测试自己的模型)

    机器学习Tensorflow基于MNIST数据集识别自己的手写数字(读取和测试自己的模型)

  4. movielens数据集导入mysql_GitHub - Colaplusice/movielens_recommend: 基于movielens数据集的电影推荐系统...

    毕业设计--基于Django的电影推荐系统和论坛 说明 注册普通用户通过web界面来设置,创建创建用户通过creeatsuperuser创建.下文有详细命令 导入电影信息通过insert_movies ...

  5. 【机器学习】基于天气数据集的XGBoost分类与预测

    目录 一.学习知识点概要 二.学习内容 代码 1.导入库 2.对离散变量进行编码 3.利用 XGBoost 进行训练与测试 4.利用 XGBoost 进行特征选择 5.模型调参 三.学习问题与解答 四 ...

  6. spark机器学习笔记:(五)用Spark Python构建分类模型(下)

    声明:版权所有,转载请联系作者并注明出处  http://blog.csdn.net/u013719780?viewmode=contents 博主简介:风雪夜归子(英文名:Allen),机器学习算法 ...

  7. 机器学习笔记-基于逻辑回归的分类预测

    天池学习笔记:AI训练营机器学习-阿里云天池 基于逻辑回归的分类预测 1 逻辑回归的介绍和应用 1.1 逻辑回归的介绍 逻辑回归(Logistic regression,简称LR)虽然其中带有&quo ...

  8. python逻辑回归训练预测_[Python] 机器学习笔记 基于逻辑回归的分类预测

    导学问题 什么是逻辑回归(一),逻辑回归的推导(二 3),损失函数的推导(二 4) 逻辑回归与SVM的异同 逻辑回归和SVM都用来做分类,都是基于回归的概念 SVM的处理方法是只考虑 support ...

  9. 机器学习笔记 - 基于JavaScript的顶级机器学习框架

    1.概述 虽然 Python 和 C++编程语言已成为机器学习框架的流行选择,但 JavaScript 也并不落后.环顾四周,可能会发现 JavaScript 框架也已在 AI 中实现.事实上,根据 ...

最新文章

  1. cfl3d linux 编译,CMake build system for cfl3d
  2. 如何利用C#开发“扫雷”小游戏
  3. tcp 四次挥手_TCP三次握手和四次挥手
  4. 使用shiro框架,注销问题的解决
  5. 2013年蓝桥杯软件大赛预赛java本科b组答案_2013年蓝桥杯软件大赛预赛C本科B组试题...
  6. 23 CO配置-控制-产品成本控制-成本对象控制-检查定单类型
  7. 自动驾驶专题研究报告:自动驾驶产业链全梳理
  8. 解决java.lang.OutOfMemoryError: unable to create new native thread问题
  9. Codeforces 61B【怪在读题】
  10. 即时战略类游戏:北加尔Northgard for Mac中文版
  11. 简单的python的socket编程实例
  12. python,用pycharm写的评分系统
  13. 线性分式变换(linear fractional transformation)
  14. 费解的数字 递推+位运算
  15. el-table单元格中加上横向柱状图
  16. C1/C1/C2 カバレッジについて
  17. win10注册mscomm32.ocx失败
  18. 小米手机深陷“返修门” 售后成软肋
  19. SurfaceView和View最本质的区别
  20. 隧道技术(Tunneling)

热门文章

  1. 刀剑无双服务器显示404,刀剑无双开服表
  2. 小米6显示服务器出错,从小米6到小米10,为何小米手机都会出现Wi-Fi断流的问题?...
  3. 小米上市,雷军是否会成为中国新首富?
  4. SqlServer 一段文本中获取11位的手机号码
  5. Apple Store 的翻新机怎样?
  6. vsftp 虚拟账号部署
  7. DCDC直流 400W 15A升压变换器 恒流电源 电源变压器升压模块
  8. nodejs默认设置首页
  9. Jquery特效--收集
  10. 打开word文档总提示进入安全模式的解决方法