deepwalk源码解读6: graph.py

阿里移动推荐算法竞赛实战:从特征工程到模型融合的完整指南 在机器学习与数据科学领域,推荐系统是连接用户与内容的核心技术,其本质是通过算法预测用户偏好并实现个性化匹配。其原理通常基于协同过滤、内容过滤或深度学习模型,通过分析用户历史行为与物品属性来建模复杂关系。这项技术的核心价值在于提升用户体验、增加平台粘性与商业转化率,广泛应用于电商、内容平台、社交网络等场景。特征工程作为其中关键环节,涉及从原始行为数据中提炼有效信号,例如通过统计用户-商品交互频次、构造时间衰减特征来捕捉动态兴趣。模型构建常采用梯度提升决策树(如LightGBM)处理表格数据,并结合深度学习模型 阅读详情

1. collections.defaultdict

  1. Python中collections.defaultdict()使用
  2. collections — Container datatypes
  3. Python isinstance() 函数

2. 源码解读


# !/usr/bin/env python
# -*- coding: utf-8 -*-

"""Graph utilities."""

# import logging

from io import open
# from time import time
from six.moves import range, zip, zip_longest
from six import iterkeys
from collections import defaultdict, Iterable, Counter
import random
from itertools import permutations
from scipy.io import loadmat
from scipy.sparse import issparse

from concurrent.futures import ProcessPoolExecutor

from multiprocessing import cpu_count


# logger = logging.getLogger("deepwalk")
#
# __author__ = "Bryan Perozzi"
# __email__ = "bperozzi@cs.stonybrook.edu"
#
# LOGFORMAT = "%(asctime).19s %(levelname)s %(filename)s: %(lineno)s %(message)s"


