运行LINE

来源:互联网 发布:工业机器人控制算法 编辑:程序博客网 时间:2024/05/21 17:06

这是和项目开始的第一步,需要在自己的电脑上运行LINE的c++文件。

1. 安装boost库。

安装的时候的步骤:

https://jingyan.baidu.com/article/a3aad71aa1ebe7b1fb009681.html

http://blog.csdn.net/u013777351/article/details/50733974

出现的问题:

https://jingyan.baidu.com/article/a24b33cd7005d719fe002b09.html

2.运行

https://github.com/tangjianpku/LINE

我选择windows系统,首先下载youtube的数据(txt文件),notepad++打开train_youtube.bat(可执行文件),即可看见有指令,更改txt文件名称(可看-train选项更改)。

接着对每个cpp文件都运行g++ -o xxx xxx.cpp,可得exe文件。

最后cmd cd到当前目录,输入train_youtube.bat,即可得到答案。

补充:在linux(ubuntu)上运行LINE:

A.装GSL库;

1. 首先在http://ftp.club.cc.cmu.edu/pub/gnu/gsl/下载gsl-1.16.tar.gz
2. tar -zxvf gsl-1.9.tar.gz 解压在/home/dengmin下
3. ./configure --prefix=YOUR_DIRECTORY
比如我习惯安装在如下目录/home/dengmin/gsl1.16
4.make
5.make install
6.使用vi编辑器,编辑用户根目录下配置文件。
vi ~/.bashrc

在文件末尾加上下面的代码:

#GSL
export PATH=$PATH:YOUR_DIRECTORY/bin
export C_INCLUDE_PATH=$C_INCLUDE_PATH:YOUR_DIRECTORY/include
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:YOUR_DIRECTORY/lib
export GSL_LD=YOUR_DIRECTORY/lib

这里YOUR_DIRECTORY就是/home/dengmin/gsl1.16这个路径。
保存,退出
其中最后一个是为了方便链接使用。

7.source ~/.bashrc

B. 运行

之后可能还会出现连接不上库啊之类的情况,看这里:https://www.daniweb.com/programming/software-development/threads/289812/can-t-link-gsl-properly

第二个答案上:

g++ -c -I/usr/include/gsl main.cppg++ -c -I/usr/include/gsl extraFunc.cpp// Then the link:g++ -o testProg main.o extraFunc.o -lgsl
用这个就可以!!

接着要更改目录下.sh的权限

>chmod u+x *.sh

>./train_youtube.sh

另:此次运行时间超级久,久到你可以看完这篇论文·······标题:LINE: Large-scale information network embedding


因此我读了一遍论文,题目上面说过了,重点读了3,4两个部分。

首先定义信息网络:G=(V,E),V是节点集合,每个节点代表一个数据对象。E是边集合,表示两个数据对象之间的关系。

e ∈ E是一组有序的数据对,e=(u,v)是有向边,有权重(权值恒大于0),表示关系的强弱。

如果G是有向图,(u,v)!=(v,u), w(uv)!=w(vu);如果G是无向图,则(u,v)=(v,u), w(uv)=w(vu);




目标:将信息网络映射为低维空间(向量)

问题:不能有信息缺失,如何准确保存?

定义:

1. 要保存两个节点之间成对出现的关系——一级亲密度。

即:对e=(u,v),w(uv)=first-order proximity。若(u,v)间没有边则first-order proximity=0;

这一般反映了在现实网络中两个节点的相似程度。


2. 两个节点是没有边直接相连,但是本质上有关联。——二级亲密度(以用来解决稀疏图)

有相似邻居的可能会相互有关系。在语义网中,一个单词与另一个单词都与相似的一堆词共同出现,则一般有相同的含义。

一对节点(u,v),向量pu = (wu,1, . . . , wu,| V| ) ,向量pv = (wv,1, . . . , wv,| V| ),都由其一级亲密度(first-order proximity)决定向量中每个维度的数值。二级亲密度==两个向量的相似度(similarity)。

若两者都为0,则二级亲密度为0;


解决方法:

此论文采用一个特殊的映射网络模型,起名为"LINE";

做法:分开保存一级亲密度和二级亲密度,然后合并两种亲密度。


一级亲密度的求法:

联合概率:


向量ui是低维的向量表示。

经验概率:


为能够保存值,要使得O1最小:


即:用KL-分布表示的,经验概率和联合概率的距离要最小。

注:一级亲密关系只对无向图有效,对有向图无效。

遍历找到ui向量,使得O1最小,就可以在d维空间表示每个点。


二级亲密度:

可供有向图、无向图使用的公式。给定一个不失一般性的图,可以看成一个有向图(无向边可以看成两条有向边)。

因为,每个节点都有自己特殊的语境,语境分布相似的节点就可以看作相似。


所以:每个结点有两个角色——a, 节点本身,这就可以用表示, b, 每个节点都可以看成是其他节点的语境,可用表示。



对有向(i,j),由vi到vj的条件概率为:



为了保存二级亲密度,我们要使低维表示的状态分布与经验概率分布相近,

所以取的最小值,同样也是KL分布。


结合:先训练后联合。



优化:

很多啊·····················很多很多啊··········


读程序补充:


我根据train_youtube.bat里面的步骤来看的。这几个cpp文件不是相互引用的,可以单独运行,所以有一些代码相互有重复。

首先,reconstruct.cpp:

用了hash表存储不同名称的节点的值。

这个程序的重点是把net_youube.txt的数据洗一遍。因为原本数据格式不对、youtube的数据的稀疏性,所以reconstruct将邻居的邻居节点的权值也加入每个节点中了。

结果:得到一个密度高一点的数据集。此程序可以不用。


接着,LINE.cpp:

用的是dense的net_youtube_dense.txt文件,读数据的步骤和之前一样。

InitAliasTable();这个函数,是别名采样方法。我参考了http://blog.csdn.net/haolexiao/article/details/65157026。

InitVector():

InitNegTable():这个函数是负采样方法减少需要载入的数量,具体方法解释:http://blog.csdn.net/itplus/article/details/37998797





原创粉丝点击