#주석 처리에 한글 입력시나

그냥 코딩 시에 코드에 한글이 들어갈시에 인코딩!? 관련 에러가 나오면서 인식이 안되는 경우가 있는데요


python 코드 위 첫줄에 


# -*- coding: utf-8 -*-


위 코드를 한 줄 입력 하면 한글을 인식합니다!

Posted by 초올싹
,

Networkx Classic Graph

Python 2013. 3. 16. 20:33

기본 적인 그래프 생성 및 수치 값 확인 코드

# -*- coding: utf-8 -*-

import networkx as net

import networkx.algorithms as algo

import matplotlib.pyplot as plt

import pprint        # pprint.pprint 사용을 위한 import


g = net.balanced_tree(2,3)   # 이 부분에서 각 그래프의 이름과 매개변수를 지정하면 그래프가 변합니다.

net.draw(g)

plt.show()


print "radius : %d" % algo.radius(g)       # 이하 수치 값들은 algo. 호출 뿐 아니라 net. 호출로도 가능합니다.

print "diameter : %d" % algo.diameter(g)   # 각 그래프 별 edge 혹은 node를 갖지 않는 그래프는 radius등의 값이 불러지                       

                                                                   #  지 않습니다. 실행이 안되기 때문에 주석처리 혹은 삭제후 실행합니다.

                                                                   # 코드 파일 실행 외에 직접 실행 명령어 입력시에는 알아서....

print "center nodes : %s" % algo.center(g)

print "periphery nodes : %s" % algo.periphery(g)

print "Clustering Coefficient"

pprint.pprint(algo.clustering(g), indent=3)    #pprint.pprint 는 pretty print 의미로 indent값 만큼의 들여쓰기 정렬됩니다.

print "Average Clustering Coefficient : %s" % algo.average_clustering(g)


 balanced_tree

(2,3)


앞 : 자식노드수

뒤 : 트리의 높이 

 


radius : 3

diameter : 6

center nodes : [0]

periphery nodes : [7, 8, 9, 10, 11, 12, 13, 14]

Clustering Coefficient

{  0: 0.0,

   1: 0.0,

   2: 0.0,

   3: 0.0,

   4: 0.0,

   5: 0.0,

   6: 0.0,

   7: 0.0,

   8: 0.0,

   9: 0.0,

   10: 0.0,

   11: 0.0,

   12: 0.0,

   13: 0.0,

   14: 0.0}

Average Clustering Coefficient : 0.0

 barbell_graph

(3,1)


앞 : 완전그래프의 노드 수

뒤 : 사이를 연결하는 노드

 


radius : 2

diameter : 4

center nodes : [3]

periphery nodes : [0, 1, 5, 6]

Clustering Coefficient

{  0: 1.0,

   1: 1.0,

   2: 0.3333333333333333,

   3: 0.0,

   4: 0.3333333333333333,

   5: 1.0,

   6: 1.0}

Average Clustering Coefficient : 0.666666666667 

 complete_graph

(5)


완전 그래프의

노드 수

 

radius : 1

diameter : 1

center nodes : [0, 1, 2, 3, 4]

periphery nodes : [0, 1, 2, 3, 4]

Clustering Coefficient

{  0: 1.0, 1: 1.0, 2: 1.0, 3: 1.0, 4: 1.0}

Average Clustering Coefficient : 1.0

 complete_bipartite

_graph

(4,2)


앞 조건의 노드들이 뒷 조건의 노드들과 전부 연결

 

radius : 2

diameter : 2

center nodes : [0, 1, 2, 3, 4, 5]

periphery nodes : [0, 1, 2, 3, 4, 5]

Clustering Coefficient

{  0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0, 5: 0.0}

Average Clustering Coefficient : 0.0

 

 circular_ladder

_graph

(5)


n개로 cycle생성

후 옆에 같은 쌍을 생성

 


 

radius : 3

diameter : 3

center nodes : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

periphery nodes : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Clustering Coefficient

{  0: 0.0,

   1: 0.0,

   2: 0.0,

   3: 0.0,

   4: 0.0,

   5: 0.0,

   6: 0.0,

   7: 0.0,

   8: 0.0,

   9: 0.0}

Average Clustering Coefficient : 0.0