class Graph(defaultdict):
    """
    defaultdict与dict用法几乎一样,只是比dict多了一些用法而已
    """
    """
    我们更愿意使用defaultdict而不是dict主要原因是defaultdict比dict更不容易报错例如
    >>>x_defaultdict=defaultdict(int)
    >>>print(x_defaultdict["key1"])
    程序输出:0

    >>>x_dict=dict()
    >>>print(x_dict["key1"])
    程序输出:KeyError: 'key1'

    对于dict类型,你可以为没有出现过的key进行赋值,但是不可以直接使用
    例如可以做 x_dict["key1"]=1
    但是不可以做 x_dict["key1"]+=1
    """

    def __init__(self):
        """
        这句话的意思是,构建的图是一个字典,key是节点,key对应的value是list,表示该节点所在边的另一端节点序列
        Graph的__init__直接订制于defaultdict的__init__(default_factory=None, **kwargs)
        其中default_factory在这里被制定为list,即字典的value类型全部为list
        事实上如果你构建了一个Graph实例然后print出来后,会得到类似的输出形式:

        defaultdict(
                        <class 'list'>,

                        {
                            1: [2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 18, 20, 22, 32],
                            2: [1, 3, 4, 8, 14, 18, 20, 22, 31],
                            ……
                            34: [9, 10, 14, 15, 16, 19, 20, 21, 23, 24, 27, 28, 29, 30, 31, 32, 33]
                        }
                    )

        当第一次出现某一个key时,这里会默认设置这个key的value为[]
        """
        # super(Graph, self).__init__(list) # 这是python2.x的语法
        super().__init__(list)  # 这是python3.x的语法

    def nodes(self):
        """返回图中的所有节点
        下面这个是dict固有的方法
        """
        return self.keys()

    def adjacency_iter(self):
        """
        iteritems() 和 viewitems() 是python2.x中dict的函数
        Python 3.x 里面,iteritems() 和 viewitems() 这两个方法都已经废除了
        在Python2.x中,items( )用于返回一个字典的拷贝列表,占额外的内存。
        iteritems() 用于返回本身字典列表操作后的迭代,不占用额外的内存。
        Python 3.x 里面,items() 得到的结果是和 2.x 里面 viewitems() 一致的。
        在3.x 里 用 items()替换iteritems() ,可以用于 for 来循环遍历。
        """

        """
        dict_items([(1, [2, 4, 5, 6]), (2, [1, 3]),...,)
        返回节点和它的邻居
        """
        return self.items()  # 源代码这里写的是iteritems()

    def subgraph(self, nodes={}):
        """
        这个函数返回的是graph的子图
        :param nodes:
        :return:
        """
        subgraph = Graph()

        for n in nodes:
            if n in self:
                subgraph[n] = [x for x in self[n] if x in nodes]
        """
        这里self相当于字典,n in self可以理解为关键字是否在字典中
        self[n]是找字典中关键字为n的对应的value,上面一行的代码意思是把nodes中的节点和对应的边
        添加到子图subgraph中
        值得注意的是,虽然源代码中nodes默认是{},但是这个函数中并没有使用key对应的value,
        因此这里直接传一个list也是可以的。
        """
        return subgraph

    def make_undirected(self):
        """
        将有向图变为无向图
        :return:
        """

        # t0 = time()

        for v in self.keys():
            for other in self[v]:
                if v != other:
                    """
                          考虑这样一种情形:
                          1:[2,3...]
                          2:[4,...]
                          当遍历1号节点时,发现2在1的list中,于是执行self[2].append(1),这样变成了:
                          1:[2,3...]
                          2:[4,...,1]
                          现在遍历到了2号节点,发现1在2的list中,于是执行self[1].append(2),这样变成了:
                          1:[2,3...,2] 出现了两个2
                          2:[4,...,1]
                          """
                    # if v != other and v not in self[other]:
                    # #这行代码可以替代上一行,不需要下面的去重操作,但是需要排序
                    self[other].append(v)

        # t1 = time()
        # logger.info('make_directed: added missing edges {}s'.format(t1 - t0))

        self.make_consistent()
        """这个函数的作用是:
        1. 用来去除重复的,因为之前的工作会得到酱紫的输出:
            {1: [2, 5, 6, 2, 4, 5, 6], 2: [1, 3], ...},每一对节点都保留了两条边
        2. 同时,这个函数还可以保证每一项的list是从小到达排序的。
        3. 最后这个函数内部调用了remove_self_loops(),可以去除掉自循环(自己到自己的边)
        """
        return self

    def make_consistent(self):
        """这个函数的作用是:
        1. 用来去除重复的,因为之前的工作会得到酱紫的输出:
            {1: [2, 5, 6, 2, 4, 5, 6], 2: [1, 3], ...},每一对节点都保留了两条边
        2. 同时,这个函数还可以保证每一项的list是从小到达排序的。
        3. 最后这个函数内部调用了remove_self_loops(),可以去除掉自循环(自己到自己的边)
        """
        # t0 = time()
        for k in iterkeys(self):
            self[k] = list(sorted(set(self[k])))
            # 原来的每一项list self[k]先进行set函数去重,
            # 然后经过sorted函数进行排序,
            # 最后转化为list进行重新赋值
        # t1 = time()
        # logger.info('make_consistent: made consistent in {}s'.format(t1 - t0))

        # print("not remove_self_loops", self)
        self.remove_self_loops()
        # print("remove_self_loops:",self)

        return self

    def remove_self_loops(self):
        """
        去除掉节点到自己的自循环
        :return:
        """
        # removed = 0
        # t0 = time()

        for x in self:
            if x in self[x]:
                self[x].remove(x)
                # removed += 1

        # t1 = time()
        #
        # logger.info('remove_self_loops: removed {} loops in {}s'.format(removed, (t1 - t0)))
        return self

    def check_self_loops(self):
        """
        检查是否含有自回路
        :return:
        """
        for x in self:
            for y in self[x]:
                if x == y:
                    return True

        return False

    def has_edge(self, v1, v2):
        """
        判断两个节点之间是否有边
        :param v1:
        :param v2:
        :return:
        """
        if v2 in self[v1] or v1 in self[v2]:
            return True
        return False

    def degree(self, nodes=None):
        """
        这个函数用来求节点的度数对于有向图而言,求的是入度或初度(具体是哪个要看你到dic是根据什么构建的)
        输入的nodes参数可以是一个节点编号,也可以是一系列节点的可迭代对象如list。如果是单个节点,则直接返回
        节点的度,如果是一些列节点,则返回dic,key对应为目标节点,value为该节点对应的度数。
        :param nodes:
        :return:
        """
        if isinstance(nodes, Iterable):
            return {v: len(self[v]) for v in nodes}
        else:
            return len(self[nodes])

    

    # def order(self):
    #     "Returns the number of nodes in the graph"
    #     """
    #     这段代码仅仅被下面的number_of_nodes函数调用,其实没必要在这里单独开一个函数,之所以这样写,是因为
    #     这套代码是deepwalk新版本的代码,为了向下兼容,保留了这个order的接口,在这里我们把这个接口直接删掉
    #     """
    #     return len(self)

    def number_of_edges(self):
        "Returns the number of nodes in the graph"
        """
        请注意,这里的边的个数对应的是无向图,如果是有向图,需要去掉除以2的操作
        """
        return sum([self.degree(x) for x in self.keys()]) / 2

    def number_of_nodes(self):
        "Returns the number of nodes in the graph"
        # return self.order()  # 这个源代码
        return len(self)  # 这个是我们删掉了order旧接口后的代码

    def random_walk(self, path_length, alpha=0, rand=random.Random(), start=None):
        """ Returns a truncated random walk.
            返回一些较短的随机游走路径
            path_length: Length of the random walk.
            alpha: probability of restarts.
            start: the start node of the random walk.
            random.Random():产生0-1之间的随机浮点数
            请注意:这里的随机游走路径未必是连续的,有可能是走着走着突然回到起点接着走
        """
        G = self
        if start:
            path = [start]
        else:
            # Sampling is uniform w.r.t V, and not w.r.t E
            path = [rand.choice(list(G.keys()))]

        while len(path) < path_length:
            cur = path[-1]
            if len(G[cur]) > 0:  # 当cur有邻居时
                if rand.random() >= alpha:  # 这是一个经典的概率编程的语句
                    """
                    这条语句成立的概率是1-alpha
                    """
                    path.append(rand.choice(G[cur]))
                else:
                    path.append(path[0])  # 这里应该写的是path.append(cur)吧?
                    """
                    以概率1-alpha从当前节点继续向前走,或者以alpha的概率restart
                    """
            else:
                break
        return [str(node) for node in path]

   

