当咱们拿起手机给家人、朋友或者同事拨打电话时,就不知不觉中参与到了社交网络造成的过程当中;当咱们登上高铁或者飞机时,就能够享受交通网络给咱们带来的方便;即便当咱们躺在床上什么也不干时,大脑中的神经元们也会造成巨大的复杂网络相互传递信号,帮助咱们思考或者行动。复杂网络是将现实世界中各类大型复杂系统抽象成网络来进行研究的一种理论工具,在天然界中存在的大量复杂系统均可以经过形形色色的网络加以描述。
python
一个典型的网络是由许多节点与节点之间的连边组成,其中节点用来表明真实系统中不一样的个体,而边则用来表示节点之间的关系,每每是两个节点之间存在某种特定的关系则连一条边,反之则无链接,边相连的两个节点在网络中被看做是相邻的。为了方便计算,咱们一般使用邻接矩阵来表示网络。根据网络的边的类型不一样,能够将网络分为无权无向网络、有向网络、含权网络,对应的邻接矩阵表示以下:
网络
度app
:与节点直接相连的边数;在有向网络中能够分为出度和入度。dom
汇集系数:节点的邻居间互为邻居的可能,衡量的是网络的集团化程度svg
<br />咱们对所计算出的汇集系数求算术平均数,能够获得平均汇集系数,并以此来衡量整个网络的汇集程度。
复制代码
经常使用的网络模型分为规则网络、随机网络、小世界网络、无标度网络四类。工具
规则网络是最简单的网络模型。在这种类型的网络中,任意两个节点之间的链接遵循既定的规则,一般每一个节点的近邻数目都相同。测试
节点之间是否产生连边是彻底随机的。大数据
小世界网络模型是由瓦茨和斯特罗加茨在1998年《天然》上发表的《小世界网络的集体动力学》一文中提出的。他们发现,规则网络的群聚性较高,但网络之平均距离也大;而随机网络的平均距离较短,其群聚性也低。真实世界的网络既非彻底规则,也非彻底随机,而是介于这二者之间,因而有学者引入了小世界网络模型。网站
无标度网络是在网络中的大部分节点(小度节点)只和不多节点链接,而有极少的节点与(大度节点)很是多的节点链接。
链路预测是指如何经过已知的网络结构等信息,预测网络中还没有产生连边的两个节点之间产生链接的可能性。预测那些已经存在但还没有被发现的链接其实是一种数据挖掘的过程,而对于将来可能产生的连边的预测则与网络的演化相关。链路预测能够应用在电商网站中。若是将电商网站中的商品当作一类节点,用户当作另外一类节点,若是用户A购买了商品b,A与b之间则造成一条连边,这种边只在不一样类型的节点间存在的网络成为二分网络,而在二分网络中的链路预测问题其实也是推荐系统的一种。
对一个推荐系统,咱们将其分红两个部分,用户集
#社交网络上的游走
#输入用户ID,几率prob,文中lama,游走步长step
user_id = '23298'
prob = 1
step = 3
# def social_network_walk(user_id, prob, step):
user_group = trust_df.groupby(trust_df[0])
#第一步游走
id_neighbors = list(user_group.get_group(user_id)[1].values)
user_prob_dic = {}
for user_id in id_neighbors:
user_prob_dic[user_id] = prob/len(id_neighbors)
user_dict = user_prob_dic.copy()
#以后的游走
for _ in range(step-2):
for item in user_dict.items():
uesr_id = item[0]
prob = item[1]
id_neighbors = list(user_group.get_group(user_id)[1].values)
for user_id in id_neighbors:
try:
user_prob_dic[user_id] += prob/len(id_neighbors)
except KeyError:
user_prob_dic[user_id] = prob/len(id_neighbors)
user_dict = user_prob_dic.copy()
# return user_dict
user_dict
复制代码
#在二部图网络上的游走
#第一步游走,从用户到商品
# def bipartite_walk(user_id, perct):
user_id = '23298'
prob = 1
objection_group = ratings_df.groupby(ratings_df[0]) #以用户未依据,对对象进行分类,同一个用户收藏的对象
user_group = ratings_df.groupby(ratings_df[1]) #以对象为依据,对用户进行分类,以对象为依据,同一对象被哪些用户收藏
objection_dict = {}
user_dict = {}
#第一步用户到对象
user_neighbors = objection_group.get_group(user_id)[1].values #用户的邻居是对象
for objection_id in user_neighbors:
print(objection_id)
objection_dict[objection_id] = prob/len(user_neighbors)
# #第二步对象到用户
# objection_lis = objection_dict.keys()
for item in objection_dict.items():
objection_id = item[0]
prob = item[1]
objection_neighbors = user_group.get_group(objection_id)[0].values
for user_id in objection_neighbors:
try:
user_dict[user_id] += prob/len(objection_neighbors)
except KeyError:
user_dict[user_id] = prob/len(objection_neighbors)
# #
# #第三步,用户到对象
for item in user_dict.items():
user_id = item[0]
prob = item[1]
user_neighbor = list(objection_group.get_group(user_id)[1].values)
for obj_id in user_neighbor:
try:
objection_dict[obj_id] += prob/len(user_neighbor)
except KeyError:
objection_dict[obj_id] = prob/len(user_neighbor)
objection_dict
复制代码
耦合网络中,从社交网络中用户与二分图网络中商品游走到二分图网络中的用户
当
#耦合网络游走,用户23298在耦合网络随机游走,步长为三,转移几率0.7
user_id = '23298'
prob_social = 0.7
step = 3
prob_bi = 1-prob_social
social_user_group = trust_df.groupby(trust_df[0])
#以用户未依据,对对象进行分类,同一个用户收藏的对象
bi_objection_group = ratings_df.groupby(ratings_df[0])
#以对象为依据,对用户进行分类,以对象为依据,同一对象被哪些用户收藏
bi_user_group = ratings_df.groupby(ratings_df[1])
objection_dict = {}
user_dict = {}
#第一步用户到对象
user_neighbors = bi_objection_group.get_group(user_id)[1].values #用户的邻居是对象
for objection_id in user_neighbors:
objection_dict[objection_id] = prob_social/len(user_neighbors)
for _ in range(int((step-1)/2)) :
#第二步,对象到用户
for item in objection_dict.items():
objection_id = item[0]
prob = item[1]
objection_neighbors = bi_user_group.get_group(objection_id)[0].values
for user_id in objection_neighbors:
try:
user_dict[user_id] += prob/len(objection_neighbors)
except KeyError:
user_dict[user_id] = prob/len(objection_neighbors)
user_neighbors = list(social_user_group.get_group(user_id)[1].values)
for user_id in user_neighbors:
try:
user_dict[user_id] += prob_social/len(user_neighbors)
except KeyError:
user_dict[user_id] = prob_social/len(user_neighbors)
# #第三步,用户到对象
for item in user_dict.items():
user_id = item[0]
prob = item[1]
user_neighbor = list(objection_group.get_group(user_id)[1].values)
for obj_id in user_neighbor:
try:
objection_dict[obj_id] += prob/len(user_neighbor)
except KeyError:
objection_dict[obj_id] = prob/len(user_neighbor)
objection_dict
复制代码
评价指标:
Epinions与Friendfeed两个公开数据集均包含一个社交关系数据集和一个评分数据集。下表对数据集对应的网络进行描述。以Epinions为例,文章中随机抽取一部分数据进行分析,采样数据规模为:4066个用户,7649个对象,用户与对象连边(收藏)数量为154122条,社交网络连边数为217017。网络密度为5x10-3 。
Table 1: Properties of the tested data sets
Figure1:Ranking score values on Epinions and Friendfeed data sets (color online).
下表展现了预测长度
Table3 Algorithmic performance for Friendfeed data set with recommendation list L =20
Mo(网址:https://momodel.cn)是一个支持 Python 的人工智能在线建模平台,能帮助你快速开发、训练并部署模型。
Mo 人工智能俱乐部 是由网站的研发与产品设计团队发起、致力于下降人工智能开发与使用门槛的俱乐部。团队具有大数据处理分析、可视化与数据建模经验,已承担多领域智能项目,具有从底层到前端的全线设计开发能力。主要研究方向为大数据管理分析与人工智能技术,并以此来促进数据驱动的科学研究。
目前俱乐部每两周在杭州举办线下论文分享与学术交流。但愿能汇聚来自各行各业对人工智能感兴趣的朋友,不断交流共同成长,推进人工智能民主化、应用普及化。