cycle_graph 

(5)


n개의 노드를 원으로 연결

 

radius : 2

diameter : 2

center nodes : [0, 1, 2, 3, 4]

periphery nodes : [0, 1, 2, 3, 4]

Clustering Coefficient

{  0: 0.0, 

   1: 0.0, 

   2: 0.0, 

   3: 0.0, 

   4: 0.0}

Average Clustering Coefficient : 0.0

dorogovtsev_

goltsev

_mendes_graph

(3)


Dorogovtsev-Goltsev-Mendes

Graph

 


radius : 2

diameter : 3

center nodes : [0, 1, 2]

periphery nodes : [3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]

Clustering Coefficient

{  0: 0.25,

   1: 0.25,

   2: 0.25,

   3: 0.5,

   4: 0.5,

   5: 0.5,

   6: 1.0,

   7: 1.0,

   8: 1.0,

   9: 1.0,

   10: 1.0,

   11: 1.0,

   12: 1.0,

   13: 1.0,

   14: 1.0}

Average Clustering Coefficient : 0.75 

 empty_graph

(5)


n개의 노드와

0개의 엣지 그래프

 

radius : None

diameter : None

center nodes : None

periphery nodes : None

Clustering Coefficient

{0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0}

Average Clustering : 0.0

grid_2d_graph

(3,2, True)


grid_graph에서

와 같은 의미에서

3번째 매개변수에

True를 주게되면

그 각자 이웃들과연결 되는 그래프

 

radius : 2

diameter : 2

center nodes : [(0, 1), (0, 0), (2, 1), (2, 0), (1, 0), (1, 1)]

periphery nodes : [(0, 1), (0, 0), (2, 1), (2, 0), (1, 0), (1, 1)]

Clustering Coefficient

{  (0, 0): 0.3333333333333333,

   (0, 1): 0.3333333333333333,

   (1, 0): 0.3333333333333333,

   (1, 1): 0.3333333333333333,

   (2, 0): 0.3333333333333333,

   (2, 1): 0.3333333333333333}

Average Clustering Coefficient : 0.333333333333

 grid_graph

([3,2])


n*n 형의 격자판

그래프




radius : 2

diameter : 3

center nodes : [(1, 0), (1, 1)]

periphery nodes : [(0, 1), (0, 0), (2, 1), (2, 0)]

Clustering Coefficient

{  (0, 0): 0.0, (0, 1): 0.0, (1, 0): 0.0, (1, 1): 0.0, (2, 0): 0.0, (2, 1): 0.0}

Average Clustering Coefficient : 0.0

 hypercube_graph

(3)


한 노드가 n개의 엣지를 가지는 

4차원 입체 도형 그래프

 


radius : 3

diameter : 3

center nodes : [(1, 1, 0), (0, 1, 1), (1, 0, 0), (0, 0, 1), (1, 0, 1), (0, 0, 0), (0, 1, 0), (1, 1, 1)]

periphery nodes : [(1, 1, 0), (0, 1, 1), (1, 0, 0), (0, 0, 1), (1, 0, 1), (0, 0, 0), (0, 1, 0), (1, 1, 1)]

Clustering Coefficient

{  (0, 0, 0): 0.0,

   (0, 0, 1): 0.0,

   (0, 1, 0): 0.0,

   (0, 1, 1): 0.0,

   (1, 0, 0): 0.0,

   (1, 0, 1): 0.0,

   (1, 1, 0): 0.0,

   (1, 1, 1): 0.0}

Average Clustering Coefficient : 0.0

 ladder_graph

(5)


길이가 n개인 사다리 모양의 그래프

 



radius : 3

diameter : 5

center nodes : [2, 7]

periphery nodes : [0, 4, 5, 9]

Clustering Coefficient

{  0: 0.0,

   1: 0.0,

   2: 0.0,

   3: 0.0,

   4: 0.0,

   5: 0.0,

   6: 0.0,

   7: 0.0,

   8: 0.0,

   9: 0.0}

Average Clustering Coefficient : 0.0


 lollipop_graph

(5, 3)


(사탕!?)

앞 : n개의 완전그래프를 이룬다

뒤 : n개의 막대를 이룬다


 


radius : 2

diameter : 4