def build_deepwalk_corpus(G, num_paths, path_length, alpha=0,
                          rand=random.Random(0)):
    """
    这个函数可以对一个图生成一个语料库
    :param G:
    :param num_paths:
    :param path_length:
    :param alpha:
    :param rand:
    :return:
    """
    walks = []

    nodes = list(G.nodes())

    for cnt in range(num_paths):
        # 这条语句将下面的random walk过程重复了num_paths次,
        # 相当于每一个节点做num_paths次random walk
        rand.shuffle(nodes)
        for node in nodes:  # 这条语句对图所有的节点各自进行一次random walk
            walks.append(G.random_walk(path_length, rand=rand, alpha=alpha, start=node))

    return walks


def build_deepwalk_corpus_iter(G, num_paths, path_length, alpha=0,
                               rand=random.Random(0)):
    """
    这个函数可以迭代地生成语料库
    :param G:
    :param num_paths:
    :param path_length:
    :param alpha:
    :param rand:
    :return:
    """

    nodes = list(G.nodes())

    for cnt in range(num_paths):
        rand.shuffle(nodes)
        for node in nodes:
            yield G.random_walk(path_length, rand=rand, alpha=alpha, start=node)


def clique(size):
    """

    :param size:
    :return:
    """

    return from_adjlist(permutations(range(1, size + 1)))


# http://stackoverflow.com/questions/312443/how-do-you-split-a-list-into-evenly-sized-chunks-in-python
def grouper(n, iterable, padvalue=None):
    "grouper(3, 'abcdefg', 'x') --> ('a','b','c'), ('d','e','f'), ('g','x','x')"
    return zip_longest(*[iter(iterable)] * n, fillvalue=padvalue)


