%matplotlib inline
import numpy as np
import sympy as sp
import matplotlib.pyplot as plt
A = ['小花', '小明', '小光']
B = ['西瓜', '香蕉', '蘋果', '香瓜']
R = [('小花', '西瓜'), ('小花', '香瓜'), ('小明','蘋果'),
('小光', '香蕉'), ('小光', '西瓜') ]
from sympy.abc import a, b, c, d
As = [1, 2, 3]
Bs = [a, b, c, d]
Rs = [(1,a), (1,d), (2, c), (3, b), (3, c)]
之前我們是想出一實際的例子, 建一個關係出來。一般這樣才是對的, 但有時我們想做一些實驗、研究, 會想要任意生成一些關係來。這要怎麼做呢?
我們這裡以 binary relation 為範例, 也就是一個集合 $A$, 我們考慮一個 relation $R$ 是:
$$R \subset A \times A$$A = list('abcdefg')
A
['a', 'b', 'c', 'd', 'e', 'f', 'g']
我們現在要任意做連線, 但之前我們先做 $A \times A$ 這個笛卡兒乘積。
egg = [(x, y) for x in A for y in A]
egg
[('a', 'a'), ('a', 'b'), ('a', 'c'), ('a', 'd'), ('a', 'e'), ('a', 'f'), ('a', 'g'), ('b', 'a'), ('b', 'b'), ('b', 'c'), ('b', 'd'), ('b', 'e'), ('b', 'f'), ('b', 'g'), ('c', 'a'), ('c', 'b'), ('c', 'c'), ('c', 'd'), ('c', 'e'), ('c', 'f'), ('c', 'g'), ('d', 'a'), ('d', 'b'), ('d', 'c'), ('d', 'd'), ('d', 'e'), ('d', 'f'), ('d', 'g'), ('e', 'a'), ('e', 'b'), ('e', 'c'), ('e', 'd'), ('e', 'e'), ('e', 'f'), ('e', 'g'), ('f', 'a'), ('f', 'b'), ('f', 'c'), ('f', 'd'), ('f', 'e'), ('f', 'f'), ('f', 'g'), ('g', 'a'), ('g', 'b'), ('g', 'c'), ('g', 'd'), ('g', 'e'), ('g', 'f'), ('g', 'g')]
我們先來設有幾個連線 (關係)。要隨機、不重覆的選取, 該怎麼做呢? 其實有很多種作法, 我們用最標準的 Python 套件來做。
k = 10
from random import shuffle
shuffle(egg)
egg
[('e', 'd'), ('a', 'f'), ('a', 'a'), ('c', 'd'), ('e', 'g'), ('d', 'c'), ('d', 'a'), ('c', 'b'), ('c', 'e'), ('b', 'd'), ('f', 'c'), ('f', 'b'), ('b', 'c'), ('d', 'd'), ('f', 'g'), ('d', 'e'), ('e', 'f'), ('a', 'g'), ('d', 'g'), ('f', 'a'), ('d', 'b'), ('b', 'e'), ('g', 'g'), ('g', 'e'), ('f', 'f'), ('e', 'c'), ('c', 'f'), ('a', 'c'), ('a', 'b'), ('g', 'a'), ('g', 'd'), ('d', 'f'), ('b', 'f'), ('g', 'c'), ('b', 'g'), ('c', 'a'), ('f', 'e'), ('b', 'a'), ('c', 'c'), ('e', 'a'), ('e', 'b'), ('b', 'b'), ('e', 'e'), ('a', 'e'), ('g', 'b'), ('c', 'g'), ('g', 'f'), ('f', 'd'), ('a', 'd')]
我們可以看到, 順序弄亂了! 所以要隨機選 k 個, 我們就選前 k 個就是了!
R = egg[:k]
R
[('e', 'd'), ('a', 'f'), ('a', 'a'), ('c', 'd'), ('e', 'g'), ('d', 'c'), ('d', 'a'), ('c', 'b'), ('c', 'e'), ('b', 'd')]
瞬間可以做出一個來! 我們還可以重覆做不同的關係, 甚至可以更多或更少的連線。
我們剛剛隨機產生的關係 (或是我們自己做出的關係), 要是能畫出來是不是很令人開心? 我們現在就來做做看!
import networkx as nx
G = nx.Graph()
G.add_edges_from(R)
nx.draw(G)