center nodes : [5]

periphery nodes : [0, 1, 2, 3, 7]

Clustering Coefficient

{  0: 1.0, 1: 1.0, 2: 1.0, 3: 1.0, 4: 0.6, 5: 0.0, 6: 0.0, 7: 0.0}

Average Clustering Coefficient : 0.575 

null_graph 


no nodes

no edges

 


radius : None

diameter : None

center nodes : None

periphery nodes : None

Clustering Coefficient

{  }

Average Clustering : None

 path_graph

(5)


n개의 노드를 일렬로 정렬 그래프

 


radius : 2

diameter : 4

center nodes : [2]

periphery nodes : [0, 4]

Clustering Coefficient

{  0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0}

Average Clustering Coefficient : 0.0

 star_graph

(5)


한개의 센터노드를가지고 n개의 아웃 노드를 가지는 

그래프

 


radius : 1

diameter : 2

center nodes : [0]

periphery nodes : [1, 2, 3, 4, 5]

Clustering Coefficient

{  0: 0.0,

   1: 0.0, 

   2: 0.0, 

   3: 0.0, 

   4: 0.0, 

   5: 0.0}

Average Clustering Coefficient : 0.0

 trivial_graph


one node

no deges

 


radius : None

diameter : None

center nodes : None

periphery nodes : None

Clustering Coefficient

{  0: 0.0 }

Average Clustering : 0.0

wheel_graph

(5)


1개의 센터 노드가 

n-1 개의 cycle 그래프에 연결되는 그래프

 






radius : 1

diameter : 2

center nodes : [0]

periphery nodes : [1, 2, 3, 4]

Clustering Coefficient

{  0: 0.6666666666666666,

   1: 0.6666666666666666,

   2: 0.6666666666666666,

   3: 0.6666666666666666,

   4: 0.6666666666666666}

Average Clustering Coefficient : 0.666666666667

 



Jeong 

Networkx 에서의 기본적으로 지원되는 그래프들이 어떤 것이며

매개변수로 어떤것을 넣었을 시에 자신이 원하는 그래프를 그릴수 있는지 알고 있다면

모든 노드 엣지들을 번거롭게 추가하는 수고스러움을 덜 수 있기에 알아두면 좋을 것 같다.

center nodes 와 periphery nodes 의 정의에 의하여 눈으로 보기에 

많은 edges를 보유하고 있다고 하여도 센터노드라 볼수 없는 경우가 있으며

얼마없는 edges를 가지고 있어도 주변 모든 다른 노드들까지의 거리로 인하여 센터노드가 될 수 도 있다.

한 그래프 안에 서로 다른 edges를 가지고 있다 하여도 센터가 될수도 아닐수도 있다.

Clustering Coefficient 값은 자신과 이웃 노드들이 완전 그래프에 가까워 질 수록 값이 높아진다.

완전 그래프일시에 값 : 1

Clustering Coefficient 는 내 주변 이웃노드들이 서로를 잘 아는가에 대한 값이며

노드 자신의 중요도에 대한 수치 값은 아니지만, 실제 생활에서 예로 들시에는

다같이 모여서 많은 사람이 즐길 수 있는 많은 친구들을 알고 있다는 것으로 보면 좋은 수치 값으로 생각된다.


center nodes : 그래프의 radius와 같은 eccentricity를 가진 노드

periphery nodes : 그래프의 diameter과 같은 eccentricity를 가진 노드

eccentricity : 노드 v의 그래프 안에서 다른 모든 노드들로의 최단경로 거리중 가장 큰 값

eccentricity의 수치는 주어진 그래프 안에서의 위치가 중간 쪽인가 바깥 쪽인가를 나타내는 수치로

값이 작아 중간에 있다고 하여 중요하다까지의 판단은 옳지 않을 경우가 있을 수 있다고 생각한다.

 Shin

NetworkX 의 제공 해주는 다양한 그래프들에 대해서 학습할 수 있었으며, 참고한 사이트를 통해 필요한 그래프를 어렵지 않게 찾고 사용할 수 있을 것 같다. 

 