def parse_adjacencylist(f):
    adjlist = []
    for l in f:
        if l and l[0] != "#":
            introw = [int(x) for x in l.strip().split()]
            row = [introw[0]]
            row.extend(set(sorted(introw[1:])))
            adjlist.extend([row])

    return adjlist


def parse_adjacencylist_unchecked(f):
    adjlist = []
    for l in f:
        if l and l[0] != "#":
            adjlist.extend([[int(x) for x in l.strip().split()]])

    return adjlist


def load_adjacencylist(file_, undirected=False, chunksize=10000, unchecked=True):
    if unchecked:
        parse_func = parse_adjacencylist_unchecked
        convert_func = from_adjlist_unchecked
    else:
        parse_func = parse_adjacencylist
        convert_func = from_adjlist

    adjlist = []

    # t0 = time()

    with open(file_) as f:
        with ProcessPoolExecutor(max_workers=cpu_count()) as executor:
            total = 0
            for idx, adj_chunk in enumerate(executor.map(parse_func, grouper(int(chunksize), f))):
                adjlist.extend(adj_chunk)
                total += len(adj_chunk)

    # t1 = time()
    #
    # logger.info('Parsed {} edges with {} chunks in {}s'.format(total, idx, t1 - t0))

    # t0 = time()
    G = convert_func(adjlist)
    # t1 = time()
    #
    # logger.info('Converted edges to graph in {}s'.format(t1 - t0))

    if undirected:
        # t0 = time()
        G = G.make_undirected()
        # t1 = time()
        # logger.info('Made graph undirected in {}s'.format(t1 - t0))

    return G


def load_edgelist(file_, undirected=True):
    G = Graph()
    with open(file_) as f:
        for l in f:
            x, y = l.strip().split()[:2]
            x = int(x)
            y = int(y)
            G[x].append(y)
            if undirected:
                G[y].append(x)

    G.make_consistent()
    return G


def load_matfile(file_, variable_name="network", undirected=True):
    mat_varables = loadmat(file_)
    mat_matrix = mat_varables[variable_name]

    return from_numpy(mat_matrix, undirected)


def from_networkx(G_input, undirected=True):
    G = Graph()

    for idx, x in enumerate(G_input.nodes_iter()):
        for y in iterkeys(G_input[x]):
            G[x].append(y)

    if undirected:
        G.make_undirected()

    return G


def from_numpy(x, undirected=True):
    G = Graph()

    if issparse(x):
        cx = x.tocoo()
        for i, j, v in zip(cx.row, cx.col, cx.data):
            G[i].append(j)
    else:
        raise Exception("Dense matrices not yet supported.")

    if undirected:
        G.make_undirected()

    G.make_consistent()
    return G


def from_adjlist(adjlist):
    G = Graph()

    for row in adjlist:
        node = row[0]
        neighbors = row[1:]
        G[node] = list(sorted(set(neighbors)))

    return G


def from_adjlist_unchecked(adjlist):
    G = Graph()

    for row in adjlist:
        node = row[0]
        neighbors = row[1:]
        G[node] = neighbors

    return G
阿里移动推荐算法竞赛实战解析:从特征工程到模型融合的完整指南 推荐系统是现代互联网应用的核心技术之一,其核心原理是通过分析用户历史行为数据,预测用户可能感兴趣的物品,实现个性化信息分发。从技术实现上看,推荐系统通常涉及特征工程、模型构建和排序优化等关键环节。在工业实践中,特征工程是将原始用户行为日志转化为模型可理解特征的关键步骤,而模型融合技术则能有效集成不同模型的优势,提升最终推荐效果。以阿里移动推荐算法竞赛为例,参赛者需要处理真实的电商用户行为数据,通过构建统计特征、Embedding特征和序列特征,并运用梯度提升决策树与深度兴趣网络等模型进行融合,最终实现精准的 阅读详情

相关推荐

deepwalk算法

用于deepwalk的python算法代码,很好用的,对于想要理解deepwalk的同学可以看看。

python logging.getlogger_python的问题日志记录.getLogger(姓名)

