一、 LSTM网络原理
- 要点介绍
(1)LSTM网络用来处理带“序列”(sequence)性质的数据,比如时间序列的数据,像每天的股价走势情况,机械振动信号的时域波形,以及类似于自然语言这种本身带有顺序性质的由有序单词组合的数据。
(2)LSTM本身不是一个独立存在的网络结构,只是整个神经网络的一部分,即由LSTM结构取代原始网络中的隐层单元部分。
(3)LSTM网络具有“记忆性”。其原因在于不同“时间点”之间的网络存在连接,而不是单个时间点处的网络存在前馈或者反馈。如下图2中的LSTM单元(隐层单元)所示。图3是不同时刻情况下的网络展开图。图中虚线连接代表时刻,“本身的网络”结构连接用实线表示。
2.LSTM单元结构图
图4,5是现在比较常用的LSTM单元结构示意图:
其主要结构成分包含如下:
(1)输入节点input node:接受上一时刻隐层单元的输出及当前时刻是样本输入;
(2)输入门input gate:可以看到输入门会和输入节点的值相乘,组成LSTM中internal state单元值的一部分,当门的输出为1时,输入节点的激活值全部流向internal state,当门的输出为0时,输入节点的值对internal state没有影响。
(3)内部状态internal state。
(4)遗忘门forget gate:用于刷新internal state的状态,控制internal state的上一状态对当前状态的影响。
各节点及门与隐藏单元输出的关系参见图4,图5所示。
二、代码示例
1.示例介绍
主要以今年参加的“2016年阿里流行音乐趋势预测”为例。
时间过得很快,今天已是第二赛季的最后一天了,我从5.18开始接触赛题,到6.14上午10点第一赛季截止,这一期间,由于是线下赛,可以用到各种模型,而自已又是做深度学习(deep learning)方向的研究,所以选择了基于LSTM的循环神经网络模型,结果也很幸运,进入到了第二赛季。开始接触深度学习也有大半年了,能够将自已所学用到这次真正的实际生活应用中,结果也还可以,自已感觉很欣慰。突然意识到,自已学习生涯这么多年,我想“学有所成,学有所用”该是我今后努力的方向和动力了吧。
下面我简单的介绍一下今年的赛题:
官方给的“输入”:2张表,一张是用户行为表(时间跨度20150301-20150830)mars_tianchi_user_actions,主要描述用户对歌曲的收藏,下载,播放等行为,一张是歌曲信息表mars_tianchi_songs,主要用来描述歌曲所属的艺人,及歌曲的相关信息,如发行时间,初始热度,语言等。
样例:
样例:
官方要求“输出”:预测随后2个月(20150901-20151030)每个歌手每天的播放量。输出格式:
2.初赛所用模型思路
由于是对歌手的播放量进行预测,所以直接对每个歌手的“播放量”这一对象进行统计,查看在20150301-20151030这8个月内歌手的播放量变化趋势,并以每天的播放量,连续3天的播放均值,连续3天的播放方差,作为一个时间点的样本,“滑动”构建神经网络的训练集。网络的构成如下:
(1)输入层:3个神经元,分别代表播放量,播放均值,播放方差;
(2)第一隐层:LSTM结构单元,带有35个LSTM单元;
(3)第二隐层:LSTM结构单元,带有10个LSTM单元;
(4)输出层:3个神经元,代表和输入层相同的含义。
目标函数:重构误差。
下图是某些歌手的播放统计曲线:
2.预测结果
蓝色代表歌手真实的播放曲线,绿色代表预测曲线:
三、代码
运行环境:windows下的spyder
语言:python 2.7,以及Keras深度学习库。
由于看这个赛题前,没有一点Python基础,所以也是边想思路边学Python,对Python中的数据结构不怎么了解,所以代码写得有点烂。但整个代码是可以运行无误的。这也是初赛时代码的最终版本。
<code class="hljs vala has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># -*- coding: utf-8 -*-</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">""" Created on Wed Jun 01 16:34:45 2016 @author: Richer """</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#%%修改记录</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#1.将最后一层激活函数改为线性</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#2.歌手播放曲线以歌曲量均值化(被第 4 点替换掉了)</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#3.加入均值滤波 和 均值特征</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#4.分别对每个歌手进行归一化处理(每个歌手之间相差太大了)</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#5.对歌手进行聚类(效果不好)</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#%% 时间序列及字典</span> from __future__ import division import pandas as pd import pdb <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#import time</span> _DEBUG = False _ISTEST = False tempList = pd.date_range(start = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'20150301'</span>,end = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'20150830'</span>) i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> dateList = [] #给出的数据集所在的时间序列 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i < len(tempList): strTemp = str(tempList[i])[:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>] strTemp = strTemp.replace(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'-'</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">''</span>) dateList.append(strTemp) i = i + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> recDict = {}.fromkeys(dateList,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) # 给出的数据集所在的时间序列字典 del tempList,i,strTemp tempList = pd.date_range(start = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'20150831'</span>, end = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'20151030'</span>) i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> objDateL = [] #要预测的目标时间序列 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i < len(tempList): strTemp = str(tempList[i])[:<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>] strTemp = strTemp.replace(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'-'</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">''</span>) objDateL.append(strTemp) i += <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> del strTemp, i <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">## 异常数据信息</span> newSongExcep = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> # 用户表中出现的新歌曲 userDsExcep = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> # 用户表行为不在<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">20150301</span>-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">20150830</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#%% 表处理---歌曲艺人数据</span> from copy import deepcopy fileSong = open(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"p2_mars_tianchi_songs.csv"</span>) songData = fileSong.readlines() bigSongDict = {} # 以歌曲为中心的大表 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> songInfo in songData: songInfo = songInfo.replace(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'\n'</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">''</span>) arrayInfo = songInfo.split(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">','</span>) bigSongDict[arrayInfo[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]] = {} # 注:此处需要初始化,否则会出错 bigSongDict[arrayInfo[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'artist_id'</span>] = arrayInfo[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>] bigSongDict[arrayInfo[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'publish_time'</span>] = arrayInfo[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>] bigSongDict[arrayInfo[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'song_init_plays'</span>] = arrayInfo[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>] bigSongDict[arrayInfo[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'Language'</span>] = arrayInfo[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>] bigSongDict[arrayInfo[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'Gender'</span>] = arrayInfo[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">5</span>] bigSongDict[arrayInfo[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'nUser'</span>] = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> #用户数目 bigSongDict[arrayInfo[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'playRec'</span>] = deepcopy(recDict) #播放记录 bigSongDict[arrayInfo[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'downloadRec'</span>] = deepcopy(recDict) #下载记录 bigSongDict[arrayInfo[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'colloctRec'</span>] = deepcopy(recDict) #收藏记录 fileSong.close() del songData,arrayInfo,songInfo <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 用户行为数据</span> fileUser = open(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"p2_mars_tianchi_user_actions.csv"</span>) userData = fileUser.readlines() <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> userInfo in userData: userInfo = userInfo.replace(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'\n'</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">''</span>) arrUser = userInfo.split(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">','</span>) if (arrUser[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>] in bigSongDict): bigSongDict[arrUser[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'nUser'</span>] += <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> if arrUser[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>] == <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'1'</span>: bigSongDict[arrUser[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'playRec'</span>][arrUser[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>]] += <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> if arrUser[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>] == <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'2'</span>: bigSongDict[arrUser[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'downloadRec'</span>][arrUser[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>]] += <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> if arrUser[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>] == <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'3'</span>: bigSongDict[arrUser[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'colloctRec'</span>][arrUser[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span>]] += <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>: newSongExcep = newSongExcep + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> fileUser.close() del userData,userInfo,arrUser <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#%%统计每个艺人的播放,下载,收藏的变化曲线(20150301-20150830)</span> from collections import Counter singerDict = {} #歌手信息统计 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> songKey in bigSongDict.keys(): theArtist = bigSongDict[songKey][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'artist_id'</span>] if (theArtist in singerDict): <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># dict(Counter())会把 0 值去掉 </span> # 对应的 key 相加 singerDict[theArtist][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'playRec'</span>] = dict(Counter(singerDict[theArtist][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'playRec'</span>]) + Counter(bigSongDict[songKey][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'playRec'</span>])) singerDict[theArtist][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'downloadRec'</span>] = dict(Counter(singerDict[theArtist][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'downloadRec'</span>]) + Counter(bigSongDict[songKey][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'downloadRec'</span>])) singerDict[theArtist][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'colloctRec'</span>] = dict(Counter(singerDict[theArtist][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'colloctRec'</span>]) + Counter(bigSongDict[songKey][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'colloctRec'</span>])) singerDict[theArtist][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'nSongs'</span>] += <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>: singerDict[theArtist] = {} singerDict[theArtist][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'playRec'</span>] = deepcopy(bigSongDict[songKey][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'playRec'</span>]) singerDict[theArtist][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'downloadRec'</span>] = deepcopy(bigSongDict[songKey][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'downloadRec'</span>]) singerDict[theArtist][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'colloctRec'</span>] = deepcopy(bigSongDict[songKey][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'colloctRec'</span>]) singerDict[theArtist][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'nSongs'</span>] = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#%%将singerDict中字典转换为序列-按日期排序</span> import numpy as np singerInfoList = {} tpPlayList = [] # 播放列表 tpDownList = [] # 下载列表 tpCollectList = [] # 收藏列表 artList = [] # 歌手列表 i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> singer in singerDict.keys(): artList.append(singer) singerInfoList[singer] = {} #numSongs = singerDict[singer][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'nSongs'</span>] #对应歌手的歌曲数量 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i < len(dateList): if (dateList[i] in singerDict[singer][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'playRec'</span>].keys()): tpPlayList.append(singerDict[singer][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'playRec'</span>][dateList[i]]) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>: tpPlayList.append(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) if (dateList[i] in singerDict[singer][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'downloadRec'</span>].keys()): tpDownList.append(singerDict[singer][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'downloadRec'</span>][dateList[i]]) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>: tpDownList.append(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) if(dateList[i] in singerDict[singer][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'colloctRec'</span>].keys()): tpCollectList.append(singerDict[singer][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'colloctRec'</span>][dateList[i]]) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>: tpCollectList.append(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) i += <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> meanPlays = np.mean(tpPlayList) stdPlays = np.std(tpPlayList) singerInfoList[singer][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'meanPlay'</span>] = meanPlays singerInfoList[singer][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'stdPlay'</span>] = stdPlays singerInfoList[singer][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'maxPlay'</span>] = (abs((np.array(tpPlayList) - meanPlays) / stdPlays)).max() singerInfoList[singer][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'playRec'</span>] = deepcopy(tpPlayList) singerInfoList[singer][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'downloadRec'</span>] = deepcopy(tpDownList) singerInfoList[singer][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'colloctRec'</span>] = deepcopy(tpCollectList) del tpPlayList, tpDownList, tpCollectList tpPlayList = [] tpDownList = [] tpCollectList = [] del tpPlayList, tpDownList, tpCollectList, singer,meanPlays,stdPlays <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#%%对每个歌手的播放曲线进行FFT变换</span> import matplotlib.pyplot as plt import math <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#i = 0</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#if _ISTEST == True:</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># while i < len(singerInfoList):</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># flagY = i % 9</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># if flagY ==0:</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># plt.figure(figsize = (10,8), dpi = 150)</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># plt.suptitle('FFT process')</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># plt.subplot(3,3,flagY + 1)</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># fAmp = np.fft.fft(singerInfoList[artList[i]]['playRec']) / len(dateList)</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># plt.stem(abs(fAmp[1:(len(fAmp)/2)]))</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># i += 1</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># del fAmp</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#pdb.set_trace()</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#predictTestFFT = {} #使用FFT回归预测结果</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#playLth = 0 #选取播放序列的长度做FFT</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#chsNum = np.ones(len(singerInfoList),dtype=np.int) * 1 #选择前10个峰值做趋势预测</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">##chsNum[0] = 10</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">##chsNum[5] = 10</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">##chsNum[7] = 10</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">##chsNum[8] = 10</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">##chsNum[10] = 10</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">##chsNum[17] = 10</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">##chsNum[21] = 10</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">##chsNum[22] = 10</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#if _ISTEST == True:</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># playLth = len(dateList) - len(objDateL)</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#else:</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># playLth = len(dateList)</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#j = 0 #歌手索引</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#i = 0 #FFT索引</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#while j < len(singerInfoList):</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># i = 0</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># ampFFT = np.fft.fft(singerInfoList[artList[j]]['playRec'][:playLth]) / playLth</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># sortInd = sorted(xrange(len(ampFFT)),key = (abs(ampFFT)).__getitem__,reverse = True) #降序排列</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># chsAmp = np.zeros(chsNum[j])</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># while i < chsNum[j]:</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># chsAmp[i] = ampFFT[sortInd[i]]</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># i += 1</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># dateRcon = np.zeros((playLth + len(objDateL)))</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># ind = np.arange(0,len(dateRcon),1.0) / len(ampFFT) * (2 * np.pi)</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># for k, p in enumerate(chsAmp):</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># if k != 0:</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># p *= 2</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># dateRcon += np.real(p) * np.cos(k * ind)</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># dateRcon -= np.imag(p) * np.sin(k * ind)</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># predictTestFFT[artList[j]] = {}</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># predictTestFFT[artList[j]]['playRec'] = deepcopy((list(dateRcon))[playLth:(playLth + len(objDateL))])</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># </span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># if _ISTEST == True:</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># flagY = j % 9</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># if flagY == 0:</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># plt.figure(figsize = (10,8),dpi = 150)</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># plt.suptitle('predict test play - use fft')</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># plt.subplot(3,3,flagY + 1)</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># plt.plot(singerInfoList[artList[j]]['playRec'][playLth:(playLth + len(objDateL))],'b')</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># plt.plot(predictTestFFT[artList[j]]['playRec'],'g')</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># j += 1</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># del ampFFT,sortInd,chsAmp,dateRcon,ind</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># </span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># </span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#pdb.set_trace()</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#%% 绘制歌手播放,下载,收藏曲线</span> xVal = range(len(dateList)) #x坐标值 i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i < len(singerInfoList): # 每个歌手播放曲线 flagY = i % <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9</span> if flagY == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>: plt.figure(figsize = (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span>), dpi = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">150</span>) plt.suptitle(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'every singer average playK-downloadB-colloctR line'</span>) plt.subplot(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>,flagY + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) plt.plot(singerInfoList[artList[i]][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'playRec'</span>],<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'k'</span>) plt.plot(singerInfoList[artList[i]][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'downloadRec'</span>],<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'b'</span>) plt.plot(singerInfoList[artList[i]][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'colloctRec'</span>],<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'r'</span>) i += <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> del flagY <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#%%提取歌手的标准差信息并进行排序</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#nCls = 1 #分类数</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#clsTh = 0 #第几类</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#nSgrToCls = [] #每类的歌手数量列表</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#stdPlayList = [] #所有歌手标准差列表</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#indStdList = [] #排序后的数据在原始序列中的索引</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#i = 0</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#while i < len(artList):</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># stdPlayList.append(singerInfoList[artList[i]]['stdPlay'])</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># i += 1</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#indStdList = sorted(xrange(len(stdPlayList)),key = stdPlayList.__getitem__) #默认降序排列</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#i = 0 </span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#while i < (nCls - 1):</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># nSgrToCls.append(int(len(singerInfoList) / nCls))</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># i += 1</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#if nCls == 1:</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># nSgrToCls.append(int(len(singerInfoList)))</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#else:</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># nSgrToCls.append(int(len(singerInfoList) - (nCls - 1) * nSgrToCls[0]))</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#nObjSgr = nSgrToCls[clsTh] #目标歌手数量</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#objInd = [] #初始化-对应的索引</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#if clsTh == (nCls -1):</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># objInd = indStdList[( (nCls - 1) * nSgrToCls[0] ):]</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#else:</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># objInd = indStdList[(clsTh * nSgrToCls[0]):((clsTh + 1) * nSgrToCls[0])]</span> nObjSgr = len(singerInfoList) objInd = range(nObjSgr) <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#%% 将singerDict 的 playRec downloadRec colloctRec按时间顺序转换为list</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 且分别对每个歌手数据进行归一化</span> playList = [] #大播放列表 downList = [] # 大下载列表 collectList = [] #大收藏列表 avePlayList = [] # 播放曲线的均值滤波后曲线 varPlayList = [] #实际上是标准差曲线 i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i < nObjSgr: artSg = artList[objInd[i]] meanPlays = singerInfoList[artSg][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'meanPlay'</span>] stdPlays = singerInfoList[artSg][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'stdPlay'</span>] maxPlays = singerInfoList[artSg][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'maxPlay'</span>] playList = playList + list( (np.array(singerInfoList[artSg][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'playRec'</span>]) - meanPlays) / (stdPlays * maxPlays) ) downList = downList + singerInfoList[artSg][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'downloadRec'</span>] collectList = collectList + singerInfoList[artSg][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'colloctRec'</span>] i += <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> del meanPlays,stdPlays,maxPlays,artSg <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#所有歌手的播放下载收藏曲线放在一起</span> plt.figure(figsize = (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span>), dpi = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">150</span>) plt.plot(playList,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'k'</span>) plt.plot(downList,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'b'</span>) plt.plot(collectList,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'r'</span>) plt.title(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'overall playK-downB-colloctR'</span>) <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#相关参数(影响结果的重要参数)</span> seqLength = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span> #序列长度 testSetRate = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> #测试集比例 if<span class="hljs-constant" style="box-sizing: border-box;"> _ISTEST </span>== True: testSetRate = len(objDateL) / len(dateList) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>: testSetRate = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> lenDate = len(dateList) #给定的数据集时间长度 nSinger = nObjSgr #len(singerInfoList) #艺人数量 batchSize = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">50</span> validRate = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.2</span> aveFilter = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">4</span> # 均值滤波长度 in_out_neurons = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span> #输入输出神经元个数 firLSTM = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">35</span> #第一层神经元个数 secLSTM = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span> #第二层神经元个数 epochD = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">600</span> #迭代次数 <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#%%对播放曲线列表 playList 进行均值滤波 及 求取标准差曲线</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i < nSinger: j = i * lenDate fj = i * lenDate #起点 ej = (i + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) * lenDate #终点 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> j < ej: if j < (i * lenDate + aveFilter -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>): avePlayList.append(np.mean(playList[fj:(j+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)])) varPlayList.append(np.std(playList[fj:(j+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)])) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>: avePlayList.append(np.mean(playList[(j-aveFilter+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>):(j+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)])) varPlayList.append(np.std(playList[(j-aveFilter+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>):(j+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)])) j +=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> i +=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#均值滤波结果显示</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i < nSinger: flagY = i % <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9</span> if flagY == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>: plt.figure(figsize = (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span>), dpi =<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">150</span>) plt.suptitle(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'average filter-play-originalK filterB'</span>) plt.subplot(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>,flagY + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) stPt = i * lenDate endPt = (i + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) * lenDate plt.plot(playList[stPt:endPt],<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'k'</span>) plt.plot(avePlayList[stPt:endPt],<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'b'</span>) i += <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> dateSet = pd.DataFrame({<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"avePlay"</span>:avePlayList,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"play"</span>:playList,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"varPlay"</span>:varPlayList}) #全体数据集 dateSet.to_csv(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"originalDataSet.csv"</span>) dateSetOrigin = deepcopy(dateSet) # 原始数据集保存一份 <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 数据预处理 去均值 方差归一 缩放到[-1 1]</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#if _DEBUG == True:</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># pdb.set_trace()</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#avePlayMean = dateSet['avePlay'].mean()</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">##downMean = dateSet['down'].mean()</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#playMean = dateSet['play'].mean()</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#dateSet['avePlay'] = dateSet['avePlay'] - avePlayMean</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">##dateSet['down'] = dateSet['down'] - downMean</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#dateSet['play'] = dateSet['play'] - playMean</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#avePlayStd = dateSet['avePlay'].std()</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">##downStd = dateSet['down'].std()</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#playStd = dateSet['play'].std()</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#dateSet['avePlay'] = dateSet['avePlay'] / avePlayStd</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">##dateSet['down'] = dateSet['down'] / downStd</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#dateSet['play'] = dateSet['play'] / playStd</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#factorMax = abs(dateSet).max().max() + 0.05</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#dateSet = dateSet / factorMax</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#dateSet.to_csv("preproceeDataSet.csv")</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#所有歌手的播放曲线</span> plt.figure(figsize = (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span>), dpi = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">150</span>) plt.plot(dateSet[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'play'</span>],<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'k'</span>) plt.plot(dateSet[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'avePlay'</span>],<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'b'</span>) plt.plot(dateSet[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'varPlay'</span>],<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'g'</span>) plt.xlabel(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'index'</span>) plt.ylabel(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'playK-avePlayB'</span>) plt.title(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'overall playK-avePlayB-varPlayG - preprocessed'</span>) <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#%%训练集测试集划分</span> def load_data(data, n_prev = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">14</span>): docX, docY = [], [] <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> i in range(len(data)-n_prev): <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># pdb.set_trace()</span> docX.append(data.iloc[i:i+n_prev].as_matrix()) docY.append(data.iloc[i+n_prev].as_matrix()) <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># alsX = np.array(docX)</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># alsY = np.array(docY)</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> docX, docY def train_test_split(df, test_size = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> / <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>, seqL = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">14</span>): ntrn = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>(round(len(df) * (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> - test_size))) X_train, y_train = load_data(df.iloc[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>:ntrn],seqL) X_test, y_test = load_data(df.iloc[ntrn:],seqL) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">return</span> (X_train, y_train), (X_test, y_test) <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 训练集 测试集 划分</span> if<span class="hljs-constant" style="box-sizing: border-box;"> _DEBUG </span>== True: pdb.set_trace() <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#初值</span> (xTrain,yTrain), (xTest,yTest) = train_test_split(dateSet[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>:lenDate],testSetRate,seqLength) needPredict = [] # 需要被预测的后续序列的真实值 tempIndex = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>(round(lenDate * (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> - testSetRate))) if<span class="hljs-constant" style="box-sizing: border-box;"> _ISTEST </span>== True: needPredict.append(dateSet[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>:lenDate].iloc[tempIndex:].as_matrix()) # 三维数组,每组是一个歌手需要预测的序列 i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i < nSinger: startPt = i * lenDate endPt = (i + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) * lenDate tempData = dateSet[startPt:endPt] (xTrainTp,yTrainTp), (xTestTp,yTestTp) = train_test_split(tempData,testSetRate,seqLength) xTrain = np.vstack((xTrain,xTrainTp)) yTrain = np.vstack((yTrain,yTrainTp)) xTest = np.vstack((xTest,xTestTp)) yTest = np.vstack((yTest,yTestTp)) tempIndex = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>(round(len(tempData) * (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> - testSetRate))) if<span class="hljs-constant" style="box-sizing: border-box;"> _ISTEST </span>== True: needPredict.append(tempData.iloc[tempIndex:].as_matrix()) i += <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> X_Train = np.array(xTrain) Y_Train = np.array(yTrain) X_Test = np.array(xTest) Y_Test = np.array(yTest) del xTrain, yTrain, xTest, yTest <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#%%绘制需要被预测的数据之间的差异</span> if<span class="hljs-constant" style="box-sizing: border-box;"> _ISTEST </span>== True: i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> plt.figure(figsize = (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span>), dpi = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">150</span>) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i < nSinger: orgValue = pd.DataFrame(needPredict[i]) plt.plot(orgValue[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]) i += <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> del orgValue plt.suptitle(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'need predict test data - preprocess data'</span>) <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#%% 训练算法模型</span> if<span class="hljs-constant" style="box-sizing: border-box;"> _DEBUG </span>== True: pdb.set_trace() from keras.models import Sequential from keras.layers.core import Dense, Activation from keras.layers.recurrent import LSTM from keras.callbacks import EarlyStopping model = Sequential() <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># LSTM作为第一层---输入层维度:input_dim,输出层维度:hidden_neurons</span> model.add(LSTM(firLSTM, input_dim=in_out_neurons, input_length=seqLength,return_sequences=True)) model.add(LSTM(secLSTM,return_sequences=False)) <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#model.add(LSTM(thiLSTM)) </span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 标准的一维全连接层---输出:in_out_neurons,输入:input_dim</span> model.add(Dense(in_out_neurons,activation=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'linear'</span>)) model.compile(loss=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"mse"</span>, optimizer=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"rmsprop"</span>) # mse mean_squared_error <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#提前中断训练</span> earlyStopping = EarlyStopping(monitor = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'val_loss'</span>, patience = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>) <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># X_Train三维数组,每组是一个序列</span> hist = model.fit(X_Train, Y_Train, batch_size=batchSize, nb_epoch=epochD, verbose=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, shuffle = False,validation_split=validRate,callbacks = [earlyStopping]) <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#print(hist.history)</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#对训练集进行预测-调试用</span> predictTrain = model.predict(X_Train) # 二维数组,每一行是一组预测值 predictDF = pd.DataFrame(predictTrain) Y_TrainDF = pd.DataFrame(Y_Train) plt.figure(figsize = (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span>), dpi = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">150</span>) plt.plot(list(predictDF[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]),<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'g'</span>) plt.plot(list(Y_TrainDF[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]),<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'b'</span>) plt.title(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'train set predict check'</span>) if<span class="hljs-constant" style="box-sizing: border-box;"> _DEBUG </span>== True: pdb.set_trace() <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#%%预测</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> j = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> predictTest = {} # 所有歌手最终预测结果 <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> j < nSinger: artSg = artList[objInd[j]] predictTest[artSg] = {} predictTest[artSg][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'playRec'</span>] = [] predictTest[artSg][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'avePlay'</span>] = [] predictTest[artSg][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'varPlay'</span>] = [] j += <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> del artSg if<span class="hljs-constant" style="box-sizing: border-box;"> _DEBUG </span>== True: pdb.set_trace() i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> j = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> lastIndex = len(X_Train) / nSinger <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> j < nSinger: lastData = np.array([X_Train[<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>(lastIndex * (j+<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)]]) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i < len(objDateL): #预测天数 predictTp = model.predict(lastData) artSg = artList[objInd[j]] predictTest[artSg][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'varPlay'</span>].append(predictTp[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>][<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>]) predictTest[artSg][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'playRec'</span>].append(predictTp[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>][<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]) predictTest[artSg][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'avePlay'</span>].append(predictTp[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>][<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]) lastData = np.array([np.vstack((lastData[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>][<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>:],predictTp))]) i += <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> j += <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> del lastData, predictTp del artSg <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 预测结果分析---数据还原之前</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> xIndex = range(len(objDateL)) if<span class="hljs-constant" style="box-sizing: border-box;"> _ISTEST </span>== True: <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i < nSinger: # 播放预测曲线 flagY = i % <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9</span> if flagY == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>: plt.figure(figsize = (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span>), dpi = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">150</span>) plt.suptitle(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'test set: predict play'</span>) plt.subplot(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>,flagY + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) orgValue = pd.DataFrame(needPredict[i]) # needPredict三维数组,每组是一个歌手需要预测的序列值 artSg = artList[objInd[i]] plt.plot(xIndex,predictTest[artSg][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'playRec'</span>],<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'g'</span>) plt.plot(xIndex,orgValue[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>],<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'b'</span>) i += <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> del orgValue del artSg i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> if<span class="hljs-constant" style="box-sizing: border-box;"> _ISTEST </span>== True: <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i < nSinger: # 平均值预测曲线 flagY = i % <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9</span> if flagY == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>: plt.figure(figsize = (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span>), dpi = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">150</span>) plt.suptitle(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'test-predict avePlay'</span>) plt.subplot(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>,flagY + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) orgValue = pd.DataFrame(needPredict[i]) artSg = artList[objInd[i]] plt.plot(xIndex,predictTest[artSg][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'avePlay'</span>],<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'g'</span>) plt.plot(xIndex,orgValue[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>],<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'b'</span>) i += <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> del orgValue del artSg <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#i = 0</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#while i <nSinger: # 收藏预测曲线</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># flagY = i % 9</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># if flagY == 0:</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># plt.figure(figsize = (10,8), dpi = 150)</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># plt.subplot(3,3,flagY +1)</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># orgValue = pd.DataFrame(needPredict[i])</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># plt.plot(xIndex,predictTest[artList[i]]['colloctRec'],'g')</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># plt.plot(xIndex,orgValue[0],'b')</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># </span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># i += 1</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># del orgValue</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#plt.suptitle('test-predict colloct')</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#%%预测---还原到原始数据集</span> if<span class="hljs-constant" style="box-sizing: border-box;"> _ISTEST </span>== True: i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i < nSinger: flagY = i % <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9</span> if flagY == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>: plt.figure(figsize = (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span>), dpi =<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">150</span>) plt.suptitle(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'test-predict play- back to original'</span>) plt.subplot(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>,flagY + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) artSg = artList[objInd[i]] meanPlays = singerInfoList[artSg][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'meanPlay'</span>] stdPlays = singerInfoList[artSg][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'stdPlay'</span>] maxPlays = singerInfoList[artSg][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'maxPlay'</span>] orgValue = ((pd.DataFrame(needPredict[i]))[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]) * maxPlays * stdPlays + meanPlays aftValue = ((pd.DataFrame(predictTest[artSg][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'playRec'</span>]))[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]) * maxPlays * stdPlays + meanPlays plt.plot(xIndex,orgValue,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'b'</span>) plt.plot(xIndex,aftValue,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'g'</span>) i +=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> del orgValue, aftValue del artSg <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#使用 aveplay 预测真实 play</span> if<span class="hljs-constant" style="box-sizing: border-box;"> _ISTEST </span>== True: i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i < nSinger: flagY = i % <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">9</span> if flagY == <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>: plt.figure(figsize = (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">10</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">8</span>), dpi =<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">150</span>) plt.suptitle(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'use avePlay to predict real play line'</span>) plt.subplot(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>,flagY + <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) artSg = artList[objInd[i]] meanPlays = singerInfoList[artSg][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'meanPlay'</span>] stdPlays = singerInfoList[artSg][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'stdPlay'</span>] maxPlays = singerInfoList[artSg][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'maxPlay'</span>] orgValue = ((pd.DataFrame(needPredict[i]))[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]) * maxPlays * stdPlays + meanPlays aftValue = ((pd.DataFrame(predictTest[artSg][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'avePlay'</span>]))[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]) * maxPlays * stdPlays + meanPlays plt.plot(xIndex,orgValue,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'b'</span>) plt.plot(xIndex,aftValue,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'g'</span>) i +=<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> del orgValue, aftValue del artSg <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#%%融合svr</span> svrResult = {} fileSVR = open(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"svr.csv"</span>) svrData = fileSVR.readlines() <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> svrInfo in svrData: svrInfo = svrInfo.replace(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'\n'</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">''</span>) arrInfo = svrInfo.split(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">','</span>) svrResult[arrInfo[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]] = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>(arrInfo[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]) fileSVR.close() del svrData,svrInfo,arrInfo <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#%% 评价指标</span> if<span class="hljs-constant" style="box-sizing: border-box;"> _ISTEST </span>== True: singerF = [] # 每个歌手的评价指标值 F sumF = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i < nSinger: artSg = artList[objInd[i]] meanPlays = singerInfoList[artSg][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'meanPlay'</span>] stdPlays = singerInfoList[artSg][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'stdPlay'</span>] maxPlays = singerInfoList[artSg][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'maxPlay'</span>] orgValue = ((pd.DataFrame(needPredict[i]))[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]) * maxPlays * stdPlays + meanPlays aftValue = ((pd.DataFrame(predictTest[artSg][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'playRec'</span>]))[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]) * maxPlays * stdPlays + meanPlays tempArr = (np.array(aftValue) - np.array(orgValue)) / (np.array(orgValue)) tempS = ((tempArr * tempArr).sum()) / len(objDateL) theta = math.sqrt(tempS) tempFi = math.sqrt((np.array(orgValue)).sum()) sumF = sumF + (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>-theta) * tempFi singerF.append((<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>-theta) * tempFi) i += <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> del orgValue,aftValue,tempArr del artSg if<span class="hljs-constant" style="box-sizing: border-box;"> _ISTEST </span>== True: singerFA = [] # 每个歌手的评价指标值 F sumF = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i < nSinger: artSg = artList[objInd[i]] meanPlays = singerInfoList[artSg][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'meanPlay'</span>] stdPlays = singerInfoList[artSg][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'stdPlay'</span>] maxPlays = singerInfoList[artSg][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'maxPlay'</span>] orgValue = ((pd.DataFrame(needPredict[i]))[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>]) * maxPlays * stdPlays + meanPlays aftValue = (((pd.DataFrame(predictTest[artSg][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'playRec'</span>]))[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]) * maxPlays * stdPlays + meanPlays) * <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span> + svrResult[artSg] * <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span> tempArr = (np.array(aftValue) - np.array(orgValue)) / (np.array(orgValue)) tempS = ((tempArr * tempArr).sum()) / len(objDateL) theta = math.sqrt(tempS) tempFi = math.sqrt((np.array(orgValue)).sum()) sumF = sumF + (<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>-theta) * tempFi singerFA.append((<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>-theta) * tempFi) i += <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> del orgValue,aftValue,tempArr del artSg <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># resF = pd.DataFrame({"singerf":singerF})</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># resF.to_csv("singerF.csv")</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#%%使用均值预测后的评价指标值</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#singerF_AVG = [] # 每个歌手的评价指标值 F</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#sumF = 0</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#i = 0</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#while i < nSinger:</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># meanPlays = singerInfoList[artList[i]]['meanPlay']</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># stdPlays = singerInfoList[artList[i]]['stdPlay']</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># maxPlays = singerInfoList[artList[i]]['maxPlay']</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># </span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># orgValue = ((pd.DataFrame(needPredict[i]))[1]) * maxPlays * stdPlays + meanPlays</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># aftValue = ((pd.DataFrame(predictTest[artList[i]]['avePlay']))[0]) * maxPlays * stdPlays + meanPlays</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># </span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># tempArr = (np.array(aftValue) - np.array(orgValue)) / (np.array(orgValue))</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># tempS = ((tempArr * tempArr).sum()) / len(objDateL)</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># theta = math.sqrt(tempS)</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># </span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># tempFi = math.sqrt((np.array(orgValue)).sum())</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># sumF = sumF + (1-theta) * tempFi</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># </span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># singerF_AVG.append((1-theta) * tempFi)</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># </span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># i += 1</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># del orgValue,aftValue,tempArr</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#sum(singerF_AVG[:36]) + sum(singerF_AVG[37:56]) + sum(singerF_AVG[57:])</span> <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#%%写入到预测文件</span> if<span class="hljs-constant" style="box-sizing: border-box;"> _ISTEST </span>== False: import csv resFile = open(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"mars_tianchi_artist_plays_predict.csv"</span>,<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"wb"</span>) writerRes = csv.writer(resFile) i = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span> j = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> i < nSinger: artSg = artList[objInd[i]] meanPlays = singerInfoList[artSg][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'meanPlay'</span>] stdPlays = singerInfoList[artSg][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'stdPlay'</span>] maxPlays = singerInfoList[artSg][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'maxPlay'</span>] aftValue = (((pd.DataFrame(predictTest[artSg][<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'playRec'</span>]))[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>]) * maxPlays * stdPlays + meanPlays) * <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span> + svrResult[artSg] * <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0.5</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> j < len(objDateL): oneLineData = [artSg,str(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>(aftValue[j])),objDateL[j]] writerRes.writerow(oneLineData) del oneLineData j += <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> del aftValue j = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> i += <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span> resFile.close() del artSg </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li><li style="box-sizing: border-box; padding: 0px 5px;">66</li><li style="box-sizing: border-box; padding: 0px 5px;">67</li><li style="box-sizing: border-box; padding: 0px 5px;">68</li><li style="box-sizing: border-box; padding: 0px 5px;">69</li><li style="box-sizing: border-box; padding: 0px 5px;">70</li><li style="box-sizing: border-box; padding: 0px 5px;">71</li><li style="box-sizing: border-box; padding: 0px 5px;">72</li><li style="box-sizing: border-box; padding: 0px 5px;">73</li><li style="box-sizing: border-box; padding: 0px 5px;">74</li><li style="box-sizing: border-box; padding: 0px 5px;">75</li><li style="box-sizing: border-box; padding: 0px 5px;">76</li><li style="box-sizing: border-box; padding: 0px 5px;">77</li><li style="box-sizing: border-box; padding: 0px 5px;">78</li><li style="box-sizing: border-box; padding: 0px 5px;">79</li><li style="box-sizing: border-box; padding: 0px 5px;">80</li><li style="box-sizing: border-box; padding: 0px 5px;">81</li><li style="box-sizing: border-box; padding: 0px 5px;">82</li><li style="box-sizing: border-box; padding: 0px 5px;">83</li><li style="box-sizing: border-box; padding: 0px 5px;">84</li><li style="box-sizing: border-box; padding: 0px 5px;">85</li><li style="box-sizing: border-box; padding: 0px 5px;">86</li><li style="box-sizing: border-box; padding: 0px 5px;">87</li><li style="box-sizing: border-box; padding: 0px 5px;">88</li><li style="box-sizing: border-box; padding: 0px 5px;">89</li><li style="box-sizing: border-box; padding: 0px 5px;">90</li><li style="box-sizing: border-box; padding: 0px 5px;">91</li><li style="box-sizing: border-box; padding: 0px 5px;">92</li><li style="box-sizing: border-box; padding: 0px 5px;">93</li><li style="box-sizing: border-box; padding: 0px 5px;">94</li><li style="box-sizing: border-box; padding: 0px 5px;">95</li><li style="box-sizing: border-box; padding: 0px 5px;">96</li><li style="box-sizing: border-box; padding: 0px 5px;">97</li><li style="box-sizing: border-box; padding: 0px 5px;">98</li><li style="box-sizing: border-box; padding: 0px 5px;">99</li><li style="box-sizing: border-box; padding: 0px 5px;">100</li><li style="box-sizing: border-box; padding: 0px 5px;">101</li><li style="box-sizing: border-box; padding: 0px 5px;">102</li><li style="box-sizing: border-box; padding: 0px 5px;">103</li><li style="box-sizing: border-box; padding: 0px 5px;">104</li><li style="box-sizing: border-box; padding: 0px 5px;">105</li><li style="box-sizing: border-box; padding: 0px 5px;">106</li><li style="box-sizing: border-box; padding: 0px 5px;">107</li><li style="box-sizing: border-box; padding: 0px 5px;">108</li><li style="box-sizing: border-box; padding: 0px 5px;">109</li><li style="box-sizing: border-box; padding: 0px 5px;">110</li><li style="box-sizing: border-box; padding: 0px 5px;">111</li><li style="box-sizing: border-box; padding: 0px 5px;">112</li><li style="box-sizing: border-box; padding: 0px 5px;">113</li><li style="box-sizing: border-box; padding: 0px 5px;">114</li><li style="box-sizing: border-box; padding: 0px 5px;">115</li><li style="box-sizing: border-box; padding: 0px 5px;">116</li><li style="box-sizing: border-box; padding: 0px 5px;">117</li><li style="box-sizing: border-box; padding: 0px 5px;">118</li><li style="box-sizing: border-box; padding: 0px 5px;">119</li><li style="box-sizing: border-box; padding: 0px 5px;">120</li><li style="box-sizing: border-box; padding: 0px 5px;">121</li><li style="box-sizing: border-box; padding: 0px 5px;">122</li><li style="box-sizing: border-box; padding: 0px 5px;">123</li><li style="box-sizing: border-box; padding: 0px 5px;">124</li><li style="box-sizing: border-box; padding: 0px 5px;">125</li><li style="box-sizing: border-box; padding: 0px 5px;">126</li><li style="box-sizing: border-box; padding: 0px 5px;">127</li><li style="box-sizing: border-box; padding: 0px 5px;">128</li><li style="box-sizing: border-box; padding: 0px 5px;">129</li><li style="box-sizing: border-box; padding: 0px 5px;">130</li><li style="box-sizing: border-box; padding: 0px 5px;">131</li><li style="box-sizing: border-box; padding: 0px 5px;">132</li><li style="box-sizing: border-box; padding: 0px 5px;">133</li><li style="box-sizing: border-box; padding: 0px 5px;">134</li><li style="box-sizing: border-box; padding: 0px 5px;">135</li><li style="box-sizing: border-box; padding: 0px 5px;">136</li><li style="box-sizing: border-box; padding: 0px 5px;">137</li><li style="box-sizing: border-box; padding: 0px 5px;">138</li><li style="box-sizing: border-box; padding: 0px 5px;">139</li><li style="box-sizing: border-box; padding: 0px 5px;">140</li><li style="box-sizing: border-box; padding: 0px 5px;">141</li><li style="box-sizing: border-box; padding: 0px 5px;">142</li><li style="box-sizing: border-box; padding: 0px 5px;">143</li><li style="box-sizing: border-box; padding: 0px 5px;">144</li><li style="box-sizing: border-box; padding: 0px 5px;">145</li><li style="box-sizing: border-box; padding: 0px 5px;">146</li><li style="box-sizing: border-box; padding: 0px 5px;">147</li><li style="box-sizing: border-box; padding: 0px 5px;">148</li><li style="box-sizing: border-box; padding: 0px 5px;">149</li><li style="box-sizing: border-box; padding: 0px 5px;">150</li><li style="box-sizing: border-box; padding: 0px 5px;">151</li><li style="box-sizing: border-box; padding: 0px 5px;">152</li><li style="box-sizing: border-box; padding: 0px 5px;">153</li><li style="box-sizing: border-box; padding: 0px 5px;">154</li><li style="box-sizing: border-box; padding: 0px 5px;">155</li><li style="box-sizing: border-box; padding: 0px 5px;">156</li><li style="box-sizing: border-box; padding: 0px 5px;">157</li><li style="box-sizing: border-box; padding: 0px 5px;">158</li><li style="box-sizing: border-box; padding: 0px 5px;">159</li><li style="box-sizing: border-box; padding: 0px 5px;">160</li><li style="box-sizing: border-box; padding: 0px 5px;">161</li><li style="box-sizing: border-box; padding: 0px 5px;">162</li><li style="box-sizing: border-box; padding: 0px 5px;">163</li><li style="box-sizing: border-box; padding: 0px 5px;">164</li><li style="box-sizing: border-box; padding: 0px 5px;">165</li><li style="box-sizing: border-box; padding: 0px 5px;">166</li><li style="box-sizing: border-box; padding: 0px 5px;">167</li><li style="box-sizing: border-box; padding: 0px 5px;">168</li><li style="box-sizing: border-box; padding: 0px 5px;">169</li><li style="box-sizing: border-box; padding: 0px 5px;">170</li><li style="box-sizing: border-box; padding: 0px 5px;">171</li><li style="box-sizing: border-box; padding: 0px 5px;">172</li><li style="box-sizing: border-box; padding: 0px 5px;">173</li><li style="box-sizing: border-box; padding: 0px 5px;">174</li><li style="box-sizing: border-box; padding: 0px 5px;">175</li><li style="box-sizing: border-box; padding: 0px 5px;">176</li><li style="box-sizing: border-box; padding: 0px 5px;">177</li><li style="box-sizing: border-box; padding: 0px 5px;">178</li><li style="box-sizing: border-box; padding: 0px 5px;">179</li><li style="box-sizing: border-box; padding: 0px 5px;">180</li><li style="box-sizing: border-box; padding: 0px 5px;">181</li><li style="box-sizing: border-box; padding: 0px 5px;">182</li><li style="box-sizing: border-box; padding: 0px 5px;">183</li><li style="box-sizing: border-box; padding: 0px 5px;">184</li><li style="box-sizing: border-box; padding: 0px 5px;">185</li><li style="box-sizing: border-box; padding: 0px 5px;">186</li><li style="box-sizing: border-box; padding: 0px 5px;">187</li><li style="box-sizing: border-box; padding: 0px 5px;">188</li><li style="box-sizing: border-box; padding: 0px 5px;">189</li><li style="box-sizing: border-box; padding: 0px 5px;">190</li><li style="box-sizing: border-box; padding: 0px 5px;">191</li><li style="box-sizing: border-box; padding: 0px 5px;">192</li><li style="box-sizing: border-box; padding: 0px 5px;">193</li><li style="box-sizing: border-box; padding: 0px 5px;">194</li><li style="box-sizing: border-box; padding: 0px 5px;">195</li><li style="box-sizing: border-box; padding: 0px 5px;">196</li><li style="box-sizing: border-box; padding: 0px 5px;">197</li><li style="box-sizing: border-box; padding: 0px 5px;">198</li><li style="box-sizing: border-box; padding: 0px 5px;">199</li><li style="box-sizing: border-box; padding: 0px 5px;">200</li><li style="box-sizing: border-box; padding: 0px 5px;">201</li><li style="box-sizing: border-box; padding: 0px 5px;">202</li><li style="box-sizing: border-box; padding: 0px 5px;">203</li><li style="box-sizing: border-box; padding: 0px 5px;">204</li><li style="box-sizing: border-box; padding: 0px 5px;">205</li><li style="box-sizing: border-box; padding: 0px 5px;">206</li><li style="box-sizing: border-box; padding: 0px 5px;">207</li><li style="box-sizing: border-box; padding: 0px 5px;">208</li><li style="box-sizing: border-box; padding: 0px 5px;">209</li><li style="box-sizing: border-box; padding: 0px 5px;">210</li><li style="box-sizing: border-box; padding: 0px 5px;">211</li><li style="box-sizing: border-box; padding: 0px 5px;">212</li><li style="box-sizing: border-box; padding: 0px 5px;">213</li><li style="box-sizing: border-box; padding: 0px 5px;">214</li><li style="box-sizing: border-box; padding: 0px 5px;">215</li><li style="box-sizing: border-box; padding: 0px 5px;">216</li><li style="box-sizing: border-box; padding: 0px 5px;">217</li><li style="box-sizing: border-box; padding: 0px 5px;">218</li><li style="box-sizing: border-box; padding: 0px 5px;">219</li><li style="box-sizing: border-box; padding: 0px 5px;">220</li><li style="box-sizing: border-box; padding: 0px 5px;">221</li><li style="box-sizing: border-box; padding: 0px 5px;">222</li><li style="box-sizing: border-box; padding: 0px 5px;">223</li><li style="box-sizing: border-box; padding: 0px 5px;">224</li><li style="box-sizing: border-box; padding: 0px 5px;">225</li><li style="box-sizing: border-box; padding: 0px 5px;">226</li><li style="box-sizing: border-box; padding: 0px 5px;">227</li><li style="box-sizing: border-box; padding: 0px 5px;">228</li><li style="box-sizing: border-box; padding: 0px 5px;">229</li><li style="box-sizing: border-box; padding: 0px 5px;">230</li><li style="box-sizing: border-box; padding: 0px 5px;">231</li><li style="box-sizing: border-box; padding: 0px 5px;">232</li><li style="box-sizing: border-box; padding: 0px 5px;">233</li><li style="box-sizing: border-box; padding: 0px 5px;">234</li><li style="box-sizing: border-box; padding: 0px 5px;">235</li><li style="box-sizing: border-box; padding: 0px 5px;">236</li><li style="box-sizing: border-box; padding: 0px 5px;">237</li><li style="box-sizing: border-box; padding: 0px 5px;">238</li><li style="box-sizing: border-box; padding: 0px 5px;">239</li><li style="box-sizing: border-box; padding: 0px 5px;">240</li><li style="box-sizing: border-box; padding: 0px 5px;">241</li><li style="box-sizing: border-box; padding: 0px 5px;">242</li><li style="box-sizing: border-box; padding: 0px 5px;">243</li><li style="box-sizing: border-box; padding: 0px 5px;">244</li><li style="box-sizing: border-box; padding: 0px 5px;">245</li><li style="box-sizing: border-box; padding: 0px 5px;">246</li><li style="box-sizing: border-box; padding: 0px 5px;">247</li><li style="box-sizing: border-box; padding: 0px 5px;">248</li><li style="box-sizing: border-box; padding: 0px 5px;">249</li><li style="box-sizing: border-box; padding: 0px 5px;">250</li><li style="box-sizing: border-box; padding: 0px 5px;">251</li><li style="box-sizing: border-box; padding: 0px 5px;">252</li><li style="box-sizing: border-box; padding: 0px 5px;">253</li><li style="box-sizing: border-box; padding: 0px 5px;">254</li><li style="box-sizing: border-box; padding: 0px 5px;">255</li><li style="box-sizing: border-box; padding: 0px 5px;">256</li><li style="box-sizing: border-box; padding: 0px 5px;">257</li><li style="box-sizing: border-box; padding: 0px 5px;">258</li><li style="box-sizing: border-box; padding: 0px 5px;">259</li><li style="box-sizing: border-box; padding: 0px 5px;">260</li><li style="box-sizing: border-box; padding: 0px 5px;">261</li><li style="box-sizing: border-box; padding: 0px 5px;">262</li><li style="box-sizing: border-box; padding: 0px 5px;">263</li><li style="box-sizing: border-box; padding: 0px 5px;">264</li><li style="box-sizing: border-box; padding: 0px 5px;">265</li><li style="box-sizing: border-box; padding: 0px 5px;">266</li><li style="box-sizing: border-box; padding: 0px 5px;">267</li><li style="box-sizing: border-box; padding: 0px 5px;">268</li><li style="box-sizing: border-box; padding: 0px 5px;">269</li><li style="box-sizing: border-box; padding: 0px 5px;">270</li><li style="box-sizing: border-box; padding: 0px 5px;">271</li><li style="box-sizing: border-box; padding: 0px 5px;">272</li><li style="box-sizing: border-box; padding: 0px 5px;">273</li><li style="box-sizing: border-box; padding: 0px 5px;">274</li><li style="box-sizing: border-box; padding: 0px 5px;">275</li><li style="box-sizing: border-box; padding: 0px 5px;">276</li><li style="box-sizing: border-box; padding: 0px 5px;">277</li><li style="box-sizing: border-box; padding: 0px 5px;">278</li><li style="box-sizing: border-box; padding: 0px 5px;">279</li><li style="box-sizing: border-box; padding: 0px 5px;">280</li><li style="box-sizing: border-box; padding: 0px 5px;">281</li><li style="box-sizing: border-box; padding: 0px 5px;">282</li><li style="box-sizing: border-box; padding: 0px 5px;">283</li><li style="box-sizing: border-box; padding: 0px 5px;">284</li><li style="box-sizing: border-box; padding: 0px 5px;">285</li><li style="box-sizing: border-box; padding: 0px 5px;">286</li><li style="box-sizing: border-box; padding: 0px 5px;">287</li><li style="box-sizing: border-box; padding: 0px 5px;">288</li><li style="box-sizing: border-box; padding: 0px 5px;">289</li><li style="box-sizing: border-box; padding: 0px 5px;">290</li><li style="box-sizing: border-box; padding: 0px 5px;">291</li><li style="box-sizing: border-box; padding: 0px 5px;">292</li><li style="box-sizing: border-box; padding: 0px 5px;">293</li><li style="box-sizing: border-box; padding: 0px 5px;">294</li><li style="box-sizing: border-box; padding: 0px 5px;">295</li><li style="box-sizing: border-box; padding: 0px 5px;">296</li><li style="box-sizing: border-box; padding: 0px 5px;">297</li><li style="box-sizing: border-box; padding: 0px 5px;">298</li><li style="box-sizing: border-box; padding: 0px 5px;">299</li><li style="box-sizing: border-box; padding: 0px 5px;">300</li><li style="box-sizing: border-box; padding: 0px 5px;">301</li><li style="box-sizing: border-box; padding: 0px 5px;">302</li><li style="box-sizing: border-box; padding: 0px 5px;">303</li><li style="box-sizing: border-box; padding: 0px 5px;">304</li><li style="box-sizing: border-box; padding: 0px 5px;">305</li><li style="box-sizing: border-box; padding: 0px 5px;">306</li><li style="box-sizing: border-box; padding: 0px 5px;">307</li><li style="box-sizing: border-box; padding: 0px 5px;">308</li><li style="box-sizing: border-box; padding: 0px 5px;">309</li><li style="box-sizing: border-box; padding: 0px 5px;">310</li><li style="box-sizing: border-box; padding: 0px 5px;">311</li><li style="box-sizing: border-box; padding: 0px 5px;">312</li><li style="box-sizing: border-box; padding: 0px 5px;">313</li><li style="box-sizing: border-box; padding: 0px 5px;">314</li><li style="box-sizing: border-box; padding: 0px 5px;">315</li><li style="box-sizing: border-box; padding: 0px 5px;">316</li><li style="box-sizing: border-box; padding: 0px 5px;">317</li><li style="box-sizing: border-box; padding: 0px 5px;">318</li><li style="box-sizing: border-box; padding: 0px 5px;">319</li><li style="box-sizing: border-box; padding: 0px 5px;">320</li><li style="box-sizing: border-box; padding: 0px 5px;">321</li><li style="box-sizing: border-box; padding: 0px 5px;">322</li><li style="box-sizing: border-box; padding: 0px 5px;">323</li><li style="box-sizing: border-box; padding: 0px 5px;">324</li><li style="box-sizing: border-box; padding: 0px 5px;">325</li><li style="box-sizing: border-box; padding: 0px 5px;">326</li><li style="box-sizing: border-box; padding: 0px 5px;">327</li><li style="box-sizing: border-box; padding: 0px 5px;">328</li><li style="box-sizing: border-box; padding: 0px 5px;">329</li><li style="box-sizing: border-box; padding: 0px 5px;">330</li><li style="box-sizing: border-box; padding: 0px 5px;">331</li><li style="box-sizing: border-box; padding: 0px 5px;">332</li><li style="box-sizing: border-box; padding: 0px 5px;">333</li><li style="box-sizing: border-box; padding: 0px 5px;">334</li><li style="box-sizing: border-box; padding: 0px 5px;">335</li><li style="box-sizing: border-box; padding: 0px 5px;">336</li><li style="box-sizing: border-box; padding: 0px 5px;">337</li><li style="box-sizing: border-box; padding: 0px 5px;">338</li><li style="box-sizing: border-box; padding: 0px 5px;">339</li><li style="box-sizing: border-box; padding: 0px 5px;">340</li><li style="box-sizing: border-box; padding: 0px 5px;">341</li><li style="box-sizing: border-box; padding: 0px 5px;">342</li><li style="box-sizing: border-box; padding: 0px 5px;">343</li><li style="box-sizing: border-box; padding: 0px 5px;">344</li><li style="box-sizing: border-box; padding: 0px 5px;">345</li><li style="box-sizing: border-box; padding: 0px 5px;">346</li><li style="box-sizing: border-box; padding: 0px 5px;">347</li><li style="box-sizing: border-box; padding: 0px 5px;">348</li><li style="box-sizing: border-box; padding: 0px 5px;">349</li><li style="box-sizing: border-box; padding: 0px 5px;">350</li><li style="box-sizing: border-box; padding: 0px 5px;">351</li><li style="box-sizing: border-box; padding: 0px 5px;">352</li><li style="box-sizing: border-box; padding: 0px 5px;">353</li><li style="box-sizing: border-box; padding: 0px 5px;">354</li><li style="box-sizing: border-box; padding: 0px 5px;">355</li><li style="box-sizing: border-box; padding: 0px 5px;">356</li><li style="box-sizing: border-box; padding: 0px 5px;">357</li><li style="box-sizing: border-box; padding: 0px 5px;">358</li><li style="box-sizing: border-box; padding: 0px 5px;">359</li><li style="box-sizing: border-box; padding: 0px 5px;">360</li><li style="box-sizing: border-box; padding: 0px 5px;">361</li><li style="box-sizing: border-box; padding: 0px 5px;">362</li><li style="box-sizing: border-box; padding: 0px 5px;">363</li><li style="box-sizing: border-box; padding: 0px 5px;">364</li><li style="box-sizing: border-box; padding: 0px 5px;">365</li><li style="box-sizing: border-box; padding: 0px 5px;">366</li><li style="box-sizing: border-box; padding: 0px 5px;">367</li><li style="box-sizing: border-box; padding: 0px 5px;">368</li><li style="box-sizing: border-box; padding: 0px 5px;">369</li><li style="box-sizing: border-box; padding: 0px 5px;">370</li><li style="box-sizing: border-box; padding: 0px 5px;">371</li><li style="box-sizing: border-box; padding: 0px 5px;">372</li><li style="box-sizing: border-box; padding: 0px 5px;">373</li><li style="box-sizing: border-box; padding: 0px 5px;">374</li><li style="box-sizing: border-box; padding: 0px 5px;">375</li><li style="box-sizing: border-box; padding: 0px 5px;">376</li><li style="box-sizing: border-box; padding: 0px 5px;">377</li><li style="box-sizing: border-box; padding: 0px 5px;">378</li><li style="box-sizing: border-box; padding: 0px 5px;">379</li><li style="box-sizing: border-box; padding: 0px 5px;">380</li><li style="box-sizing: border-box; padding: 0px 5px;">381</li><li style="box-sizing: border-box; padding: 0px 5px;">382</li><li style="box-sizing: border-box; padding: 0px 5px;">383</li><li style="box-sizing: border-box; padding: 0px 5px;">384</li><li style="box-sizing: border-box; padding: 0px 5px;">385</li><li style="box-sizing: border-box; padding: 0px 5px;">386</li><li style="box-sizing: border-box; padding: 0px 5px;">387</li><li style="box-sizing: border-box; padding: 0px 5px;">388</li><li style="box-sizing: border-box; padding: 0px 5px;">389</li><li style="box-sizing: border-box; padding: 0px 5px;">390</li><li style="box-sizing: border-box; padding: 0px 5px;">391</li><li style="box-sizing: border-box; padding: 0px 5px;">392</li><li style="box-sizing: border-box; padding: 0px 5px;">393</li><li style="box-sizing: border-box; padding: 0px 5px;">394</li><li style="box-sizing: border-box; padding: 0px 5px;">395</li><li style="box-sizing: border-box; padding: 0px 5px;">396</li><li style="box-sizing: border-box; padding: 0px 5px;">397</li><li style="box-sizing: border-box; padding: 0px 5px;">398</li><li style="box-sizing: border-box; padding: 0px 5px;">399</li><li style="box-sizing: border-box; padding: 0px 5px;">400</li><li style="box-sizing: border-box; padding: 0px 5px;">401</li><li style="box-sizing: border-box; padding: 0px 5px;">402</li><li style="box-sizing: border-box; padding: 0px 5px;">403</li><li style="box-sizing: border-box; padding: 0px 5px;">404</li><li style="box-sizing: border-box; padding: 0px 5px;">405</li><li style="box-sizing: border-box; padding: 0px 5px;">406</li><li style="box-sizing: border-box; padding: 0px 5px;">407</li><li style="box-sizing: border-box; padding: 0px 5px;">408</li><li style="box-sizing: border-box; padding: 0px 5px;">409</li><li style="box-sizing: border-box; padding: 0px 5px;">410</li><li style="box-sizing: border-box; padding: 0px 5px;">411</li><li style="box-sizing: border-box; padding: 0px 5px;">412</li><li style="box-sizing: border-box; padding: 0px 5px;">413</li><li style="box-sizing: border-box; padding: 0px 5px;">414</li><li style="box-sizing: border-box; padding: 0px 5px;">415</li><li style="box-sizing: border-box; padding: 0px 5px;">416</li><li style="box-sizing: border-box; padding: 0px 5px;">417</li><li style="box-sizing: border-box; padding: 0px 5px;">418</li><li style="box-sizing: border-box; padding: 0px 5px;">419</li><li style="box-sizing: border-box; padding: 0px 5px;">420</li><li style="box-sizing: border-box; padding: 0px 5px;">421</li><li style="box-sizing: border-box; padding: 0px 5px;">422</li><li style="box-sizing: border-box; padding: 0px 5px;">423</li><li style="box-sizing: border-box; padding: 0px 5px;">424</li><li style="box-sizing: border-box; padding: 0px 5px;">425</li><li style="box-sizing: border-box; padding: 0px 5px;">426</li><li style="box-sizing: border-box; padding: 0px 5px;">427</li><li style="box-sizing: border-box; padding: 0px 5px;">428</li><li style="box-sizing: border-box; padding: 0px 5px;">429</li><li style="box-sizing: border-box; padding: 0px 5px;">430</li><li style="box-sizing: border-box; padding: 0px 5px;">431</li><li style="box-sizing: border-box; padding: 0px 5px;">432</li><li style="box-sizing: border-box; padding: 0px 5px;">433</li><li style="box-sizing: border-box; padding: 0px 5px;">434</li><li style="box-sizing: border-box; padding: 0px 5px;">435</li><li style="box-sizing: border-box; padding: 0px 5px;">436</li><li style="box-sizing: border-box; padding: 0px 5px;">437</li><li style="box-sizing: border-box; padding: 0px 5px;">438</li><li style="box-sizing: border-box; padding: 0px 5px;">439</li><li style="box-sizing: border-box; padding: 0px 5px;">440</li><li style="box-sizing: border-box; padding: 0px 5px;">441</li><li style="box-sizing: border-box; padding: 0px 5px;">442</li><li style="box-sizing: border-box; padding: 0px 5px;">443</li><li style="box-sizing: border-box; padding: 0px 5px;">444</li><li style="box-sizing: border-box; padding: 0px 5px;">445</li><li style="box-sizing: border-box; padding: 0px 5px;">446</li><li style="box-sizing: border-box; padding: 0px 5px;">447</li><li style="box-sizing: border-box; padding: 0px 5px;">448</li><li style="box-sizing: border-box; padding: 0px 5px;">449</li><li style="box-sizing: border-box; padding: 0px 5px;">450</li><li style="box-sizing: border-box; padding: 0px 5px;">451</li><li style="box-sizing: border-box; padding: 0px 5px;">452</li><li style="box-sizing: border-box; padding: 0px 5px;">453</li><li style="box-sizing: border-box; padding: 0px 5px;">454</li><li style="box-sizing: border-box; padding: 0px 5px;">455</li><li style="box-sizing: border-box; padding: 0px 5px;">456</li><li style="box-sizing: border-box; padding: 0px 5px;">457</li><li style="box-sizing: border-box; padding: 0px 5px;">458</li><li style="box-sizing: border-box; padding: 0px 5px;">459</li><li style="box-sizing: border-box; padding: 0px 5px;">460</li><li style="box-sizing: border-box; padding: 0px 5px;">461</li><li style="box-sizing: border-box; padding: 0px 5px;">462</li><li style="box-sizing: border-box; padding: 0px 5px;">463</li><li style="box-sizing: border-box; padding: 0px 5px;">464</li><li style="box-sizing: border-box; padding: 0px 5px;">465</li><li style="box-sizing: border-box; padding: 0px 5px;">466</li><li style="box-sizing: border-box; padding: 0px 5px;">467</li><li style="box-sizing: border-box; padding: 0px 5px;">468</li><li style="box-sizing: border-box; padding: 0px 5px;">469</li><li style="box-sizing: border-box; padding: 0px 5px;">470</li><li style="box-sizing: border-box; padding: 0px 5px;">471</li><li style="box-sizing: border-box; padding: 0px 5px;">472</li><li style="box-sizing: border-box; padding: 0px 5px;">473</li><li style="box-sizing: border-box; padding: 0px 5px;">474</li><li style="box-sizing: border-box; padding: 0px 5px;">475</li><li style="box-sizing: border-box; padding: 0px 5px;">476</li><li style="box-sizing: border-box; padding: 0px 5px;">477</li><li style="box-sizing: border-box; padding: 0px 5px;">478</li><li style="box-sizing: border-box; padding: 0px 5px;">479</li><li style="box-sizing: border-box; padding: 0px 5px;">480</li><li style="box-sizing: border-box; padding: 0px 5px;">481</li><li style="box-sizing: border-box; padding: 0px 5px;">482</li><li style="box-sizing: border-box; padding: 0px 5px;">483</li><li style="box-sizing: border-box; padding: 0px 5px;">484</li><li style="box-sizing: border-box; padding: 0px 5px;">485</li><li style="box-sizing: border-box; padding: 0px 5px;">486</li><li style="box-sizing: border-box; padding: 0px 5px;">487</li><li style="box-sizing: border-box; padding: 0px 5px;">488</li><li style="box-sizing: border-box; padding: 0px 5px;">489</li><li style="box-sizing: border-box; padding: 0px 5px;">490</li><li style="box-sizing: border-box; padding: 0px 5px;">491</li><li style="box-sizing: border-box; padding: 0px 5px;">492</li><li style="box-sizing: border-box; padding: 0px 5px;">493</li><li style="box-sizing: border-box; padding: 0px 5px;">494</li><li style="box-sizing: border-box; padding: 0px 5px;">495</li><li style="box-sizing: border-box; padding: 0px 5px;">496</li><li style="box-sizing: border-box; padding: 0px 5px;">497</li><li style="box-sizing: border-box; padding: 0px 5px;">498</li><li style="box-sizing: border-box; padding: 0px 5px;">499</li><li style="box-sizing: border-box; padding: 0px 5px;">500</li><li style="box-sizing: border-box; padding: 0px 5px;">501</li><li style="box-sizing: border-box; padding: 0px 5px;">502</li><li style="box-sizing: border-box; padding: 0px 5px;">503</li><li style="box-sizing: border-box; padding: 0px 5px;">504</li><li style="box-sizing: border-box; padding: 0px 5px;">505</li><li style="box-sizing: border-box; padding: 0px 5px;">506</li><li style="box-sizing: border-box; padding: 0px 5px;">507</li><li style="box-sizing: border-box; padding: 0px 5px;">508</li><li style="box-sizing: border-box; padding: 0px 5px;">509</li><li style="box-sizing: border-box; padding: 0px 5px;">510</li><li style="box-sizing: border-box; padding: 0px 5px;">511</li><li style="box-sizing: border-box; padding: 0px 5px;">512</li><li style="box-sizing: border-box; padding: 0px 5px;">513</li><li style="box-sizing: border-box; padding: 0px 5px;">514</li><li style="box-sizing: border-box; padding: 0px 5px;">515</li><li style="box-sizing: border-box; padding: 0px 5px;">516</li><li style="box-sizing: border-box; padding: 0px 5px;">517</li><li style="box-sizing: border-box; padding: 0px 5px;">518</li><li style="box-sizing: border-box; padding: 0px 5px;">519</li><li style="box-sizing: border-box; padding: 0px 5px;">520</li><li style="box-sizing: border-box; padding: 0px 5px;">521</li><li style="box-sizing: border-box; padding: 0px 5px;">522</li><li style="box-sizing: border-box; padding: 0px 5px;">523</li><li style="box-sizing: border-box; padding: 0px 5px;">524</li><li style="box-sizing: border-box; padding: 0px 5px;">525</li><li style="box-sizing: border-box; padding: 0px 5px;">526</li><li style="box-sizing: border-box; padding: 0px 5px;">527</li><li style="box-sizing: border-box; padding: 0px 5px;">528</li><li style="box-sizing: border-box; padding: 0px 5px;">529</li><li style="box-sizing: border-box; padding: 0px 5px;">530</li><li style="box-sizing: border-box; padding: 0px 5px;">531</li><li style="box-sizing: border-box; padding: 0px 5px;">532</li><li style="box-sizing: border-box; padding: 0px 5px;">533</li><li style="box-sizing: border-box; padding: 0px 5px;">534</li><li style="box-sizing: border-box; padding: 0px 5px;">535</li><li style="box-sizing: border-box; padding: 0px 5px;">536</li><li style="box-sizing: border-box; padding: 0px 5px;">537</li><li style="box-sizing: border-box; padding: 0px 5px;">538</li><li style="box-sizing: border-box; padding: 0px 5px;">539</li><li style="box-sizing: border-box; padding: 0px 5px;">540</li><li style="box-sizing: border-box; padding: 0px 5px;">541</li><li style="box-sizing: border-box; padding: 0px 5px;">542</li><li style="box-sizing: border-box; padding: 0px 5px;">543</li><li style="box-sizing: border-box; padding: 0px 5px;">544</li><li style="box-sizing: border-box; padding: 0px 5px;">545</li><li style="box-sizing: border-box; padding: 0px 5px;">546</li><li style="box-sizing: border-box; padding: 0px 5px;">547</li><li style="box-sizing: border-box; padding: 0px 5px;">548</li><li style="box-sizing: border-box; padding: 0px 5px;">549</li><li style="box-sizing: border-box; padding: 0px 5px;">550</li><li style="box-sizing: border-box; padding: 0px 5px;">551</li><li style="box-sizing: border-box; padding: 0px 5px;">552</li><li style="box-sizing: border-box; padding: 0px 5px;">553</li><li style="box-sizing: border-box; padding: 0px 5px;">554</li><li style="box-sizing: border-box; padding: 0px 5px;">555</li><li style="box-sizing: border-box; padding: 0px 5px;">556</li><li style="box-sizing: border-box; padding: 0px 5px;">557</li><li style="box-sizing: border-box; padding: 0px 5px;">558</li><li style="box-sizing: border-box; padding: 0px 5px;">559</li><li style="box-sizing: border-box; padding: 0px 5px;">560</li><li style="box-sizing: border-box; padding: 0px 5px;">561</li><li style="box-sizing: border-box; padding: 0px 5px;">562</li><li style="box-sizing: border-box; padding: 0px 5px;">563</li><li style="box-sizing: border-box; padding: 0px 5px;">564</li><li style="box-sizing: border-box; padding: 0px 5px;">565</li><li style="box-sizing: border-box; padding: 0px 5px;">566</li><li style="box-sizing: border-box; padding: 0px 5px;">567</li><li style="box-sizing: border-box; padding: 0px 5px;">568</li><li style="box-sizing: border-box; padding: 0px 5px;">569</li><li style="box-sizing: border-box; padding: 0px 5px;">570</li><li style="box-sizing: border-box; padding: 0px 5px;">571</li><li style="box-sizing: border-box; padding: 0px 5px;">572</li><li style="box-sizing: border-box; padding: 0px 5px;">573</li><li style="box-sizing: border-box; padding: 0px 5px;">574</li><li style="box-sizing: border-box; padding: 0px 5px;">575</li><li style="box-sizing: border-box; padding: 0px 5px;">576</li><li style="box-sizing: border-box; padding: 0px 5px;">577</li><li style="box-sizing: border-box; padding: 0px 5px;">578</li><li style="box-sizing: border-box; padding: 0px 5px;">579</li><li style="box-sizing: border-box; padding: 0px 5px;">580</li><li style="box-sizing: border-box; padding: 0px 5px;">581</li><li style="box-sizing: border-box; padding: 0px 5px;">582</li><li style="box-sizing: border-box; padding: 0px 5px;">583</li><li style="box-sizing: border-box; padding: 0px 5px;">584</li><li style="box-sizing: border-box; padding: 0px 5px;">585</li><li style="box-sizing: border-box; padding: 0px 5px;">586</li><li style="box-sizing: border-box; padding: 0px 5px;">587</li><li style="box-sizing: border-box; padding: 0px 5px;">588</li><li style="box-sizing: border-box; padding: 0px 5px;">589</li><li style="box-sizing: border-box; padding: 0px 5px;">590</li><li style="box-sizing: border-box; padding: 0px 5px;">591</li><li style="box-sizing: border-box; padding: 0px 5px;">592</li><li style="box-sizing: border-box; padding: 0px 5px;">593</li><li style="box-sizing: border-box; padding: 0px 5px;">594</li><li style="box-sizing: border-box; padding: 0px 5px;">595</li><li style="box-sizing: border-box; padding: 0px 5px;">596</li><li style="box-sizing: border-box; padding: 0px 5px;">597</li><li style="box-sizing: border-box; padding: 0px 5px;">598</li><li style="box-sizing: border-box; padding: 0px 5px;">599</li><li style="box-sizing: border-box; padding: 0px 5px;">600</li><li style="box-sizing: border-box; padding: 0px 5px;">601</li><li style="box-sizing: border-box; padding: 0px 5px;">602</li><li style="box-sizing: border-box; padding: 0px 5px;">603</li><li style="box-sizing: border-box; padding: 0px 5px;">604</li><li style="box-sizing: border-box; padding: 0px 5px;">605</li><li style="box-sizing: border-box; padding: 0px 5px;">606</li><li style="box-sizing: border-box; padding: 0px 5px;">607</li><li style="box-sizing: border-box; padding: 0px 5px;">608</li><li style="box-sizing: border-box; padding: 0px 5px;">609</li><li style="box-sizing: border-box; padding: 0px 5px;">610</li><li style="box-sizing: border-box; padding: 0px 5px;">611</li><li style="box-sizing: border-box; padding: 0px 5px;">612</li><li style="box-sizing: border-box; padding: 0px 5px;">613</li><li style="box-sizing: border-box; padding: 0px 5px;">614</li><li style="box-sizing: border-box; padding: 0px 5px;">615</li><li style="box-sizing: border-box; padding: 0px 5px;">616</li><li style="box-sizing: border-box; padding: 0px 5px;">617</li><li style="box-sizing: border-box; padding: 0px 5px;">618</li><li style="box-sizing: border-box; padding: 0px 5px;">619</li><li style="box-sizing: border-box; padding: 0px 5px;">620</li><li style="box-sizing: border-box; padding: 0px 5px;">621</li><li style="box-sizing: border-box; padding: 0px 5px;">622</li><li style="box-sizing: border-box; padding: 0px 5px;">623</li><li style="box-sizing: border-box; padding: 0px 5px;">624</li><li style="box-sizing: border-box; padding: 0px 5px;">625</li><li style="box-sizing: border-box; padding: 0px 5px;">626</li><li style="box-sizing: border-box; padding: 0px 5px;">627</li><li style="box-sizing: border-box; padding: 0px 5px;">628</li><li style="box-sizing: border-box; padding: 0px 5px;">629</li><li style="box-sizing: border-box; padding: 0px 5px;">630</li><li style="box-sizing: border-box; padding: 0px 5px;">631</li><li style="box-sizing: border-box; padding: 0px 5px;">632</li><li style="box-sizing: border-box; padding: 0px 5px;">633</li><li style="box-sizing: border-box; padding: 0px 5px;">634</li><li style="box-sizing: border-box; padding: 0px 5px;">635</li><li style="box-sizing: border-box; padding: 0px 5px;">636</li><li style="box-sizing: border-box; padding: 0px 5px;">637</li><li style="box-sizing: border-box; padding: 0px 5px;">638</li><li style="box-sizing: border-box; padding: 0px 5px;">639</li><li style="box-sizing: border-box; padding: 0px 5px;">640</li><li style="box-sizing: border-box; padding: 0px 5px;">641</li><li style="box-sizing: border-box; padding: 0px 5px;">642</li><li style="box-sizing: border-box; padding: 0px 5px;">643</li><li style="box-sizing: border-box; padding: 0px 5px;">644</li><li style="box-sizing: border-box; padding: 0px 5px;">645</li><li style="box-sizing: border-box; padding: 0px 5px;">646</li><li style="box-sizing: border-box; padding: 0px 5px;">647</li><li style="box-sizing: border-box; padding: 0px 5px;">648</li><li style="box-sizing: border-box; padding: 0px 5px;">649</li><li style="box-sizing: border-box; padding: 0px 5px;">650</li><li style="box-sizing: border-box; padding: 0px 5px;">651</li><li style="box-sizing: border-box; padding: 0px 5px;">652</li><li style="box-sizing: border-box; padding: 0px 5px;">653</li><li style="box-sizing: border-box; padding: 0px 5px;">654</li><li style="box-sizing: border-box; padding: 0px 5px;">655</li><li style="box-sizing: border-box; padding: 0px 5px;">656</li><li style="box-sizing: border-box; padding: 0px 5px;">657</li><li style="box-sizing: border-box; padding: 0px 5px;">658</li><li style="box-sizing: border-box; padding: 0px 5px;">659</li><li style="box-sizing: border-box; padding: 0px 5px;">660</li><li style="box-sizing: border-box; padding: 0px 5px;">661</li><li style="box-sizing: border-box; padding: 0px 5px;">662</li><li style="box-sizing: border-box; padding: 0px 5px;">663</li><li style="box-sizing: border-box; padding: 0px 5px;">664</li><li style="box-sizing: border-box; padding: 0px 5px;">665</li><li style="box-sizing: border-box; padding: 0px 5px;">666</li><li style="box-sizing: border-box; padding: 0px 5px;">667</li><li style="box-sizing: border-box; padding: 0px 5px;">668</li><li style="box-sizing: border-box; padding: 0px 5px;">669</li><li style="box-sizing: border-box; padding: 0px 5px;">670</li><li style="box-sizing: border-box; padding: 0px 5px;">671</li><li style="box-sizing: border-box; padding: 0px 5px;">672</li><li style="box-sizing: border-box; padding: 0px 5px;">673</li><li style="box-sizing: border-box; padding: 0px 5px;">674</li><li style="box-sizing: border-box; padding: 0px 5px;">675</li><li style="box-sizing: border-box; padding: 0px 5px;">676</li><li style="box-sizing: border-box; padding: 0px 5px;">677</li><li style="box-sizing: border-box; padding: 0px 5px;">678</li><li style="box-sizing: border-box; padding: 0px 5px;">679</li><li style="box-sizing: border-box; padding: 0px 5px;">680</li><li style="box-sizing: border-box; padding: 0px 5px;">681</li><li style="box-sizing: border-box; padding: 0px 5px;">682</li><li style="box-sizing: border-box; padding: 0px 5px;">683</li><li style="box-sizing: border-box; padding: 0px 5px;">684</li><li style="box-sizing: border-box; padding: 0px 5px;">685</li><li style="box-sizing: border-box; padding: 0px 5px;">686</li><li style="box-sizing: border-box; padding: 0px 5px;">687</li><li style="box-sizing: border-box; padding: 0px 5px;">688</li><li style="box-sizing: border-box; padding: 0px 5px;">689</li><li style="box-sizing: border-box; padding: 0px 5px;">690</li><li style="box-sizing: border-box; padding: 0px 5px;">691</li><li style="box-sizing: border-box; padding: 0px 5px;">692</li><li style="box-sizing: border-box; padding: 0px 5px;">693</li><li style="box-sizing: border-box; padding: 0px 5px;">694</li><li style="box-sizing: border-box; padding: 0px 5px;">695</li><li style="box-sizing: border-box; padding: 0px 5px;">696</li><li style="box-sizing: border-box; padding: 0px 5px;">697</li><li style="box-sizing: border-box; padding: 0px 5px;">698</li><li style="box-sizing: border-box; padding: 0px 5px;">699</li><li style="box-sizing: border-box; padding: 0px 5px;">700</li><li style="box-sizing: border-box; padding: 0px 5px;">701</li><li style="box-sizing: border-box; padding: 0px 5px;">702</li><li style="box-sizing: border-box; padding: 0px 5px;">703</li><li style="box-sizing: border-box; padding: 0px 5px;">704</li><li style="box-sizing: border-box; padding: 0px 5px;">705</li><li style="box-sizing: border-box; padding: 0px 5px;">706</li><li style="box-sizing: border-box; padding: 0px 5px;">707</li><li style="box-sizing: border-box; padding: 0px 5px;">708</li><li style="box-sizing: border-box; padding: 0px 5px;">709</li><li style="box-sizing: border-box; padding: 0px 5px;">710</li><li style="box-sizing: border-box; padding: 0px 5px;">711</li><li style="box-sizing: border-box; padding: 0px 5px;">712</li><li style="box-sizing: border-box; padding: 0px 5px;">713</li><li style="box-sizing: border-box; padding: 0px 5px;">714</li><li style="box-sizing: border-box; padding: 0px 5px;">715</li><li style="box-sizing: border-box; padding: 0px 5px;">716</li><li style="box-sizing: border-box; padding: 0px 5px;">717</li><li style="box-sizing: border-box; padding: 0px 5px;">718</li><li style="box-sizing: border-box; padding: 0px 5px;">719</li><li style="box-sizing: border-box; padding: 0px 5px;">720</li><li style="box-sizing: border-box; padding: 0px 5px;">721</li><li style="box-sizing: border-box; padding: 0px 5px;">722</li><li style="box-sizing: border-box; padding: 0px 5px;">723</li><li style="box-sizing: border-box; padding: 0px 5px;">724</li><li style="box-sizing: border-box; padding: 0px 5px;">725</li><li style="box-sizing: border-box; padding: 0px 5px;">726</li><li style="box-sizing: border-box; padding: 0px 5px;">727</li><li style="box-sizing: border-box; padding: 0px 5px;">728</li><li style="box-sizing: border-box; padding: 0px 5px;">729</li><li style="box-sizing: border-box; padding: 0px 5px;">730</li><li style="box-sizing: border-box; padding: 0px 5px;">731</li><li style="box-sizing: border-box; padding: 0px 5px;">732</li><li style="box-sizing: border-box; padding: 0px 5px;">733</li><li style="box-sizing: border-box; padding: 0px 5px;">734</li><li style="box-sizing: border-box; padding: 0px 5px;">735</li><li style="box-sizing: border-box; padding: 0px 5px;">736</li><li style="box-sizing: border-box; padding: 0px 5px;">737</li><li style="box-sizing: border-box; padding: 0px 5px;">738</li><li style="box-sizing: border-box; padding: 0px 5px;">739</li><li style="box-sizing: border-box; padding: 0px 5px;">740</li><li style="box-sizing: border-box; padding: 0px 5px;">741</li><li style="box-sizing: border-box; padding: 0px 5px;">742</li><li style="box-sizing: border-box; padding: 0px 5px;">743</li><li style="box-sizing: border-box; padding: 0px 5px;">744</li><li style="box-sizing: border-box; padding: 0px 5px;">745</li><li style="box-sizing: border-box; padding: 0px 5px;">746</li><li style="box-sizing: border-box; padding: 0px 5px;">747</li><li style="box-sizing: border-box; padding: 0px 5px;">748</li><li style="box-sizing: border-box; padding: 0px 5px;">749</li><li style="box-sizing: border-box; padding: 0px 5px;">750</li><li style="box-sizing: border-box; padding: 0px 5px;">751</li><li style="box-sizing: border-box; padding: 0px 5px;">752</li><li style="box-sizing: border-box; padding: 0px 5px;">753</li><li style="box-sizing: border-box; padding: 0px 5px;">754</li><li style="box-sizing: border-box; padding: 0px 5px;">755</li><li style="box-sizing: border-box; padding: 0px 5px;">756</li><li style="box-sizing: border-box; padding: 0px 5px;">757</li><li style="box-sizing: border-box; padding: 0px 5px;">758</li><li style="box-sizing: border-box; padding: 0px 5px;">759</li><li style="box-sizing: border-box; padding: 0px 5px;">760</li><li style="box-sizing: border-box; padding: 0px 5px;">761</li><li style="box-sizing: border-box; padding: 0px 5px;">762</li><li style="box-sizing: border-box; padding: 0px 5px;">763</li><li style="box-sizing: border-box; padding: 0px 5px;">764</li><li style="box-sizing: border-box; padding: 0px 5px;">765</li><li style="box-sizing: border-box; padding: 0px 5px;">766</li><li style="box-sizing: border-box; padding: 0px 5px;">767</li><li style="box-sizing: border-box; padding: 0px 5px;">768</li><li style="box-sizing: border-box; padding: 0px 5px;">769</li><li style="box-sizing: border-box; padding: 0px 5px;">770</li><li style="box-sizing: border-box; padding: 0px 5px;">771</li><li style="box-sizing: border-box; padding: 0px 5px;">772</li><li style="box-sizing: border-box; padding: 0px 5px;">773</li><li style="box-sizing: border-box; padding: 0px 5px;">774</li><li style="box-sizing: border-box; padding: 0px 5px;">775</li><li style="box-sizing: border-box; padding: 0px 5px;">776</li><li style="box-sizing: border-box; padding: 0px 5px;">777</li><li style="box-sizing: border-box; padding: 0px 5px;">778</li><li style="box-sizing: border-box; padding: 0px 5px;">779</li><li style="box-sizing: border-box; padding: 0px 5px;">780</li><li style="box-sizing: border-box; padding: 0px 5px;">781</li><li style="box-sizing: border-box; padding: 0px 5px;">782</li><li style="box-sizing: border-box; padding: 0px 5px;">783</li><li style="box-sizing: border-box; padding: 0px 5px;">784</li><li style="box-sizing: border-box; padding: 0px 5px;">785</li><li style="box-sizing: border-box; padding: 0px 5px;">786</li></ul>
四、参考文献
1.LSTM入门介绍比较好的文章:A Critical review of rnn for sequence learning
2.LSTM学习思路,参见知乎的一个介绍,很详细:https://www.zhihu.com/question/29411132 。
3.Python入门视频教程—可看南京大学张莉老师在coursera上的公开课《用Python玩转数据》,有例子介绍,很实用。https://www.coursera.org/learn/hipython/home/welcome。
4.Keras介绍—参看官方文档http://keras.io/