本课题中使用的是anaconda中的jupyter notebook编译器,使用这个anaconda的优势在于安装它的同时会打包安装许多必要的库(library),例如在后面会被使用到的pandas库。并且在安装Anaconda的同时,python的运行环境也会被一并配置好,这样可以帮助使用者省去一些不必要的麻烦。Anaconda可以在https://www。continuum。io/downloads中下载。[7]
算法首先需要做的是导入数据,将下载数据集解压到数据文件夹,打开anaconda中的jupyter notebook然后输入以下代码:
import os
import pandas as pd
import sys
data_folder = os。path。join(os。path。expanduser("D:"), "python")
user_actions_filename = os。path。join(data_folder, "mars_tianchi_user_actions。csv")
其中要确保user_actions_filename指向mars_tianchi_user_actions。csv文件解压后所在的文件夹。
用pandas加载数据文献综述
虽然数据文件mars_tianchi_user_actions原本就有一个很好的形态,但是我们还是需要调整pandas。read_csv的一些默认参数来做一些调整。由于源文件没有标题行,也就是说这个文件的从第一行开始就是数据,所以我们需要设置列名。加载文件时,我们用header=None语句告诉pandas不要将第一行读取为标题,然后设置列名。[8]以下是代码:
all_users_actions = pd。read_csv(user_actions_filename, header=None,names=["user_id", "song_id", "gmt_create", "action_type","use_datetime"])
通过使用head()语句可以来查看前几条代码:
all_users_actions。head(10)
图1 数据展示图
稀疏的矩阵格式
一般在数据挖掘过程中我们使用的是一种稀疏的数据格式,其中每一行代表一个用户,每一列代表用户对歌曲的行为。在本文使用的数据集中包含349946个用户以及其对10278首歌曲的行为记录,这就意味着如果按照一般格式来储存数据会遇到一些问题,因为矩阵将会很大。而且面对如此庞大的矩阵,算法在运算上也会遇到很多麻烦。不过这样的矩阵有这一种特性,在这样的矩阵中有很多单元格是空的。也就是说,很多用户在大多数的歌曲上是没有行为的。例如编号为1的用户在编号为1的歌曲上有可能是没有行为的。
我们使用的数据集所给出的是一种更加紧凑的全矩阵格式,任意不在数据集中的用户歌曲组合会被假设不存在,而不是在内存中储存一推零。这样的操作可以节省大量的空间,这样的类型格式被称为稀疏的矩阵格式(sparse matrix format)。一般来说如果你预计数据集中有百分之六十以上为空或者为零,那么使用稀疏的矩阵格式占用的内存比较少。
在稀疏矩阵上做运算时,那些为零或者为空的信息会被忽略。我们常把重点放在现有的数据上,计算比较这些数据。相反,为零或者为空的数据不会被关注。