搜索引擎风控应用

时间:2022-05-27 18:32:26

互联网中的网页可以看出是一个有向图,其中网页是结点,如果网页A有链接到网页B,则存在一条有向边A->B,下面是一个简单的示例:

  搜索引擎风控应用

这个例子中只有四个网页,如果当前在A网页,那么悠闲的上网者将会各以1/3的概率跳转到BCD,这里的3表示A3条出链,如果一个网页有k条出链,那么跳转任意一个出链上的概率是1/k,同理DBC的概率各为1/2,而BC的概率为0。一般用转移矩阵表示上网者的跳转概率,如果用n表示网页的数目,则转移矩阵M是一个n*n的方阵;如果网页jk个出链,那么对每一个出链指向的网页i,有M[i][j]=1/k,而其他网页的M[i][j]=0;上面示例图对应的转移矩阵如下:

搜索引擎风控应用

初试时,假设上网者在每一个网页的概率都是相等的,即1/n,于是初试的概率分布就是一个所有值都为1/nn维列向量V0,用V0去右乘转移矩阵M,就得到了第一步之后上网者的概率分布向量MV0,nXn*(nX1)依然得到一个nX1的矩阵。下面是V1的计算过程:

搜索引擎风控应用

注意矩阵MM[i][j]不为0表示用一个链接从j指向iM的第一行乘以V0,表示累加所有网页到网页A的概率即得到9/24。得到了V1后,再用V1去右乘M得到V2,一直下去,最终V会收敛,即Vn=MV(n-1),上面的图示例,不断的迭代,最终V=[3/9,2/9,2/9,2/9]‘:

上述上网者的行为是一个马尔科夫过程的实例,要满足收敛性,需要具备一个条件:

  • 图是强连通的,即从任意网页可以到达其他任意网页:

互联网上的网页不满足强连通的特性,因为有一些网页不指向任何网页,如果按照上面的计算,上网者到达这样的网页后便走投无路、四顾茫然,导致前面累计得到的转移概率被清零,这样下去,最终的得到的概率分布向量所有元素几乎都为0。假设我们把上面图中CA的链接丢掉,C变成了一个终止点,得到下面这个图:

搜索引擎风控应用

另外一个问题就是陷阱问题,即有些网页不存在指向其他网页的链接,但存在指向自己的链接。比如下面这个图:
搜索引擎风控应用

上网者跑到C网页后,就像跳进了陷阱,陷入了漩涡,再也不能从C中出来,将最终导致概率分布值全部转移到C上来,这使得其他网页的概率分布值为0,从而整个网页排名就失去了意义。如果按照上面图对应的转移矩阵为:

搜索引擎风控应用
不断的迭代下去,就变成了这样:

搜索引擎风控应用

上面过程,我们忽略了一个问题,那就是上网者是一个悠闲的上网者,而不是一个愚蠢的上网者,我们的上网者是聪明而悠闲,他悠闲,漫无目的,总是随机的选择网页,他聪明,在走到一个终结网页或者一个陷阱网页(比如两个示例中的C),不会傻傻的干着急,他会在浏览器的地址随机输入一个地址,当然这个地址可能又是原来的网页,但这里给了他一个逃离的机会,让他离开这万丈深渊。模拟聪明而又悠闲的上网者,对算法进行改进,每一步,上网者可能都不想看当前网页了,不看当前网页也就不会点击上面的连接,而上悄悄地在地址栏输入另外一个地址,而在地址栏输入而跳转到各个网页的概率是1/n。假设上网者每一步查看当前网页的概率为a,那么他从浏览器地址栏跳转的概率为(1-a),于是原来的迭代公式转化为:

搜索引擎风控应用
现在我们来计算带陷阱的网页图的概率分布:

搜索引擎风控应用
重复迭代下去,得到:

搜索引擎风控应用



1     Vertica数据库与distributedR相关预处理

1.1 必要包库的安装加载

1.1.1 Vertica数据库相关包库

install.pages(“rJava”)

install.pages(“DBI”)

install.pages(“RJDBC”)

#下载Vertica相关R语言包

 

library(rJava) 

library(DBI)

library(RJDBC)

#加载Vertica相关R语言包(注意Java的路径设置)

 

1.1.2 distributedR相关包库

library(distributedR)

library(HPdgraph)

library(HPdata)

#加载distributedR相关R语言包

 

1.2Vertica和distributedR的启动

1.2.1 建立Vertica和distributedR之间的连接

drv<-JDBC("com.vertica.jdbc.Driver","/opt/mount2/distributedR/vertica-jdbc-7.1.1-0.jar"," ` ")

conn<-dbConnect(drv,"jdbc:vertica://g9t3395.houston.hp.com:5433/shr2_vrt_itg?user=xxxx&password=xxxxx")

#蓝色处为用户账号和密码

1.1.2 启动distributedR

distributedR_start()

#三个节点启动完毕


2数据准备

2.1 原始数据清洗

projectinfo <- dbGetQuery(conn, "SELECT C_IP,S_IP FROMesdw_itg.webproxy_log limit 10000")

#从Vertica数据库中抽取10000组(C_IP,S_IP)攻击数据

val1 <- projectinfo

val2 <- as.matrix(val1[c("C_IP","S_IP")])

#将从Vertica数据库中抽取的数据进行矩阵化处理

2.2 原始数据序列化

getOrder <- function(ematrix) {

A<-c(ematrix[,1],ematrix[,2])

A<- unique(A)

A<- sort(A)

for (i in 1:nrow(ematrix)){

for(j in 1:ncol(ematrix)){

ematrix[i,j] <- which(A==ematrix[i,j])

}

}

ematrix

}

val4<-getOrder(val2)

#将矩阵化后的数据进行排序,并用排序值代替原始IP

2.3 构造邻接矩阵

n<-length(unique(as.numeric(val4)))

A<- matrix(0,n,n)

#构造nxn的0矩阵

adjacencyMatrix <- function(edges) {

for(i in 1:(nrow(edges))) {

A[as.numeric(edges[i,1]),as.numeric(edges[i,2])]<-1

}

A

}

val5<-adjacencyMatrix(val4)

#将排序矩阵构造成0-1的邻接矩阵

 

3  hpdpagerank执行

3.1  进行pagerank算法数据预处理

val6<-as.darray(val5,c(dim(val5)[1],floor(dim(val5)[1]/3)))

#将邻接矩阵处理成hpdpagerank需要的darray型

 搜索引擎风控应用

 

3.2pagerank算法执行

val7<-hpdpagerank(val6)

#执行distributedR中的pagerank算法

4  hpdpagerank结果数据处理

4.1  网页节点概率值排序

val8<-getpartition(val7)

val9<-sort(val8[1,])

 

4.2 网页排名前若干概率展示(该处取前10)

val10<-val9[(length(val9)-9):length(val9)]  

#C_IP概率最大值的前十名值(由小到大)

val11<-match(val10,val8)                 

#C_IP概率最大值前十名对应的序号

4.3 网页排名前若干节点IP(该处取前10)

B<-sort(unique(c(val2[,1],val2[,2])))

val12<-B[val11]

#C_IP概率最大值的前十名(由小到大)