基于耦合网络的推荐系统

作者:陈东瑞

1.复杂网络基础知识

当我们拿起手机给家人、朋友或者同事拨打电话时,就不知不觉中参与到了社交网络形成的过程中;当我们登上高铁或者飞机时,就可以享受交通网络给我们带来的方便;即使当我们躺在床上什么也不干时,大脑中的神经元们也会形成巨大的复杂网络相互传递信号,帮助我们思考或者行动。复杂网络是将现实世界中各种大型复杂系统抽象成网络来进行研究的一种理论工具,在自然界中存在的大量复杂系统都可以通过形形色色的网络加以描述。

1.1 网络的表示方法

一个典型的网络是由许多节点与节点之间的连边组成,其中节点用来代表真实系统中不同的个体,而边则用来表示节点之间的关系,往往是两个节点之间存在某种特定的关系则连一条边,反之则无连接,边相连的两个节点在网络中被看作是相邻的。为了方便计算,我们通常使用邻接矩阵来表示网络。根据网络的边的类型不同,可以将网络分为无权无向网络、有向网络、含权网络,对应的邻接矩阵表示如下:

1.2 网络的统计特征

  • :与节点直接相连的边数;在有向网络中可以分为出度和入度。
  • 聚集系数:节点的邻居间互为邻居的可能,衡量的是网络的集团化程度

C i = 该节点邻居间实际相连的边的数量 可能的最大连接边数 k i ( k i − 1 ) / 2 C_i = \frac{该节点邻居间实际相连的边的数量}{可能的最大连接边数 k_i(k_i -1)/2} Ci​=可能的最大连接边数ki​(ki​−1)/2该节点邻居间实际相连的边的数量​

我们对所计算出的聚集系数求算术平均数,可以得到平均聚集系数,并以此来衡量整个网络的聚集程度。

  • 最短路径:两个节点相连的最短连通路径
  • 介数:介数包括节点介数和边介数。
    • 节点介数指网络中所有最短路径中经过该节点的数量比例
    • 边介数则指网络中所有最短路径中经过该边的数量比例
    • 介数反映了相应的节点或者边在整个网络中的作用和影响力

1.3 常见的复杂网络模型

常用的网络模型分为规则网络、随机网络、小世界网络、无标度网络四类。

  • 规则网络

规则网络是最简单的网络模型。在这种类型的网络中,任意两个节点之间的连接遵循既定的规则,通常每个节点的近邻数目都相同。

  • 随机网络

节点之间是否产生连边是完全随机的。

  • 小世界网络

小世界网络模型是由瓦茨和斯特罗加茨在1998年《自然》上发表的《小世界网络的集体动力学》一文中提出的。他们发现,规则网络的群聚性较高,但网络之平均距离也大;而随机网络的平均距离较短,其群聚性也低。真实世界的网络既非完全规则,也非完全随机,而是介于这两者之间,于是有学者引入了小世界网络模型。

  • 无标度网络

无标度网络是在网络中的大部分节点(小度节点)只和很少节点连接,而有极少的节点与(大度节点)非常多的节点连接。

基于复杂网络实现推荐系统的背景介绍

链路预测是指如何通过已知的网络结构等信息,预测网络中尚未产生连边的两个节点之间产生连接的可能性。预测那些已经存在但尚未被发现的连接实际上是一种数据挖掘的过程,而对于未来可能产生的连边的预测则与网络的演化相关。链路预测可以应用在电商网站中。如果将电商网站中的商品看成一类节点,用户看成另一类节点,如果用户A购买了商品b,A与b之间则形成一条连边,这种边只在不同类型的节点间存在的网络成为二分网络,而在二分网络中的链路预测问题其实也是推荐系统的一种。


下面我们来简单介绍一个基于复杂网络的做推荐系统的文章《Information Filtering via Biased Random Walk on Coupled Social
Network》。文章通过将用户的社交网络和用户——商品二分图网络进行耦合,综合了用户的社交信息与商品偏好信息对用户进行商品推荐。
耦合社交网络(CSN)包含耦合节点(用户),其在社交网络层中形成领导者——跟随者关系和信息网络层中的收藏关系。下图是一个简单的耦合社交网络示意图,圆圈表示用户,方块表示对象。上半部分是五个用户的社交关系网络, U 4 U_4 U4​指向 U 5 U_5 U5​的连边表示, U 4 U_4 U4​是 U 5 U_5 U5​的追随者,他俩之间存在一定程度的相似性。下半部分是一个二分网络,对象 O 5 O_5 O5​与用户 U 5 U_5 U5​之间存在连边,表示用户 U 5 U_5 U5​收藏了 O 5 O_5 O5​ 。若只有下半部分网络,我们无法将商品 O 5 O_5 O5​推荐给用户 U 4 U_4 U4​,当我们将社交网络中 U 4 U_4 U4​与 U 5 U_5 U5​之间的相似性考虑进来后,我们可以将对象 O 5 O_5 O5​推荐给用户 U 4 U_4 U4​。接下来,我们来具体解释该方法如何在推荐系统中发挥作用。

