1๏ธโฃ PageRank Citation Ranking ๋ ผ๋ฌธ
๐น Summary
• ์์ ์ ๊ฒ์์ด์ ๊ฐ์ฅ ์ ์ด์ธ๋ฆฌ๋ ํ์ด์ง๋ฅผ ์ฐพ๊ธฐ์ํ PageRank
• ์ผ๋ง๋ ๋ง์ ์ฌ์ดํธ๋ค์ด ์ฐธ์กฐํ๋์ง + ์ฐธ์กฐํ ์ฌ์ดํธ๋ค์ ์ํฅ๋ ฅ์ ์ด๋ป๊ฒ ๋๋์ง = Relative importance of Web pages
• PageRank : ์น ํ์ด์ง๋ค์ ์์๋ฅผ ๋งค๊ธฐ๋ ์๊ณ ๋ฆฌ์ฆ from link structure (backlinks)
โช helps search engines and users quickly make sense of the vast heterogeneity of the WWW
โช Applications : Search, browsing, traffic estimation
โช ๊ฐ ํ์ด์ง์ rank ๋ ๊ณ ๋ฅด๊ฒ ๋ถ๋ฐฐ๋๋ค.
• Random surfer model : ์นํ์ด์ง๋ฅผ ํ๋ฐฉํ๋ ์ ์ ์ ํ๋์ random ํ๊ฒ ๋ณด๋ ๊ฒ์ผ๋ก, loop ์ ๋น ์ง๊ฑฐ๋ ๋ ์ด์ ์ดํด๋ณผ ํ์ด์ง๊ฐ ์์ผ๋ฉด ๋๋คํ๊ฒ ๋ค๋ฅธ ํ์ด์ง๋ฅผ ์ฐพ์๋์๋ ํ๋์ ๋ชจ๋ธ์ ๋ฐ์
• Personalized PageRank : PageRank๋ฅผ ๊ฐ์ธํํ๊ธฐ ์ํด ์์์ ์ํผ ๋ชจ๋ธ์์ teleport ํ๋ฅ ๊ณผ transition ํ๋ฅ ์ ๊ฒฐ์ ํ๋ ๋ ธ๋ ๊ฐ์ค์น ๋๋ ์ฃ์ง ๊ฐ์ค์น๋ฅผ ์กฐ์ (๋ ธ๋ ๊ทผ์ ์ฑ์ ์ด์ฉ)
2๏ธโฃ ์ฝ๋ ๋ฆฌ๋ทฐ
https://colab.research.google.com/drive/1g6DStJfwq_IhTROWX2zZPTafeuSofJaX?usp=sharing
๐น ๋ํ์ด ๊ตฌํ
(1) ๊ณ ์ ๊ฐ ๋ถํด๋ฅผ ํตํด ๊ตฌํ๋ ๋ฐฉ๋ฒ
import numpy as np
L = np.array([
[0,1/2,1/3,0,0,0],
[1/3,0,0,0,1/2,0],
[1/3,1/2,0,1,0,1/2],
[1/3,0,1/3,0,1/2,1/2],
[0,0,0,0,0,0],
[0,0,1/3,0,0,0]
]) # 6๊ฐ์ ์ฌ์ดํธ๋ง ์กด์ฌํ๋ ๋คํธ์ํฌ๋ง์ด๋ผ ๊ฐ์
# L ์ ๋ํ eigenvalue, eigenvector ๊ณ์ฐ
eigen_value , eigen_vector = np.linalg.eig(L)
# eigen value ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
order = np.absolute(eigen_value).argsort()[::-1]
# ์ ๋ ฌ ์์์ ๋ฐ๋ผ ์ฌ์ ๋ ฌ
eigen_value = eigen_value[order]
eigen_vector = eigen_vector[:,order]
# ์ฒซ๋ฒ์งธ eigen value ์ ๋ํ eigenvector ์ถ์ถ ๋ฐ ๋น์คํ์ธ
r = eigen_vector[:,0] # 0๋ฒ์งธ ์ด
print(100*np.real(r/np.sum(r))) ## np.real : ๋ณต์์ ์ธ์์ ์ค์๋ถ๋ฅผ ๋ฐํ
# ์ธ๋ฒ์งธ ์ฌ์ดํธ์ ์ค์๋๊ฐ ๊ฐ์ฅ ๋๊ฒ ๋์ด
(2) Power iteration ์ผ๋ก ๊ตฌํ๋ ๋ฐฉ๋ฒ
์์ ์ ์์๋ค์ด ์ฌ์ดํธ๋ฅผ ๋ฌด์์๋ก ์ ์ํ๋ค ๊ฐ์ ํ๊ณ ์ฃผ์ด์ง ๊ฒฝ๋ก๋ก ์ด๋ํ ํ๋ฅ ํ๋ ฌ์ ํตํด ์ฌ๊ท์ ์ผ๋ก ์ ๋ฐ์ดํธ๋ฅผ ์ํํ์ฌ ๊ฐ ์ฌ์ดํธ์ ์ ์์ ์๊ฐ ํน์ ์๊ณ์น ์ดํ๋ก ์๋ ดํ ๋๊น์ง ๋ฐ๋ณตํด ์ฌ์ดํธ๋ณ ์ค์๋๋ฅผ ๊ทผ์ฌํ๋ค.
- r' = L*r
# 100๋ช
์ ์ ๊ฐ์ , ์ด๊ธฐ ์ ์๋ฅ ์ ๋ชจ๋ ๋์ผํ๊ฒ ๊ตฌ์ฑ
r = 100*np.ones(6)/6
lastR = r
r = L@r
i = 0
while np.linalg.norm(lastR - r) > 0.01 : # ์๊ณ์ ๊น์ง ์ํ
lastR = r
r = L@r
i+=1
print(f'{str(i)} iterations to convergence')
print(r)
โป ์ฐธ๊ณ : https://big-dream-world.tistory.com/49
๐น networkX ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ตฌํ
pagerank(G, alpha = 0.85, personalization = None, max_iter = 100,tol=1e-06, nstart=None, weight='weight', dangling=None)
• G : ๊ทธ๋ํ
• alpha : Damping parameter (for teleport)
• max_iter : Maximum number of iterations in power method eigenvalue solver
• Personalization : personalized pagerank
(1) ๊ทธ๋ํ ์์ฑํ๊ธฐ
G = nx.DiGraph()
[G.add_node(k) for k in ["A", "B", "C", "D", "E", "F", "G"]]
G.add_edges_from([
('G','A'), ('A','G'),('B','A'),
('C','A'),('A','C'),('A','D'),
('E','A'),('F','A'),('B','D'),
('D','F')
])
(2) pagerank ์คํ
pr1 = nx.pagerank(G)
print(pr1)
{'A': 0.40001520046189115, 'B': 0.021428571428571432, 'C': 0.1347663991011727, 'D': 0.14387354195831553, 'E': 0.021428571428571432, 'F': 0.1437213165203047, 'G': 0.134766399101172}
(3) dampening ์กฐ์ ํ๊ธฐ (teleports)
• alpha
pr_09 = nx.pagerank(G, alpha = 0.9)
pr_08 = nx.pagerank(G, alpha = 0.8)
res = pd.DataFrame({"alpha=0.9": pr_09, "alpha=0.8": pr_08})
res
(4) Personal pagerank
• personalization
pr_e = nx.pagerank(G, alpha = 0.9, personalization = {'E' : 1})
print(pr_e)
{'A': 0.4147475495142858, 'B': 0.0, 'C': 0.12442358835485172, 'D': 0.12442358835485172, 'E': 0.09999999999999998, 'F': 0.11198168542115904, 'G': 0.1244235883548517}
๐ ๋ ธ๋ E ๋ก๋ถํฐ ๋ ธ๋ B ๋ ์ ๊ทผ์ด ์์ ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ E์ ๊ด์ ์์ ์ค์๋๊ฐ 0์ด ๋จ
(5) ์ํ ์ถ์ฒ์์คํ ๊ตฌํ ํ๋ก์ ํธ
• Movielens data ์ฌ์ฉ (๋ถ๋ฌ์ค๊ธฐ๋ ์๋ต)
• ๊ทธ๋ํ ์์ฑ ๋ฐ ๋ ธ๋์ถ๊ฐ (์ฌ์ฉ์, ์ํ) , ์ฃ์ง ๊ฐ์ค์น (ํ์ ) ์ถ๊ฐ
# ๊ทธ๋ํ ์์ฑํ๊ธฐ
G = nx.Graph()
# ๋
ธ๋ ์ถ๊ฐํ๊ธฐ
G.add_nodes_from(rdata.userId, bipartite = 0)
G.add_nodes_from(rdata.movieId, bipartite = 1)
# ์ฃ์ง ๊ฐ์ค์น ์ถ๊ฐํ๊ธฐ
G.add_weighted_edges_from([(uId, mId, rating) for (uId, mId, rating) in rdata[['userId', 'movieId', 'rating']].to_numpy()])
• ํ์ด์ง๋ญํฌ ์คํ ๋ฐ ์์ ์ํ ์ถ๋ ฅ
# ํ์ด์ง๋ญํฌ ์คํ
movie_rank = nx.pagerank(G, alpha=0.85)
# ์์ ์ํ ์ถ๋ ฅ
def return_top_movies(movie_rank) :
movie_rank = dict(sorted(movie_rank.items(), key = lambda item : item[1], reverse = True))
top_10_movies = []
for key, value in movie_rank.items() :
if 'i' in key :
top_10_movies.append(key)
if len(top_10_movies) == 10 :
break
return item_data.loc[top_10_movies]
return_top_movies(movie_rank)
• Personalized Recommend : 196๋ฒ ์ ์ ์ ๊ด์ ์์ ์ค์๋๋ฅผ ๋ค์ ์ ์ ํจ
user_query = 'u196' # 196๋ฒ ์ ์ ์ ๊ด์ ์์ ์ค์๋๋ฅผ ๋ค์ ์ฐ์
recommendation = nx.pagerank(G, alpha=0.85, personalization={user_query:1})
return_top_movies(recommendation)
'1๏ธโฃ AIโขDS > ๐ GNN' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[CS224W] Graph Neural Network (0) | 2022.11.24 |
---|---|
[CS224W] Message Passing and Node classification (0) | 2022.11.17 |
[CS224W] 1๊ฐ Machine Learning With Graphs (0) | 2022.10.11 |
[CS224W] NetworkX , pytorch geometric Tutorial (2) | 2022.10.07 |
Pytorch Geometric Basic code (1) | 2022.09.30 |
๋๊ธ