radius, diameter , center node, periphery node 와 같이 매번 눈으로보고 확인하고 구해내기 어려운 것들을 간단하게 구할 수 있는 NetworkX는 참 유용하였고 우리가 계속 공부해야할 커다란 소셜 네트워크를 분석하는 부분에서 더욱 유용하게 사용할 수 있는 모듈인 것 같다.


원래 배웠던 내용을 다시한번 복습하는 계기가 된 것 같다.

살짝 헷갈렸던 coefficient 값에 대한 개념을 다시 잡을 수 있었다. 이 값도 함수 하나로 쉽게 구해질 수 있어서 이 모듈의 중요성을 다시한번 생각하게 되었다.

하지만 이 모듈에 없었던 Average Clustering coefficient 값을 구하는 것이 그리 어렵지 않았는데 이도 구할 수 있는 함수가 어디 하나 구현 되어 있었다면 더 편하게 사용할 수 있을 것 같다는 생각을 했다.


eccentricity 값을 이용하여  그래프의 radius와 같은 eccentricity 를 가진노드, diameter와 같은 eccentricity를 가진 노드를 구할 수 있었고, 그것으로 center node와 periphery node 를 구한 다는 것이 잘 이해가 안됬었는데 이번 과제를 통해 확실하게 이해를 할 수 있었다.


이번 과제를 하면서 그래프 하나하나의 모양, 다양한 값들을 알게되어, 앞으로 다양한 소셜네트워크를 분석하는데 많은 도움이 될 수 있을 것 같다. 





Posted by 초올싹
,

networkx 에 접근하여 메소드를 추가해보았다.


환경은 Mac OS 

수정해야 되는 파일 접근 경로는


/Library/Frameworks/Python.framework/Versions/7.3/lib/python2.7/site-packages/networkx-1.7-py2.7.egg/networkx/classes

(각자의 환경별로 경로가 다를 수 있습니다)

*** 주의 ***

 밑의 코드에서 한글 주석이 붙어있는경우 인코딩에러뜨며 실행이 안될 경우 한글 주석 지워주세요...

***********

안에 있는 graph.py 를 수정하여

jaccard_similarity   ,   cosine_similarity

그리고

수정된  jaccard_similarity   ,  수정된 cosine_similarity

를 추가해보았다.

jaccard_similarity

  =  | Ni ∩ Nj |  /  | Ni ∪ Nj |       =     | Ni ∩ Nj |  /  ( | Ni | + | Nj | - | Ni ∩ Nj | )

cosine_similarity

  =  | Ni ∩ Nj |  /  √( | Ni | * | Nj | )

=== 코 드 ===


    def my_jaccard(self, node1, node2):


#self 는 자기자신 graph 를 나타내고 neighbors 는 그 노드의 이웃 노드들을 list형식으로 반환해준다.

        list1 = self.neighbors(node1)           

        list2 = self.neighbors(node2)

#반환된 두개의 list에서 서로 겹치는 부분(교집합)을 찾아내는 함수 intersection 사용하고  len을 이용하여 갯수 저장

        n = len(set(list1).intersection(set(list2)))

# return 값으로 jaccard_simiarity 를 계산하여 반환해준다.

        return n / float(len(list1) + len(list2) - n )

    def my_jaccard_modify(self, node1, node2):


        list1 = self.neighbors(node1)

        list2 = self.neighbors(node2)

# 위와 똑같은 방식으로 진행 되며 추가된것은 list에 자기자신 노드가 더 추가되는것

# list에 item 추가하기   list.append()        

        list1.append(node1)

        list2.append(node2)

        

        n = len(set(list1).intersection(set(list2)))

        return n / float(len(list1) + len(list2) - n )

        

    def my_cosine(self, node1, node2):


        list1 = self.neighbors(node1)

        list2 = self.neighbors(node2)

        n = len(set(list1).intersection(set(list2)))

        

        return n / (math.sqrt( len(list1) * len(list2) ) )

#math.sqrt 를 사용하기 위해서는 상단에 import math 가 필요하다.


    def my_cosine_modify(self, node1, node2):


        list1 = self.neighbors(node1)

        list2 = self.neighbors(node2)

        

        list1.append(node1)

        list2.append(node2)

        

        n = len(set(list1).intersection(set(list2)))

        

        return n / (math.sqrt( len(list1) * len(list2) ) )

Posted by 초올싹
,