zoukankan      html  css  js  c++  java
  • 8.2.py 知识图谱

    该章节涉及到知识图谱的知识,我们先说几个概念

    1.节点和边

    节点就是现实世界存在的实体,边就是实体和实体之间的关系

     2.权重

    权重通常用与衡量关系的强弱,权重越大,比如说用户A给用户B打了15个电话,则权重为15

    3.有向图无向图

    根据边是否有方向,分为有向图和无向图,比如说用户A给用户B打了15个电话就是有向图,但是A和B是同事就是无向图了。

    4.中心度和相似性

    中心度来衡量网络中每一个节点的活跃程度,其中衡量中心度有多重方式,下面介绍几种表示方法

    (1)度:节点的度是指与该节点相连的边的个数,节点的度越大,说明该节点在该网络中越活跃,使groupby和count或者nunique()结合使用可以计算度,也可以使用networkx.degree()计算

    (2)Eigenvector中心度:只是使用度就是中心度,乜有考虑到邻接节点的信息,Eigenvector的设计思想是一个节点的活跃并不只体现他有非常大的度,还体现与他相连的节点也有非常多的度。

    (3)Pagerank

    (4)Bbtweennss

    Jaccard相似度

    5.节点分类

    要对节点进行分类预测,首先要找到从网络中抽取特征的方法,即通过特殊的表达手段,将网络中的节点空间关系抽象为一个向量

    (1)朴素节点分类

    朴素节点分类思想非常简单,只需要根据节点与其他节点是否相连,进行one-hot编码后,排列成列向量,和标签一起带人分类器进行训练

    节点A的向量 表示为[0,1,0,0,1]

    因为A和B、E向量,因此[A,B,C,D,E]只有B和E的位置是1,其余都是0

    (2)邻节点加权投票

    在知识图谱中,通常认为,用户 的信息会由边进行传播并不断衰减,而朴素节点分类中,没有考虑到节点之间的相互作用,一般来说相连的用户可能具有相同的标签,比如一个用户被打上欺诈标签,那么他的一度联系人会转变成欺诈用户的概率会大大提高,这种情况下,可以使用一种叫共生节点分类的半监督学习方法对节点进行分类。

    邻节点加权投票(WVRN)是一种典型的共生节点分类法,每一个无标签节点 i 的标签由其邻居 N(i)进行加权投票得到,公式到时再补上

    权重就体现在节点 i 的邻居节点标签的概率上,也就是说,邻居中对自己标签最有信息的节点,对应节点 i 的贡献也会越大,从而可以根据网络中部分有标签样本的标签,迭代得到其余无标签样本的标签,最终,网络中的每个节点的标签概率会收敛到一个稳定的值。

    (3)一致性标签传播 

    根据邻居节点概率加权投票的方式,虽然考虑到了节点信息的流转,但是每一次更新的时候都没有将自身的信息考虑进去,简单来说,一个节点在经历一次更新时,相比自身原来的标签不应该有太大的改变。如果想把每个节点自身的信息考虑进去,可以使用另一种共生节点分类的算法,一致性标签传播(CLPM),一致性标签传播也是一种半监督的学习方法,可以根据网络中有部分标签样本的标签,迭代得到其余无标签的样本的标签。

    6.社区发现算法

    对于团伙欺诈检测,主要有2类发现算法:

    (1)社区检测:通过对固定的网络社区进行划分,从而得到一个个团簇结构;

    (2)社区搜索:首先给定一个网络社区和其中的某个节点A,然后从节点A出发寻找与A有关的社区;

    GN算法:Girvan-Newman算法是最经典的社区发现算法之一,基本思想是,如果去除社群之间连接的边,留下的就是社群。该算法认为,2个社群之间的点的最短路径总是要通过社群间的连接边,因此中心度越大的边,越可能是不同社群的连接边,所以只需要不断将中心度大的边去掉,就可以得到独立的社群。

    算法步骤如下:

    (1)计算所有边的边中心度;

    (2)将边中心度最高的边去掉;

    (3)重新计算被去掉的边影响的边的边中心度;

    (4)重新第2和第3步,直至不连通的社群个数达到预想值;

    import networkx as nx  
    from networkx.algorithms import community  
    import itertools  
      
    G = nx.karate_club_graph()  
    nx.draw(G,with_labels=True,  
            edge_color='grey',  
            node_color='pink',  
            node_size = 500,  
            font_size = 40,  
            pos=nx.spring_layout(G,k=0.2))  
    comp = community.girvan_newman(G)     
    # 令社区个数为4,这样会依次得到K=2,K=3,K=4时候的划分结果
    k = 4  
    limited = itertools.takewhile(lambda c: len(c) <= k, comp)  
    for communities in limited:  
        print(tuple(sorted(c) for c in communities)) 

    Louvain算法

    在实际使用中,GN算法虽然准确率很高,但是计算量很大,时间复杂度也高,因此再推出Louvain算法

  • 相关阅读:
    【反射】Java反射机制
    Composer教程之常用命令
    Composer教程之基础用法
    Composer教程之初识Composer
    Composer 的结构详解
    现代 PHP 新特性系列(七) —— 内置的 HTTP 服务器
    现代 PHP 新特性系列(一) —— 命名空间
    现代 PHP 新特性系列(二) —— 善用接口
    现代 PHP 新特性系列(三) —— Trait 概览
    现代 PHP 新特性系列(四) —— 生成器的创建和使用
  • 原文地址:https://www.cnblogs.com/cgmcoding/p/15384965.html
Copyright © 2011-2022 走看看