10个节点能构造多少个不同的图?35万亿!!!!!!!

文摘   2024-06-10 19:13   浙江  
大家好,我是小伍哥,假期结束了,和大家扯点好玩的。
图是一个看看起来非常简单,我们看看图的定义,就一个顶点和边,实际上非常复杂的东西,我们今天就来研究下图到底有多复杂。
在数学上,图(Graph)是表示对象与对象之间关系的方法,从定义上可以看出,图有两个要素:
对象:又称节点(Node)、顶点(Vertex)、实体(Entity),它描述的是具体的一件事物。
关系:又称边(edge),它描述的是对象之间的关系。
是不是看起来非常简单,我们就研究10 个节点组成的图,我们先来生成10个节点
#生成10个节点import pandas as pdimport itertoolsu_list = list(range(0,10))print(u_list)[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
10个定点,看着是不是还挺少的呢?图除了节点,还有边的连接方式,连接方式会比节点多。10个节点的图,最多有几条边呢?我们计算下,一共45条,我们下面来生成这45条边。
#构建可能的连接com = itertools.combinations(u_list, 2)com_list = list(com)print(len(com_list))print(com_list)
45
[(0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8), (0, 9), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (2, 3), (2, 4), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9), (3, 4), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9), (4, 5), (4, 6), (4, 7), (4, 8), (4, 9), (5, 6), (5, 7), (5, 8), (5, 9), (6, 7), (6, 8), (6, 9), (7, 8), (7, 9), (8, 9)]
到这里,一切都还很简单,一切都很正常,有了10个节点,我们有45个连接方式。但是呢,这45个边,有可能是0条连接,也就是10个独立节点,有可能是1条连接,也就是45对边,只有一对连接。如下所示。

如果继续下去,有两条边连接、3条边连接、4条边,.....,一共大到45条边连接,有多少总可能性呢?其实就是组合计算,45选1,2,3,4,5,.....的组合数之和。计算逻辑如下。
import mathsum=0for i in range(0,45):    sum=sum+math.comb(45,i)sum35184372088831
看到上面的数字了吗,非常巨大:35184372088831。我们转换成亿351843.72亿,也就是35万亿!!!!!!
有人可能不信,真的有这么多种么?
我给大家一个个画出来看看。
首先我们来看看只有一条边的情况
import math
math.comb(45, 1)
45
只有45种可能,我都全部画出来。
# 生成边的组合com = itertools.combinations(u_list, 2)com_list = list(com)
# 数据->图结构整理import matplotlib.pyplot as pltimport networkx as nx#设置显示图片大小fig = plt.figure(figsize=(10,18),dpi=500)fig.subplots_adjust(wspace=0.02, hspace=0.02)# 绘图函数的构建for i in range(1,len(com_list)+1): G = nx.Graph() G.add_nodes_from(u_list) G.add_edges_from([com_list[i-1]]) #节点大小设置,与度关联 node_size = [G.degree(i)**0.5*80+80 for i in G.nodes()]
#设置颜色 随机来点 colors = ['#43CD80','DeepPink','orange','#008B8B','purple','#63B8FF','#BC8F8F','#3CB371','b','orange','y','c','#838B8B','purple','olive','#A0CBE2','#4EEE94']*200 colors = colors[0:len(G.nodes())]# import random# colors = random.sample(colors, len(G.nodes()))
ax = plt.subplot(9,5,i) ax.spines['top'].set_linewidth(0.2) ax.spines['right'].set_linewidth(0.2) ax.spines['bottom'].set_linewidth(0.2) ax.spines['left'].set_linewidth(0.2)
#可以替换两种不同的布局看看效果 kamada_kawai_layout spring_layout #pos = nx.kamada_kawai_layout(G_i,scale=1), nx.draw_networkx(G, pos = nx.spring_layout(G,iterations=2), node_color = colors, edge_color = '#2E8B57', font_size = 6, node_size = node_size, alpha = 0.92, width = 0.4 ) #plt.axis('off') #plt.savefig( "keyword.png", format="PNG")
plt.show()
可以看到,生成的45个图,都是不一样的,第一个图是0-1连接,第二个图是0-2连接,第45个图是8-9连接。是不是每个都不一样。

我们继续整更多复杂的,这里我们就画图画不完了,需要抽一部分,下面的代码是选200个出来。
# 生成边的组合com = itertools.combinations(u_list, 2)com_list = list(com)
#在从边的组合里面抽取n个边连通from random import shuffleshuffle(com_list)

iters = itertools.combinations(com_list,3)
edges = []flag=0for i in iters: if flag<=200: edges.append(i) flag+=1 else: break
边抽好了,我们就可以开始画图了,我们每次就挑7*7=49个图来展示,大家感受下,看看到底有没有相同的。
# 数据->图结构整理import matplotlib.pyplot as pltimport networkx as nx
#设置显示图片大小fig = plt.figure(figsize=(18,18),dpi=500)fig.subplots_adjust(wspace=0.02, hspace=0.02)
# 绘图函数的构建for i in range(1,50): G = nx.Graph() G.add_nodes_from(u_list) G.add_edges_from(list(edges[i-1])) #节点大小设置,与度关联 node_size = [G.degree(i)**0.85*200+100 for i in G.nodes()]
#设置颜色 随机来点 colors = ['#43CD80','DeepPink','orange','#008B8B','purple','#63B8FF','#BC8F8F','#3CB371','b','orange','y','c','#838B8B','purple','olive','#A0CBE2','#4EEE94']*200 colors = colors[0:len(G.nodes())]# import random# colors = random.sample(colors, len(G.nodes()))
ax = plt.subplot(7,7,i) ax.spines['top'].set_linewidth(0.2) ax.spines['right'].set_linewidth(0.2) ax.spines['bottom'].set_linewidth(0.2) ax.spines['left'].set_linewidth(0.2)
#可视化 nx.draw_networkx(G, pos = nx.spring_layout(G,iterations=12), #pos = nx.kamada_kawai_layout(G), node_color = colors, edge_color = '#2E8B57', font_size = 6, node_size = node_size, alpha = 0.98, width = 0.4 ) #plt.axis('off') #plt.savefig( "keyword.png", format="PNG")
plt.show()
边等于3

边等于4

边等于5

边等于5(换一些颜色)

边等于12

边等于20

边等于30

边等于40
我们就不继续画下去了,是不是图的复杂程度,远超我们的认知,所以搞起来不好搞。当然坏人也不好规避图构建的风控模型。

往期精彩:

[课程]万物皆网络-风控中的网络挖掘方法

风控中的复杂网络-学习路径图

【实战】从原始数据开始构建GCN算法

信用卡欺诈孤立森林实战案例分析,最佳参数选择、可视化等

风控策略的自动化生成-利用决策树分分钟生成上千条策略

SynchroTrap-基于松散行为相似度的欺诈账户检测算法

20大风控文本分类算法之6-基于BERT的文本分类实战

长按关注本号             长按加我进群
      

小伍哥聊风控
风控策略&算法,内容风控、复杂网络挖掘、图神经网络、异常检测、策略自动化、黑产挖掘、反欺诈、反作弊等
 最新文章