3. 模型介绍

对一个推荐系统,我们将其分成两个部分,用户集 U = { U 1 , U 2 , . . . , U m } U = \{U_1, U_2, ...,U_m\} U={U1​,U2​,...,Um​}和对象集 O = { O 1 , O 2 , . . . , O n } O = \{O_1, O_2, ...,O_n\} O={O1​,O2​,...,On​},表示有 m m m个用户和 n n n个对象。定义邻接矩阵 A m ∗ n A_{m*n} Am∗n​来表示该网络,
a i α = { 1 用户 U i 已经收藏了对象 O α 0 用户 U i 没有收藏对象 O α a_{i\alpha} = \begin{cases} 1 & 用户U_i已经收藏了对象O_\alpha \\ 0 & 用户U_i没有收藏对象O_\alpha \end{cases} aiα​={10​用户Ui​已经收藏了对象Oα​用户Ui​没有收藏对象Oα​​
邻接矩阵 B m ∗ n B_{m*n} Bm∗n​来表示用户——对象二分图,
b i j = { 1 用户(或对象) i 已经收藏了对象(或用户) j 0 其他 b_{ij} = \begin{cases} 1 & 用户(或对象)i 已经收藏了对象(或用户)j \\ 0 & 其他 \end{cases} bij​={10​用户(或对象)i已经收藏了对象(或用户)j其他​

3.1 社交网络上的随机游走

  • $P_{ij}’ 是社交网络上的转移概率,从用户 是社交网络上的转移概率,从用户 是社交网络上的转移概率,从用户U_i 游走到用户 游走到用户 游走到用户U_j$:

P i j ′ = { b i j k j o u t i f k j o u t ≠ 0 0 o t h e r w i s e (1) P_{ij}' = \begin{cases} \frac{b_{ij}}{k_j^{out}} & if \ k_j^{out} \neq 0 \\ 0 & otherwise \end{cases}\tag{1} Pij′​={kjout​bij​​0​if kjout​=0otherwise​(1)

  • S i ′ ( t ) S_i'(t) Si′​(t)表示在t时刻其他用户游走到用户 U i U_i Ui​的概率,

S i ′ ( t + 1 ) = { ∑ j = 1 m b i j k j o u t i f k j o u t ≠ 0 0 o t h e r w i s e (2) S_i' (t+1) = \begin{cases} \sum_{j = 1}^{m} \frac{b_{ij}}{k_j^{out}} & if \ k_j^{out} \neq 0 \\ 0 & otherwise \end{cases}\tag{2} Si′​(t+1)={∑j=1m​kjout​bij​​0​if kjout​=0otherwise​(2)

  • 初始概率

    • 对于目标用户 U i U_i Ui​, S i ′ ( 0 ) = 1 S_i'(0) = 1 Si′​(0)=1
    • 对于其他用户 U j U_j Uj​, S j ′ ( 0 ) = 1 S_j'(0) = 1 Sj′​(0)=1
#社交网络上的游走
#输入用户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

3.2 二分图上的随机游走

  • 用户到商品的转移概率:
    P i α ′ = { a i α k i i f k i ≠ 0 0 o t h e r w i s e (3) P_{i\alpha}' = \begin{cases} \frac{a_{i\alpha}}{k_i} & if \ k_i \neq 0 \\ 0 & otherwise \end{cases}\tag{3} Piα′​={ki​aiα​​0​if ki​=0otherwise​(3)
  • 商品到用户的转移概率:
    P α j ′ ′ = { a j α k α i f k α ≠ 0 0 o t h e r w i s e (4) P_{\alpha j}'' = \begin{cases} \frac{a_{j\alpha}}{k_{\alpha}} & if \ k_{\alpha} \neq 0 \\ 0 & otherwise \end{cases}\tag{4} Pαj′′​={kα​ajα​​0​if kα​=0otherwise​(4)
  • 定义 S α ′ ′ ( t ) S_{\alpha}'' (t) Sα′′​(t) 和 S j ′ ′ ( t ) S_{j}'' (t) Sj′′​(t) 为二部图中商品 α \alpha α 和用户 t t t 在时刻的概率:

S i ′ ’ ( t + 1 ) = { ∑ α = 1 m a i α k α S α ′ ′ ( t ) i f k α ≠ 0 0 o t h e r w i s e (5) S_i'’ (t+1) = \begin{cases} \sum_{\alpha = 1}^{m} \frac{a_{i\alpha}}{k_{\alpha}} S_{\alpha}''(t)& if \ k_{\alpha} \neq 0 \\ 0 & otherwise \end{cases}\tag{5} Si′​’(t+1)={∑α=1m​kα​aiα​​Sα′′​(t)0​if kα​=0otherwise​(5)

S α ′ ’ ( t + 1 ) = { ∑ j = 1 m a j α k j S j ′ ′ ( t ) i f k j ≠ 0 0 o t h e r w i s e (6) S_{\alpha}'’ (t+1) = \begin{cases} \sum_{j = 1}^{m} \frac{a_{j\alpha}}{k_j} S_j''(t) & if \ k_j \neq 0 \\ 0 & otherwise \end{cases}\tag{6} Sα′​’(t+1)={∑j=1m​kj​ajα​​Sj′′​(t)0​if kj​=0otherwise​(6)
当 t t t为奇数且 t ≥ 3 t \geq3 t≥3 时, S α ′ ′ ( t ) S_{\alpha}'' (t) Sα′′​(t) 表示用户 U i U_i Ui​(初始值设为1的用户)选择未收藏商品 O α O_{\alpha} Oα​的概率。

#在二部图网络上的游走
#第一步游走,从用户到商品
# 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].valuesfor 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

3.3 耦合社交网络上的有偏随机游走

耦合网络中,从社交网络中用户与二分图网络中商品游走到二分图网络中的用户
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B4qSkyBd-1571046313642)(https://cdn.nlark.com/yuque/0/2019/svg/503359/1569572289544-94dab1aa-b1b1-4254-bcdf-2fb5546fce04.svg#align=left&display=inline&height=140&name=image.svg&originHeight=140&originWidth=800&search=&size=32395&status=done&width=800)]

S α ( t + 1 ) = { ∑ j = 1 m a j α k j S j ( t ) i f k j ≠ 0 0 o t h e r w i s e (8) S_{\alpha}(t+1) = \begin{cases} \sum_{j=1}^{m} \frac{a_{j\alpha}}{k_j}S_j(t) & if \ k_j \neq 0 \\ 0 & otherwise \end{cases}\tag{8} Sα​(t+1)={∑j=1m​kj​ajα​​Sj​(t)0​if kj​=0otherwise​(8)

初始概率:

  • 对于目标用户 U i U_i Ui​, S i ′ ′ ( 0 ) = 1 S_i''(0) = 1 Si′′​(0)=1
  • 对于其他用户 U U U和商品 α \alpha α, S j ( α ) = 0 S_j(\alpha) = 0 Sj​(α)=0, S α = 0 S_{\alpha} = 0 Sα​=0

当 t t t 为奇数,且 t ≥ 3 t \geq 3 t≥3 时, S α ′ ′ ( t ) S_{\alpha}''(t) Sα′′​(t)表示用户 U i U_i Ui​ 选择未收藏商品 O α O_{\alpha} Oα​ 的概率(设定目标用户的初始值为1单位资源, t = 1 t = 1 t=1 时,资源从目标用户游走到与目标用户相邻对象; t = 2 t = 2 t=2 时,资源从对象再次游走到用户)。

#耦合网络游走,用户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].valuesfor 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

评价指标:

  • P r e c i s i o n Precision Precision 精确度,用户选择的商品在推荐列表中的比例。 p r e c i s i o n i = N r s i / L precision ^i= N_{rs}^i/L precisioni=Nrsi​/L

N r s i N_{rs}^i Nrsi​:对用户 U i U_i Ui​ 推荐的商品出现在测试集中的数量, L L L:推荐列表的长度。

  • R e c a l l Recall Recall 召回率,推荐的商品在用户收藏列表中的比例。 r e c a l l i = N r s i / N p i recall^i = N_{rs}^i/N_p^i recalli=Nrsi​/Npi​,
    N p i N_p^i Npi​:用户 U i U_i Ui​ 在测试集中收藏的商品数量
  • F − m e a s u r e = 2 ∗ P r e c i s i o n × R e c a l l P r e c i s i o n + R e c a l l F-measure = \frac{2*Precision \times Recall}{Precision+Recall} F−measure=Precision+Recall2∗Precision×Recall​
  • H D HD HD 汉明距离,衡量用户推荐列表的多样性。 H D i j = 1 − Q i j ( L ) / L HD_{ij} = 1 - Q_{ij}(L)/L HDij​=1−Qij​(L)/L, Q i j Q_{ij} Qij​ 是用户 i i i 与用户 j j j 的推荐列表中具有相同商品的数量。
  • R a n k i n g S c o r e ( r ) Ranking Score(r) RankingScore(r):衡量用户对推荐列表的满意度, r i α = L i α / N i r_{i\alpha} = L_{i\alpha}/N_{i} riα​=Liα​/Ni​。 L i α L_{i\alpha} Liα​ 是用户未收藏的商品 α \alpha α 在用户 i i i 推荐列表中的位置。 N i N_i Ni​ 是推荐列表的长度。

4. 结果分析

4.1 数据描述

Epinions与Friendfeed两个公开数据集均包含一个社交关系数据集和一个评分数据集。下表对数据集对应的网络进行描述。以Epinions为例,文章中随机抽取一部分数据进行分析,采样数据规模为:4066个用户,7649个对象,用户与对象连边(收藏)数量为154122条,社交网络连边数为217017。网络密度为5x10-3 。

Table 1: Properties of the tested data sets

4.2 参数 λ \lambda λ 与 t t t 对实验结果的影响

λ \lambda λ为资源在社交网络与二分图网络中的分配比例, t t t 为游走步长,下图使用排序的分进行衡量,值颜色越偏冷色表示效果越好,图中可以看出在 t = 3 t=3 t=3 时,预测效果较好。 当 λ = 0 \lambda = 0 λ=0 时,预测效果仅依赖于二分图网络,随着 λ \lambda λ 增加,社交网络的信息被逐渐考虑进来。

Figure1:Ranking score values on Epinions and Friendfeed data sets (color online).

(a)Epinions (b)Friendfeed

4.3 预测效果

下表展示了预测长度 L = 20 L = 20 L=20 时,该模型与 MD(mass diffusion) 模型和 UCF(user-based CF) 模型的效果比较。

Table2 Algorithmic performance for Epinions data set with recommendation list L =20

Table3 Algorithmic performance for Friendfeed data set with recommendation list L =20

**本项目已在mo平台实现,记得来fork呀:**https://momodel.cn/explore/5d70809e85fab71bf10a556a?type=app

关于我们

Mo(网址:https://momodel.cn)是一个支持 Python 的人工智能在线建模平台,能帮助你快速开发、训练并部署模型。

欢迎关注我们的微信公众号:MomodelAI

同时,欢迎使用 「Mo AI编程」 微信小程序

以及登录官网,了解更多信息

Mo,发现意外,创造可能


Mo 人工智能俱乐部 是由网站的研发与产品设计团队发起、致力于降低人工智能开发与使用门槛的俱乐部。团队具备大数据处理分析、可视化与数据建模经验,已承担多领域智能项目,具备从底层到前端的全线设计开发能力。主要研究方向为大数据管理分析与人工智能技术,并以此来促进数据驱动的科学研究。

目前俱乐部每两周在杭州举办线下论文分享与学术交流。希望能汇聚来自各行各业对人工智能感兴趣的朋友,不断交流共同成长,推动人工智能民主化、应用普及化。

【Mo 人工智能技术博客】基于耦合网络的推荐系统相关推荐

  1. 【Mo 人工智能技术博客】胶囊网络——Capsule Network

    胶囊网络--Capsule Network 作者:林泽龙 1. 背景介绍 CNN 在处理图像分类问题上表现非常出色,已经完成了很多不可思议的任务,并且在一些项目上超过了人类,对整个机器学习的领域产生了 ...

  2. 【Mo 人工智能技术博客】基于 Python 和 NLTK 的推特情感分析

    基于 Python 和 NLTK 的推特情感分析 作者:宋彤彤 1. 导读 NLTK 是 Python 的一个自然语言处理模块,其中实现了朴素贝叶斯分类算法.这次 Mo 来教大家如何通过 python ...

  3. 【Mo 人工智能技术博客】StarGAN——生成你的明星脸

    1 GAN 介绍 GAN,叫做生成对抗网络 (Generative Adversarial Network) .其基本原理是生成器网络 G(Generator) 和判别器网络 D(Discrimina ...

  4. 【Mo 人工智能技术博客】多标准中文分词 Multi-Criteria-CWS

    多标准中文分词 Multi-Criteria-CWS 作者:宋彤彤 自然语言处理(NLP)是人工智能中很重要且具有挑战性的方向,而自然语言处理的第一步就是分词,分词的效果直接决定和影响后续工作的效率. ...

  5. 【Mo 人工智能技术博客】利用Logistic函数和LSTM分析疫情数据

    利用Logistic函数和LSTM分析疫情数据 作者:林泽龙 Mo 1. 背景 2019 新型冠状病毒 (SARS-CoV-2),曾用名 2019-nCoV,通用简称新冠病毒,是一种具有包膜的正链单股 ...

  6. 【Mo 人工智能技术博客】使用 Seq2Seq 实现中英文翻译

    1. 介绍 1.1 Deep NLP 自然语言处理(Natural Language Processing,NLP)是计算机科学.人工智能和语言学领域交叉的分支学科,主要让计算机处理或理解自然语言,如 ...

  7. 【Mo 人工智能技术博客】现在最流行的图神经网络库 pytorch geometric 上手教学

    简介 Graph Neural Networks 简称 GNN,称为图神经网络.近年来 GNN 在学术界受到的关注越来越多,与之相关的论文数量呈上升趋势,GNN 通过对信息的传递,转换和聚合实现特征的 ...

  8. 【Mo 人工智能技术博客】采用 Python 机器学习预测足球比赛结果

    采用 Python 机器学习预测足球比赛结果 足球是世界上最火爆的运动之一,世界杯期间也往往是球迷们最亢奋的时刻.比赛狂欢季除了炸出了熬夜看球的铁杆粉丝,也让足球竞猜也成了大家茶余饭后最热衷的话题.甚 ...

  9. 【Mo 人工智能技术博客】图卷积网络概述及其在论文分类上的应用

    近年来,深度学习在计算机视觉.自然语言处理等领域大放异彩.这些领域所面对的数据都是结构化的,如图像.音频.文本等,它们内部都有明确的排列规则.结构化的数据由于具有这些确定的规则而方便处理,但是在现实生 ...

最新文章

  1. 华为harmonyos 2.0,华为王成录博士:HarmonyOS 2.0给消费者不一样的体验
  2. 计算机网络协议分层体系结构
  3. 转!!java中File的delete()方法删除文件失败的原因
  4. 开关电源输出整流二极管
  5. gradle修改版本
  6. Linux上如何查看物理CPU个数,核数,线程数
  7. apache php 升级5.6,升级 apache2.4.41-php5.6.40
  8. oracle+连接格式,oracle外连接符号(+)的用法
  9. “找不到网络路径”的检测方法及解决方案
  10. Bootstrap 第一天
  11. Manjaro-KDE自定义应用列表
  12. android 更换系统壁纸,Android使用线程更换壁纸
  13. Delphi XE生成UUID
  14. 离散数学左孝凌版答案
  15. laravel 中Predis使用手册
  16. 蚂蚁金服高要求的领域建模能力,对研发来说到底指什么?
  17. Amaze UI 图标查询
  18. 爱快软路由在VMware上安装过程分享,基于多网卡的本机+带多机上网,考研计算机网络实战
  19. linux centos fedora 安装LBP2900打印机 LBP6230dn LBP6240dn
  20. 2022电子科技大学软件工程860考研复试个人分享

热门文章

  1. 《HTML与CSS网站设计实践之旅》读书笔记
  2. 门禁服务器业务导航不显示,门禁一卡通管理软件重大问题解决办法
  3. 基础35 空心三角形
  4. 在树莓派上用python实现人脸识别(face_recognition,PIL,opencv)
  5. 美国银行账户里的美元(目前大概每月有五六万),有什么更好的办法转到国内的人民币账户上?
  6. 学生免费申请JetBrains许可证
  7. VR概述及初识Unity 3D
  8. CLK_OF_DECLARE 解析
  9. 五种企业家,一定不要建自己的网站
  10. nvm安装成功后npm命令'npm' 不是内部或外部命令,也不是可运行的程序 或批处理文件。