免费门户网站模板下载,昆山设计网站公司,自建免费网站哪个好,深圳万创网怎么样最近在学一门大数据的课#xff0c;课程要求很开放#xff0c;任意做一个大数据相关的项目即可#xff0c;不知道为什么我就想到推荐算法#xff0c;一直到着手要做之前还没有新的更好的来代替#xff0c;那就这个吧。
推荐算法
推荐算法的发展由来已久#xff0c;但和…最近在学一门大数据的课课程要求很开放任意做一个大数据相关的项目即可不知道为什么我就想到推荐算法一直到着手要做之前还没有新的更好的来代替那就这个吧。
推荐算法
推荐算法的发展由来已久但和机器学习一样没有大量的算力和数据作支撑达不到好的效果直到如今高速网络和大数据时代才发展得如火如荼。
推荐算法具体有几种协同过滤基于内容基于知识和混合过滤具体的知识可以看该文章简单总结如下
协同过滤基于分类的推荐把用户或物品按类划分在同类中互相推荐对方的喜好比如两个都喜欢看动作电影的用户其中一个又喜欢看爱情片就把爱情片也推给另一个同样喜欢看动作电影的用户。 该方法根据划分的对象不同又可以分为基于用户和基于物品两种后面会对协同过滤算法作稍微详细的介绍。
基于内容该方案逻辑更为严谨可以通过用户画像设定的大致喜好来推荐该算法需要对物品的特征进行计算找到最符合用户喜好的几个物品进行推荐。
基于知识这单独分类就有点牵强了基于知识的推荐其实就是更严谨的协同过滤和内容推荐该算法会构造用户的需求列表根据该列表与物品的相似程度进行推荐比如高档耐用品用户在满足后就没有了需求像房子汽车等当用户拥有以后就没必要再继续推送。
混合过滤顾名思义就是结合多种方法的推荐算法比如把前面三种方法输入到一个神经网络最后拟合出一个结果来希望结合各自的优点克服他们的缺点。
协同过滤
该算法的核心思想是将被推荐者的同类找出来基于用户和基于物品的区别举个例子就是分别找到和你一样喜欢看动作电影的人把他的其他喜欢推荐给你和找到和动作电影比较类似的其他电影把这些电影推荐给喜欢看动作电影的人这两步殊途同归而同时都有一个重点——如何衡量相似。
相似是我们日常形容的一种感觉而对计算机来说是可以用数学量化计算的如余弦相似度欧几里得距离皮尔森系数等其他详细计算方法可见该文章。
相似度计算
本项目中以皮尔斯相关系数作为相似度的衡量标准表示两个矩阵协方差与标准差的商计算公式如图 具体计算方法可见该文章我们编程实现时更多关注其运算规则和返回值即可该方法返回一个矩阵对角元素表示其与自身的相似度—为1[0,1]和[1,0]位置为两矩阵的相似度该计算方法在np库中有现成的使用方法示例如下 # 计算两个用户的皮尔逊相关系数越靠近1表示越相关# 返回相关系数矩阵2*2的矩阵对角线表示与自身的相关系数[0, 1]或[1, 0]它们是相等的则是matrix1和matrix2之间的相关系数pearsonnp.corrcoef(matrix1, matrix2)[0, 1]相似度取值为[-1,1]越大表示越相关计算出相似度后即相当于找到类似的群体再推荐该群体的喜好给用户即可。
但在大数据时代中在动辄几十上百万条的数据里逐条记录计算相似度并推送不那么优雅也不那么准确并且矩阵中大部分数据都为0是一个稀疏矩阵因为很少有人能评价数据库中的所有物品故数学家研究能不能把这么多记录的大数据矩阵拆成更小的矩阵呢
SVD奇异值矩阵分解
奇异值矩阵分解可以实现将m×n的矩阵拆解为m×m正交阵、m×n对角阵多的行列全为0、n×n正交阵三个矩阵我们可能回想这拆完其实比之前还大拆解还有什么意义 其中对角阵对角线的值我们称为奇异值奇异值从大到小排列所以通常我们使用前几位的奇异值组成对角阵就已经可以大差不差地构造出原有矩阵来具体原理见该文章。即我们可以将该矩阵压缩为m×r、r×r和r×n三个矩阵此时的r我们可以自由选取这样一来就可以大大压缩矩阵的空间了实现代码展示如下
arr1np.random.randint(0,100,(5,5))
print(arr1)
# svd 分解得到矩阵
a,b,cnp.linalg.svd(arr1)
# 为了节省内存对角阵使用一维数组保存故需将其展开
bnp.diag(b)
# 一维数组值到对角线其余填充0分别输出后展示如下 随后我们尝试对该矩阵进行压缩计算后得到的矩阵分别取前k位方法代码如下
def get_svd(matrix,k):U, sigma, VT np.linalg.svd(matrix)# 主对角线数组值其余均为0展开sigmanp.diag(sigma)# 截取前k个奇异值U_kU[:, :k]sigma_ksigma[:k, :k]VT_kVT[:k, ]return U_k, sigma_k, VT_kk取3即5维矩阵保留前3维奇异值执行展示如下 可以看到损失变化并不很大此时因为我们的矩阵并不稀疏且压缩率为百分之二十所以可以说压缩效果相当好。
隐向量
原本纵坐标代表用户横坐标代表物品压缩后矩阵不完整取而代之的是r那这个r代表什么呢我在视频中看到如下例子原视频链接 这是一个音乐推荐系统原有矩阵经过分解压缩的r取3用户和歌曲被一个3×3的矩阵联系起来我们感性上可以把他认为是歌曲种类但这并不准确因为r的值具体取多少并不固定这类似于机器学习中的网络网络把我们的特征计算得到一个结果这个结果并没有什么实在意义但计算机能计算并拟合就足够了我们将其理解称为计算机做得一个分类也就可以了这个分类在矩阵分解中被称为隐向量。
矩阵分解的应用
说到这我们还没明白拆解了矩阵以后又怎么样呢我们从大矩阵得到了小矩阵并且能利用该小矩阵近似恢复出大矩阵我们在推荐的时候到底该怎么用这个矩阵呢
在协同过滤中使用矩阵分解方法时我们实际上是在根据用户向量来生成推荐物品矩阵的预测即获得了r×n的矩阵后由用户1×r的输入特征即可获得1×n的用户关于所有物品喜好程度的预测矩阵我们推荐时只需根据该矩阵即可。 我们由以往基于用户或物品计算相似粗糙地选择相似者喜好推荐的方法转变为生成一张近似但量化的关于用户对所有物品喜好的特征向量来进行推荐相比较矩阵分解方法更为优雅和准确。
但到这里我想了一个问题这种方式还叫协同过滤吗?并没有直接和其他用户和物品协同这种纯数学的方法是否还符合协同过滤的定义呢有关问题我问了文心一言他的解答我直接放在下面以供参考
数据处理
数据集来自该链接目录如下 不同文件分别为影评、电影信息、演员信息、评分信息和用户信息其中电影又包含电影长度、海报等等信息具体介绍可以见其中的README。 该数据集可以说十分详细但稍微有些旧是2019年的另外是实在太大了我要构建矩阵时pycharm提示需要153GB的内存。 以目前想当然来看应该可以是分批多次读取再组合的但是因为本次只是一个尝试就不研究真实大数据条件下的操作了重点侧重与算法与项目的完成上故首先要对数据进行缩减。
先从电影入手把不包含海报链接的去掉再把没有豆瓣评分和演员信息等的去掉最终只保留下两千条数据再使用这两千条电影的id在评分文件ratings过滤记录代码如下
import pandas as pdfile_sourceE:\\software\\DataBase\\Data\\movie_data\\new_movies.csv
old_sourceE:\\software\\DataBase\\Data\\movie\\ratings.csv
savepd.read_csv(file_source)
datapd.read_csv(old_source)
# 获取指定列的值
value_tosavesave[MOVIE_ID]# 过滤后的数据
filtered_data data[data[MOVIE_ID].isin(value_tosave)]# 保存过滤后的数据
filtered_data.to_csv(E:\\software\\DataBase\\Data\\movie\\new_ratings.csv, indexFalse)大概步骤为 先获取电影文件中的电影ID 在评分文件中匹配该ID符合的保存在变量中 最后将数据写入csv文件。
同理需要使用排名文件对用户文件进行过滤此时注意因为用户名包含中文信息故在保存csv文件时需要指定编码为utf-8故保存代码修改为filtered_data.to_csv(E:\\software\\DataBase\\Data\\movie\\new_users.csv, indexFalse,encodingutf-8-sig)
过滤前后文件大小对比如下 电影数目由十四万降至两千八打分数目由一百四十万降至十九万用户数量由六十四万降至八万此时的数据量计算机大概可以处理了。
但裁后计算svd发现还是需要50个G的内存看来分布式系统是不可不用了。
Spark系统
大数据框架
之前总是专注算法对大数据还是一直停留在直观印象上觉得无非就是数据大一些记录多一些但突然想到这些表象最直接地反映在编程思想上以往的程序单机运行即可速度慢的时候只要换一台新的服务器就能得到很好的效果但到了大数据时代单个服务器再强也是不可能满足运行要求故在编程中就要采用分治思想使用分布式进行计算。
目前主流的大数据框架有Hadoop和spark详细介绍和对比可见该文章二者都是Apache的框架目前将其理解对比如下 Hadoop2012年提出的第一款大数据框架主要理念为map/reduce其中map负责数据集的拆解reduce负责对拆解后的数据集进行运算其中隐含层为shuffle负责对拆解的数据进行排序归并等操作总的来说是将大数据采用总分总的形式运行借助分布式文件系统HDFS实现如果有计算集群则可以大幅度提升运行效率。 Spark2014年提出的新一代大数据框架改进了原有map/reduce转而使用RAM进行数据暂存相比更快并用弹性数据集RDD取代原本HDFS并且支持Hadoop其详细教程可看该视频和极客教程。但具体来说其仅为分布式计算框架解决了Hadoop原有基于磁盘的效率问题用内存操作代替了频繁读写磁盘序列化等步骤数据在执行完毕前不落地加快了计算效率而存储结构仍使用原有的分布式文件系统HDFS。
安装部署
本次实验在Windows上进行但因为没有服务器集群故部署为单机大致部署思路如下 1配置Java环境spark是基于Java编写的必须要有相应的Java环境。 2安装spark包官网下载解压到目录即可。 3配置环境变量 4bin文件替换spark是基于Linux系统若要在Windows中使用需要替换相关文件
具体操作基本可以参考该文章本地部署无需使用hadoop的可以将相关操作全部指向spark文件即可配环境确实十分困难最后我也不知道怎么配好的甚至没法复现也不敢再重新来过目前的教训就是一定注意版本对应。
RDD
spark的数据操作基于弹性数据集RDD完成具体操作可见该文章一次简单读取文件并输出的示例如下
from pyspark import SparkContext,SparkConf
# 根据对象名和部署模式获取sparkcontext对象
confSparkConf().setAppName(test).setMaster(local)
scpyspark.SparkContext(confconf)
pathfile:///E:\\software\\DataBase\\Data\\movie_data\\new_movies.csv
# 对象读取文件获得RDD
datasc.textFile(path)
# 或者使用parallelize生成对象集合
datasc.parallelize(List(1,2,3,4))
# 遍历输出
data.foreach(print)操作函数分为转换和动作两种其中转换类有
filter(func) # 过滤满足func的元素返回新的数据集
map(func) # 映射元素传入func中计算返回数据集
flatMap(func) # 与map相似但输入元素可映射0到多个结果
groupByKey() # 将键值对的数据集按键分组
reduceByKey(func) # 分组后用func进行计算动作类函数有
count() # 返回元素个数
collect() # 以数组形式返回元素
reduce(func) # 通过func聚合元素
foreach(func) # 每个元素传递到func中运行
first() # 返回第一个元素
take(n) # 返回前n个元素spark在编程使用时的确具有很多不同特性作为了解记录如下 1惰性机制。spark在执行中采取有向无环图的形式每个转换操作如map只是记录动作只有遇到动作如reduce才开始执行。 2RDD只读。RDD在执行生成后不可修改我们操作的新变量实质是其拷贝版本这些不同的拷贝构成了有向无环图的节点这给我们恢复系统状态提供了方便同时因为计算不结束不落地减少磁盘开销提高了效率。 3粗颗粒度。只能整体转换不能只修改其中一条。
DataFrame
RDD只给了数据按行操作的能力有时我们要对数据进行按列的操作甚至更细比如按标签操作时就无法实现了以及非关系型数据难以用于机器学习的困境基于此SparkSQL提供了类似pandas的DataFrame操作其大概原理是将sql语句转为spark该方法给spark处理大规模结构化数据的能力同时也比RDD更简单易用且计算效率更高。
大概使用方法如下 from pyspark.sql import SparkSession导入包 sparkSparkSession.builder.config(confSparkConf()).getOrCreate()创建实例对象
dfspark.read.csv(path)从文件读入或使用spark_df spark.createDataFrame(pandas_df)从pandas数据中读入创建DataFrame df.show()展示数据 df.select(列名)实现按列选取数据 df.write.csv(new_path)保存数据
部分操作函数如下 df.printSchema()展示结构信息 df.filter()条件如df[age]10实现按条件过滤 df.groupby(列名)实现分组 df.sort(df[age].desc())实现按年龄降序排序
工程实践
其实该算法最关键的就是根据已有的打分矩阵计算svd分解并压缩后的矩阵VV矩阵与用户输入矩阵做矩阵乘法就可以生成一张用户关于每部电影的预测矩阵后续可以根据该矩阵给用户推荐关于spark使用svd的官方教程在此目前打算构建成一个前后端交互项目前端将用户打分数据传到后台后台推荐算法把推荐的电影信息给前端展示流程大概如下 其中后端推荐算法主要是将用户特征向量与V矩阵做矩阵乘法获得预测矩阵根据该矩阵给用户推荐电影流程图如下 文件代码结构如下 其中internet文件负责处理网络信息main为主函数matrix_calculate负责把大打分矩阵拆解压缩出V矩阵recommend实现给用户推荐的具体算法。
主函数
因为本项目为前后端交互故采用socket模式死循环内监听端口接受处理信息并发送信息给客户端主函数代码如下
import recommend
import pandas as pd
import socket
import internet
score_matrixpd.read_csv(E:\\software\\DataBase\\Data\\movie_data\\ratings_matrix.csv,header0,index_col0)
predict_matrixpd.read_csv(E:\\software\\DataBase\\Data\\movie_data\\predict_matrix.csv,header0,index_col0)
if __name__ __main__:sock socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 实例化对象sock.bind((ip, 1111)) # 绑定IP端口sock.listen(2) # 监听端口允许排队的个数为nconn, addr sock.accept() # 获取连接对象和地址while True:try:print(等待客户端发送数据...)data conn.recv(1024) # 接收文件数据if not data:breakprint(收到, data.decode())# 电影id评分movie_list,score_list, internet.parse(data.decode())# 信息更新到数据库internet.receive(movie_list, score_list)# 建立用户向量指定user用户分解矩阵user_vectorrecommend.zip_user_vector(score_matrix,user)# 获得k个预测结果movie_idrecommend.predict_movie_id(user_vector,predict_matrix,20)# 在电影表中查找信息movie_listrecommend.predict_movie(movie_id)# 电影信息发送给前端internet.send_recommendation(conn,movie_list)except:print(连接断开)预测矩阵spark计算
该节是最体现大数据工作的地方也是本次项目不得不用大数据框架之处2k电影×8万用户的打分矩阵计算svd矩阵分解在个人电脑上会直接内存溢出如果用原始数据想必服务器也遭不住所以该方法一定需要分布式计算来负载压力。
同时该部分是我卡的最久的地方首先spark语法不清楚内部使用的数据结构不了解每步执行都处在为什么报错和为什么能执行的疑惑中如今结束了再次整理思路 1svd分解pyspark有现成的库调库computeSVD即可实现其中参数k表示取前k个奇异值 2computeSVD是RowMatrix的一个方法故执行前要先将数据转为RowMatrix但该结构又是一个分布式矩阵在本地使用前要先收集一下相关介绍如下
RowMatrix是ApacheSparkMLlib库中的一个类它表示一个分布式行矩阵。
它主要用于对大规模数据集进行线性代数操作如奇异值分解SVD、主成分分析PCA等。RowMatrix的每行都是一个向量并且这些向量可以分布式地存储在集群的不同节点上。
这使得它特别适合处理大型数据集因为它允许在分布式环境中进行线性代数操作而不需要将所有数据加载到单个节点上。3分解矩阵usv分别是三种不同类型的矩阵要分别处理保存相关介绍如下 U左奇异矩阵类型为RowMatrix。它是一个分布式行矩阵其中包含了SVD分解后的左奇异向量。由于它是一个分布式矩阵因此无法直接像本地矩阵那样进行操作但可以通过其方法如rows来访问其行数据。s奇异值向量类型为Vector。它是一个包含所有奇异值的向量这些奇异值按照从大到小的顺序排列。这个向量是一个本地向量可以直接在驱动程序中进行操作。V右奇异矩阵类型为Matrix。它是一个本地矩阵包含了SVD分解后的右奇异向量。这个矩阵可以直接在驱动程序中进行操作例如进行矩阵乘法或提取特定的列向量。4该过程计算量大耗时长执行前无比谨慎别因为一点小问题白费一个小时的等待。
计算过程直接展示代码
def caculate_svd_v(csv_path):start_time time.time()print(正在加载spark...)conf SparkConf().setAppName(svd).setMaster(local)sc SparkContext(confconf)print(正在加载数据...)# 直接使用textFile的方式读取数据然后再进行map操作raw_data sc.textFile(csv_path)raw_data raw_data.map(lambda x: x.split(,))matrix RowMatrix(raw_data)print(矩阵构建完成)print(开始计算SVD...)# 是否计算U矩阵压缩阶数k为15svd matrix.computeSVD(15, computeU True)cost_timetime.time()-start_timeprint(计算完成耗时,cost_time)print(正在转化矩阵为pandas...)df_u row_to_df(svd.U)df_spd.DataFrame(svd.s.toArray())df_Vvector_to_df(svd.V)print(正在保存结果...)df_u.to_csv(E:\\software\\DataBase\\Data\\movie_data\\u.csv)df_s.to_csv(E:\\software\\DataBase\\Data\\movie_data\\s.csv)df_V.to_csv(E:\\software\\DataBase\\Data\\movie_data\\v.csv)其中转化pandas过程中有两个函数需要自行编写分别处理RowMatrix和Vector代码展示如下
def row_to_df(vector):# collect 方法将分布式向量转换为本地向量然后将其转换为pandas数据框print(正在转化u矩阵...)# 返回一个列表uvector.rows.collect()print(计算U矩阵规格为,len(u),*,len(u[0]),,len(u)*len(u[0]))return pd.DataFrame(u)
def vector_to_df(dense_matrix):# 用于将dense矩阵转换为pandas数据框print(获取到dense的值为,dense_matrix)print(正在转化V矩阵...)# 获取行列数rows dense_matrix.numRowscols dense_matrix.numColsprint(计算V矩阵规格为, rows, *, cols,, rows * cols)valuedense_matrix.toArray()# 获得np值nplistlist(value)v_listnp.array(nplist).reshape(rows,cols)# 根据np值转为pandas数据框dfpd.DataFrame(v_list)print(获取到的pandas值为,df)return df这部分开始一直报错也是因为不了解其中的结构要对矩阵s,u,v分别输出时发现总也不行仔细看看会发现其实是类型问题此时再根据类型去查解决方案即可计算机中遇到的每个问题都有前人解决过只要把问题问得够具体够详细就没有解决不了的困难。
但该步仍有疑问没能解决 1单机如何实现性能扩展 spark负责分布式计算的资源调度和负载均衡可以用集群的力量解决一个大问题但本次实验中spark采用单机部署并没有其他计算机可供spark调度它是如何实现大矩阵运算而不内存溢出呢
2文件读入方式不同导致崩溃 上述代码几乎重构过三次第二次时我为了借助pandas库对标签过滤的方便选择将数据先读入pandas再由pandas传给RDD到此都一切顺利而等到计算svd时又会出现内存溢出错误。当时观察了RDD输出都和spark直接读取文件无异其背后原因到目前尚不得解。
推荐流程
该部分实现四个函数 1计算svd的k阶压缩。spark加载计算较慢处理后的V矩阵和用户矩阵可以用本机环境直接计算故需自行编写该函数。 2计算用户的特征向量。计算V矩阵时将隐向量设置为15大意为15种电影类型用户的标记也应该压缩到对15种电影的标记该步使用svd分解压缩法实现。 3计算预测矩阵并返回其中前k个最大值的电影id。V矩阵与特征向量做点积生成预测矩阵因为只针对一个用户预测故该矩阵其实是一个向量在向量中选取前k个索引到电影表中查找对应的电影id。为了免去对index和columns的过滤处理我单独设置了一张不含标签纯打分信息的表nolabel该过程增加了磁盘开销但减少了我的大脑开销 4根据电影id在电影表中查找电影信息。该步就比较简单了用pd.loc索引查找电影id相关电影信息加入列表即可。 四个函数的代码展示如下
def get_svd(matrix,k):# 根据矩阵计算svd并取前k个奇异值U, sigma, VT np.linalg.svd(matrix,full_matricesFalse)# 主对角线数组值其余均为0sigmanp.diag(sigma)# 截取前k个奇异值U_kU[:, :k]sigma_ksigma[:k, :k]VT_kVT[:k, ]return U_k, sigma_k, VT_kdef zip_user_vector(file,user_id):# 负责将用户特征向量分解成3个矩阵分别是USVT只用U作为用户的特征向量print(正在计算用户特征向量...)recordfile.loc[user_id].valuesprint(record)print(record.shape)print(正在分解用户矩阵)recordrecord.reshape(5, -1)# 隐向量压缩为15u,s,vget_svd(record,3)uu.reshape(1,-1)print(分解后的矩阵格式为, u.shape)print(分解后的矩阵为, u)return udef predict_movie_id(user_matrix,predict_matrix,k):# 给出k部预测的电影idprint(正在预测用户评分...)matrixnp.dot(user_matrix,predict_matrix)# 将数组降序排列返回数组的索引print(正在选择电影)sort_listnp.argsort(matrix)[::-1]# 选前k个最大值的索引index_listsort_list[0][0:k]print(获得电影索引为,index_list)# 根据索引查找电影idmovie pd.read_csv(E:\\software\\DataBase\\Data\\movie_data\\blank_ratings_matrix.csv, header0, index_col0)label movie.columnsmovie_id[]for i in index_list:movie_id.append(label[i])print(预测结果为,movie_id)return movie_iddef predict_movie(movie_id):# 根据电影id在表中查找相关电影信息dfpd.read_csv(E:\\software\\DataBase\\Data\\movie_data\\new_movies.csv,header0,index_col0)movie_list[]for i in movie_id:# csv文件中id为整型iint(i)movie_list.append(df.loc[i])return movie_list综合使用如下代码进行推荐
# 获得用户向量
user_vectorzip_user_vector(pd.read_csv(E:\\software\\DataBase\\Data\\movie_data\\ratings_matrix.csv,header0,index_col0),user)
# 获得预测电影id
movie_idpredict_movie_id(user_vector,pd.read_csv(E:\\software\\DataBase\\Data\\movie_data\\predict_matrix.csv,header0,index_col0),3)
# 根据id查找电影信息
print(predict_movie(movie_id))输出结果如下 目前可以实现推荐功能但因为数据集问题其中记录有重复的因为算法本身依赖数据集格式时间精力有限故暂时不作调整。
报文解析
该部分就两个功能 1将前端传来的数据解析成电影id和打分情况写入打分表文件。 2将后端生成的电影信息发送到前端。
直接展示代码
def receive(movie_list,score_list):# 接受电影id和打分情况并写入文件filepd.read_csv(E:\\software\\DataBase\\Data\\movie_data\\ratings_matrix.csv,header0,index_col0)for i in range(len(movie_list)):file.loc[user,movie_list[i]]score_list[i]file.to_csv(E:\\software\\DataBase\\Data\\movie_data\\ratings_matrix.csv)def send_recommendation(conn,movie_list):for i in movie_list:conn.send(i)总结
要说推荐系统也从属于机器学习我是有点doubt的它可一点没学全是我教的。不过就到现在的学习经历来说计算机内的定义和区分并不十分严谨和界限分明流传的很多说法甚至根本不是它的真正意思只是因为它看起来是这样而一直被这么叫所以实现之前不管对方是大佬还是小白多问一嘴也是给自己省事。
该项目实现了简单的推荐系统浅尝了一次推荐算法再次搞了前后端的交互要说读了研就是不一样这项目含金量比起本科不知道高了多少可跟实际情况比起来还是差很多但毕竟只是个作业了解到这一步我觉得已经极限了对于刚入学两个月的我做到这我认为已经极限了对不一定当作主要方向纯粹爱好驱动的尝试也已经极限了。
总结与展望 1真正的大数据。不说上亿条数据起码把整个数据集跑起来吧这期间需要应该要学一些性能优化的方法。 2改进的推荐算法算法在实际应用中可能仍然不够实际相关算法也有改进算法可以使用甚至直接自己改进算法也不是不可能的。 3优化安全的前后端。到目前前后端通信框架从来没使用过安全性健壮性压根没考虑只是单纯从实现角度完成看现在行情都是要全栈开发岗应该对整个流程都是要花点心思。
写在后面
前面的总结都是写于算法原理的初步探索阶段在求知欲得到满足的快乐时期真正实现起来暂时想不到比一步一个坑更雅的说法。当时的很多小想法到现在都被磨平了现在只觉得尽快实现比什么都重要可以看到在我的代码中不乏简单粗暴和力大飞砖——反正电脑累总比我累强另一方面也是期末时间紧任务重不太有精力和心境去慢慢打磨作品了再加上可能人知道的越多就知道自己有更多不知道的到现在结束阶段只觉得项目实在粗糙甚至像小孩过家家不过还是不能站在当下嘲笑过去幼稚的自己最近的话怎么说那不是小丑那是我的来时路写csdn一方面算是做笔记另一方面也算记录自己的成长之路。 文章转载自: http://www.morning.lbqt.cn.gov.cn.lbqt.cn http://www.morning.tfqfm.cn.gov.cn.tfqfm.cn http://www.morning.qbfwb.cn.gov.cn.qbfwb.cn http://www.morning.qnhcx.cn.gov.cn.qnhcx.cn http://www.morning.xqndf.cn.gov.cn.xqndf.cn http://www.morning.wfqcs.cn.gov.cn.wfqcs.cn http://www.morning.mxnrl.cn.gov.cn.mxnrl.cn http://www.morning.bmbnc.cn.gov.cn.bmbnc.cn http://www.morning.tbqdm.cn.gov.cn.tbqdm.cn http://www.morning.qbwbs.cn.gov.cn.qbwbs.cn http://www.morning.rwxnn.cn.gov.cn.rwxnn.cn http://www.morning.nnjq.cn.gov.cn.nnjq.cn http://www.morning.cbnlg.cn.gov.cn.cbnlg.cn http://www.morning.gmztd.cn.gov.cn.gmztd.cn http://www.morning.jnhhc.cn.gov.cn.jnhhc.cn http://www.morning.lggng.cn.gov.cn.lggng.cn http://www.morning.yhxhq.cn.gov.cn.yhxhq.cn http://www.morning.mprky.cn.gov.cn.mprky.cn http://www.morning.ldcrh.cn.gov.cn.ldcrh.cn http://www.morning.ggqcg.cn.gov.cn.ggqcg.cn http://www.morning.ykbgs.cn.gov.cn.ykbgs.cn http://www.morning.rnytd.cn.gov.cn.rnytd.cn http://www.morning.jwtjf.cn.gov.cn.jwtjf.cn http://www.morning.bby45.cn.gov.cn.bby45.cn http://www.morning.dspqc.cn.gov.cn.dspqc.cn http://www.morning.qpfmh.cn.gov.cn.qpfmh.cn http://www.morning.hmbxd.cn.gov.cn.hmbxd.cn http://www.morning.qhmql.cn.gov.cn.qhmql.cn http://www.morning.nyqnk.cn.gov.cn.nyqnk.cn http://www.morning.gjsjt.cn.gov.cn.gjsjt.cn http://www.morning.wtdhm.cn.gov.cn.wtdhm.cn http://www.morning.qbzdj.cn.gov.cn.qbzdj.cn http://www.morning.qcymf.cn.gov.cn.qcymf.cn http://www.morning.txfzt.cn.gov.cn.txfzt.cn http://www.morning.mplb.cn.gov.cn.mplb.cn http://www.morning.dbphz.cn.gov.cn.dbphz.cn http://www.morning.tgqzp.cn.gov.cn.tgqzp.cn http://www.morning.sldrd.cn.gov.cn.sldrd.cn http://www.morning.dbddm.cn.gov.cn.dbddm.cn http://www.morning.mzhgf.cn.gov.cn.mzhgf.cn http://www.morning.rdymd.cn.gov.cn.rdymd.cn http://www.morning.qsswb.cn.gov.cn.qsswb.cn http://www.morning.pkrb.cn.gov.cn.pkrb.cn http://www.morning.bpmnj.cn.gov.cn.bpmnj.cn http://www.morning.zfhwm.cn.gov.cn.zfhwm.cn http://www.morning.rnmc.cn.gov.cn.rnmc.cn http://www.morning.zrgdd.cn.gov.cn.zrgdd.cn http://www.morning.zpfqh.cn.gov.cn.zpfqh.cn http://www.morning.frsxt.cn.gov.cn.frsxt.cn http://www.morning.phgz.cn.gov.cn.phgz.cn http://www.morning.klwxh.cn.gov.cn.klwxh.cn http://www.morning.ntzfj.cn.gov.cn.ntzfj.cn http://www.morning.jpmcb.cn.gov.cn.jpmcb.cn http://www.morning.djgrg.cn.gov.cn.djgrg.cn http://www.morning.qgfy.cn.gov.cn.qgfy.cn http://www.morning.ailvturv.com.gov.cn.ailvturv.com http://www.morning.mkfhx.cn.gov.cn.mkfhx.cn http://www.morning.zmlbq.cn.gov.cn.zmlbq.cn http://www.morning.txtzr.cn.gov.cn.txtzr.cn http://www.morning.jhfkr.cn.gov.cn.jhfkr.cn http://www.morning.lmyq.cn.gov.cn.lmyq.cn http://www.morning.xbyyd.cn.gov.cn.xbyyd.cn http://www.morning.qyqmj.cn.gov.cn.qyqmj.cn http://www.morning.qzsmz.cn.gov.cn.qzsmz.cn http://www.morning.sxmbk.cn.gov.cn.sxmbk.cn http://www.morning.wqbrg.cn.gov.cn.wqbrg.cn http://www.morning.dlgjdg.cn.gov.cn.dlgjdg.cn http://www.morning.fhcwm.cn.gov.cn.fhcwm.cn http://www.morning.ykmg.cn.gov.cn.ykmg.cn http://www.morning.dxrbp.cn.gov.cn.dxrbp.cn http://www.morning.rwls.cn.gov.cn.rwls.cn http://www.morning.rjkfj.cn.gov.cn.rjkfj.cn http://www.morning.lddpj.cn.gov.cn.lddpj.cn http://www.morning.rwjh.cn.gov.cn.rwjh.cn http://www.morning.hwxxh.cn.gov.cn.hwxxh.cn http://www.morning.rpkl.cn.gov.cn.rpkl.cn http://www.morning.wpxfk.cn.gov.cn.wpxfk.cn http://www.morning.nqpxs.cn.gov.cn.nqpxs.cn http://www.morning.rwzmz.cn.gov.cn.rwzmz.cn http://www.morning.rnzgf.cn.gov.cn.rnzgf.cn