如果您想为库的记录器自定义日志处理程序,只需在1)上层记录器(例如根记录器)。{a1}作为参考}rootLogger = logging.getLogger('')rootLogger.setLevel(logging.DEBUG)socketHandler = logging.handlers.SocketHandler('localhost',logging.handlers.DEFAULT_...

weixin_35688303的博客 1587

机器学习教程 之 半监督学习 Co-training 协同训练 (论文、算法、数据集、代码)

这篇博客介绍的是一篇用于半监督分类问题的方法: 协同训练 Co-training, A. Blum and T. Mitchell, “Combining labeled and unlabeled data with co-training,” in Proc. of the 11th Annual Conf. on Computational Learning Theory, 1998.,这算是半监督领域里面始祖级的论文了,是1998年两位CMU大佬提出的方法。 之前还写过一篇关于Tri-trainin

冯良骏 的 博客 1万+

DeepWalk 原理详解

DeepWalk 是一种流行的图嵌入方法,用于学习图结构数据中节点的低维表示。它通过将图的节点视作序列数据,利用自然语言处理中的技术(类似于word2vec算法)来捕捉节点间的关系,可以帮助我们理解和利用图中节点的关系。这种方法在社交网络分析、推荐系统、图分类等领域非常有用。在图中,节点可以是人、地点、物品等,而边表示它们之间的关系,例如朋友关系、道路连接等。DeepWalk是通过随机游走在图中采样节点序列,并使用类似word2vec的方法学习这些序列中节点的嵌入向量。

goTsHgo的博客 2385

电子技术设计——16×16点阵汉字显示设计

同时,设计还应注重提升显示品质,以保证汉字的稳定展示和观感舒适。本设计的目的是构建一个能够准确在LED点阵上展示汉字的系统,并允许用户通过输入设备来选择所需的汉字,我们将验证设计方案的实际操作性和效果,以确保其满足设计目标。在LED点阵显示和汉字信息处理技术的结合下,研究者们着手研究如何在LED点阵上有效地显示汉字,并提出了一系列显示算法和优化策略,旨在实现清晰且易于阅读的汉字显示效果。首先,你需要准备16×16的LED点阵面板,通常这些点阵是8×8点阵的两倍,因此可以由两个8×8的点阵组合而成。

weixin_68094467的博客 1533

关于海康网络摄像头使用VLC或者Opencv拉流有延迟的问题

先说结论,我用VLC或者Pyhton opencv直接拉取海康网络摄像头的rtsp流,会有1-2s延时,特别明显。环境:Windows + VLC / Openc-Python。如上面文章介绍,我使用的时候遇到一处错误,需要把代码中的。海康SDK:与网页视频相比,几乎是同步的。上面说的延时,也是与摄像头网页视频相比的。ffplay 去掉缓存:延时1s左右。这两处地方改成左斜杠,才能运行。opencv拉流使用的是。多线程:延时1s左右。

yljxh的博客 4500

推荐系统-召回层-召回算法:Item2vec、Node2vec

运用 Spark 实现经典的 Embedding 方法 Item2vec 和 Deep Walk(使用PySpark MLlib)。Word2vec模型一般分为两种:Skip-gram 模型(中心词决定了它的相邻词),而CBOW相反(是相邻词决定当前的词)。在 Deep Walk 的实现中,着重理解,生成物品间的转移概率矩阵的方法,以及通过随机游走生成训练样本过程。Word2vec的样本生成方法:通过滑动窗口,截取词组,把词组内的词转换成训练样本。.........

u013250861的博客 950

akshare 布林通道策略

import datetime import pandas as pd import backtrader as bt import matplotlib.pyplot as plt from datetime import datetime import matplotlib import akshare as ak %matplotlib inline class Boll_strategy(bt.Strategy): #自定义参数,每次买入1800手 params=(('size'.

qq_26742269的博客 5339

深度探索:机器学习中的DeepWalk算法(无监督图嵌入算法)原理及其应用

DeepWalk作为一种开创性的无监督图嵌入算法,成功地将自然语言处理领域的词嵌入技术引入网络结构学习,为理解和挖掘复杂网络的深层结构提供了有力工具。尽管存在一些局限性,如对随机游走策略的依赖、超参数敏感等,但其简洁的设计理念和广泛的适用性使其在众多实际应用中表现出色。 未来,研究者可继续探索优化游走策略、自适应调整嵌入模型、融合节点属性信息等方向,以进一步提升图嵌入算法的性能和泛化能力。同时,随着图神经网络(GNN)的发展,结合深度学习框架与图嵌入方法的研究有望推动网络表征学习迈向新的高度,为复杂网络系

qq_51320133的博客 3948

grafana对接zabbix数据展示

【配置】点击【模板】点击【创建模板】添加三个监控项:【名称】搜索【】创建的模板;点击上方【监控项】,点击创建【监控项】点击上方【触发器】点击【创建触发器】主机关联监控模板:左侧【配置】点击 【主机】点击【Zabbix server】查看:左侧点击【监测】点击【主机】点击【Zabbix server】点击最新数据,找到添加的三个模板主机关联监控模板:左侧【配置】点击 【主机】点击【Zabbix server】把监控模板用起来① 明确获取指标数据的方法。

2401_83883919的博客 6594

libcurl库使用详情、libcurl库的制作

​ libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies,和用户认证。libcurl的官网 、库下载。这种库使用的时候就像使用wiringPi库一样,编写完代码需要链接这个库,所以要先下载这个库。libcurl的使用(其实和socket编程时一样,都需要一定的步骤):

qq_45698138的博客 5337

Deepwalk,Node2vec算法原理生动理解(图文)

DeepWalk算法的核心是随机游走过程。该过程从某个节点开始,依次按照一定的策略,选择这个节点的邻居节点进行移动,最终形成一个游走路径。重复执行该过程,就可以得到一系列游走路径,这些路径就是DeepWalk算法中的“句子”。Word2Vec对“句子”进行学习,得到每个节点的低维表示

Cai_zi_heng的博客 1378

YOLOv8自定义训练:车牌识别全流程(从标注到推理,附可视化代码)

车牌检测全流程实践指南 摘要:本文详细介绍了基于YOLOv8的车牌检测完整实现方案。针对车牌检测中的三大难点(小目标、多角度、光照变化),提供了从数据准备到模型部署的全流程解决方案。重点包括:1)数据采集与标注规范;2)针对小目标的YOLOv8模型优化配置;3)K-means锚框聚类方法;4)训练参数调优策略。通过实际验证,该方法可获得95%以上的检测准确率,并附有完整的代码实现和可视化工具,便于开发者快速复现应用。 (字数:149字)

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 850

deepwalk源码解读2: __main__.py

deepwalk源代码链接:https://github.com/sunxiangguo/NRL_deepwalk 1. 准备工作 2. 详细解读 2.1 import 2.2 main() 2.3 process(args) 2.4 程序入口 3. deepwalk文件逻辑 1. 准备工作 __main()__.py 文件是程序的入口,主要包含两段代码,一个是main(),...

相国大人 7041

PCL 提取两片点云的非重叠部分【2025最新版】

PCL 提取两片点云的非重叠部分。博客长期更新,本文最近一次更新时间为:2025年9月1日。

点云侠的博客 36万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

deepwalk源码解读5: walks.py

deepwalk源码解读5: walks.py

相国大人 3173

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

DeepWalk实战教程:从Karate Club到BlogCatalog的完整应用

DeepWalk是一种强大的图深度学习技术,它能够将图结构数据转化为低维向量表示,为社交网络分析、推荐系统等领域提供有力支持。本教程将带领你从理论到实践,全面掌握DeepWalk算法在不同图数据集上的应用方法。 ## 一、快速入门:DeepWalk核心概念解析 DeepWalk结合了随机游走和Word2Vec技术,通过在图上进行随机游走生成"句子",再利用Word2Vec模型学习节点的向量表示

gitblog_00551的博客 1057

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

DAY01+deepwalk论文阅读以及算法的实现

deepwalk 主要描述的是Deep Learning的方法学图结构, 学出每个节点的隐含表示(比较像LSA、LDA、word2vec) 主要是基于随机游走 实验步骤及代码 1.http://www.perozzi.net/projects/deepwalk/论文地址 2.https://github.com/phanein/deepwalk 代码 可参照Python官方的解释https://p...

christineNAN的博客 1355

Karate Club深度解析:从节点嵌入到图嵌入的完整技术栈

Karate Club是一个基于NetworkX的无监督机器学习扩展库,提供了从节点嵌入到图嵌入的完整技术栈,是面向图结构数据的瑞士军刀。它集成了众多来自顶级学术会议的先进算法,支持社区检测、节点嵌入和图嵌入等核心任务,为研究者和开发者提供了简单易用的API接口。 ## 🚀 为什么选择Karate Club? Karate Club作为一款专注于图结构数据无监督学习的Python框架,具有三

gitblog_01034的博客 340

如何使用DGFraud在5分钟内搭建第一个欺诈检测模型:快速入门指南

想要快速掌握基于图神经网络的欺诈检测技术吗?DGFraud是一个强大的深度学习工具箱,专门为欺诈检测任务设计。本文将为您提供完整的快速入门指南,帮助您在短短5分钟内搭建第一个欺诈检测模型。🚀 ## 什么是DGFraud?🤔 DGFraud是一个基于图神经网络(GNN)的欺诈检测工具箱,它集成了多种最先进的GNN欺诈检测模型。这个工具箱让研究人员和开发者能够快速实现、比较和应用各种先进的欺诈

gitblog_01115的博客 822

claude-obsidian wiki-query实战:如何从自己的知识库获得有证据的回答

如果你用 AI 记笔记,最怕的就是"它答得很自信,却说不清依据"。claude-obsidian 是一个面向 Obsidian + Claude Code 的自组织 AI 第二大脑:你把任意资料丢进去,Claude 会阅读、链接并归档成一张你拥有的纯 Markdown 知识图谱。而 `wiki-query` 正是其中的"问答引擎"——它只读你的知识库,基于库里已有的笔记、来源与证据给出有引用、可追

gitblog_00186的博客 776

图神经网络实战:从核心原理到PyG代码实现与工程落地

图神经网络(GNN)是深度学习领域处理非欧几里得数据的关键技术,其核心在于消息传递机制,通过聚合邻居信息来更新节点表征。这一原理使其在传统CNN、RNN难以胜任的图结构数据上展现出独特价值,广泛应用于社交网络分析、推荐系统和生物信息学等场景。本文聚焦于GNN的工程实践,详细解析了基于PyTorch Geometric(PyG)框架的实战流程,包括环境搭建、模型构建(如GCN、GAT)、训练技巧以及应对过拟合、梯度消失等常见陷阱的解决方案,为开发者提供从理论到落地的完整指南。

weixin_33928137的博客 402

图表示学习Graph Embedding:DeepWalk python实现

https://github.com/AI-luyuan/graph-embedding

明远 1万+

deepwalk原理及其应用

DeepWalk详解资料 知乎专栏 https://zhuanlan.zhihu.com/p/56380812 github资料,本文以下述1和3资料为源本完善修改而成 https://github.com/shenweichen/GraphEmbedding https://github.com/ZhaoLiang-GitHub/GraphEmbedding-Deeplearning https://github.com/swallown1/GraphEmbedding 论文原文 Paper:Tang J

Everyday try to become better -Kobe Bryant 673

【推荐算法】deepwalk原理,实战以及工程化

最近aigc很火啊,chatgpt都能帮忙写文章了,博客里面也发了一篇gpt写的机器学习的简单入门文章,感觉很生硬,没有特色,也尝试了别的prompt生成一些个性化的文章,还是太过模板化了,工作周报还行,要来写自己的东西还是不能用它。然后的话,那就开始写自己的东西吧,又是好久没写文字了。

凌陨心 1061
上一篇: deepwalk源码解读5: walks.py
下一篇: deepwalk源码解读7: skipgram.py
相国大人
博客等级 码龄10年 1009粉丝 132原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值