'통계물리'에 해당되는 글 5건

  1. 2010.01.09 burstiness 4
  2. 2009.04.23 awk로 명령어 입력하기
  3. 2009.04.19 새물리에 있는 글
  4. 2008.07.08 random network
  5. 2008.07.08 성장하는 네트워크
물리2010. 1. 9. 22:20

정말 오랜만에 물리학에 관한 글을 올리는거 같습니다. 매일 seldon님의 글만 눈팅하다가.. 이래선 안되겠다는 마음으로 부족하지만 조금이라도 글을 써보려고 노력중입니다. 아직 seldon님의 글을 다 꼼꼼하게 읽지도 않았고.. 제대로 이해도 못해서 마음잡고 읽어봐야겠습니다. 우선 이번에 제가 이야기 하고 싶은 것은 특정 시계열에서 어떤 사건이 일어날때입니다. 예를 들어서 지진이 발생한다고 하면 어떤땐 긴 잠복기를 가지고 있다가 어떤때 갑자기 연속적으로 자주 발생하죠. 비도 겨울이나 긴 기간동안 비가 오지 않다가 여름한철 장마나 어떤 시기에 몇번에 나뉘서 미친듯이 쏫아져 내릴때도 있습니다. 이러한 현상들을 burst라고 이야기 하는데요. 주로 이말은 별이 폭발 할때 많이 쓰는 표현이죠. 하지만 이런 때도 burst라는 말을 사용합니다. 여기서 각각의 사건들이 발생하는 시간 간격을 특정시간 \tau 라고 하고 이것들을 그래프를 그리면 그것들의 확률밀도 합수가 멱급수 합수를 따르게 됨니다. 

P \propto \tau^{-\alpha}

여기서 \alpha 값은 현상에 따라 다른데요. 이걸 보면 확실히 각각의 게시물들간의 상관 관계가 있다고 예측을 할수 있습니다. 

우선은 그래서 이 \tau들간의 어떤 관계들이 있는 보겟는데요. 논문에선 두가지 값을 가지고 우선 그것을 가늠합니다. 

첫번째로 Burstiness를 의미 하는 B(burstiness parameter)입니다. 

B\equiv \frac{\sigma_\tau - m_\tau}{\sigma_\tau + m_\tau}

여기서 \sigma_\tau 는 시간 간격들의 표준 편차이구요. m_\tau는 시간간격들의 평균입니다. 언뜻보면 이게 burstiness랑 무슨 상관이냐.. 싶기도 하죠. 

\sigma_\tau = m_\tau 일때는 그냥 중립적인 위치라고 하죠. 이때 B=0 입니다.

\sigma_\tau = 0 일때는 표준 편차가 0이니까 모든 값들이 한 값으로 되는 delta function 형태가 됩니다. 즉.. 모든 값이 한가지 값만을 가진게 되죠. 이것은 시간간격이 그렇다는 것이기 때문에 이 사건들은 상당히 주기적으로 나타납니다. 심작박동 같은 것들이 그렇다고 볼수 있죠.  이 때는  B=-1입니다. 

 \sigma_\tau \gg m_\tau 일때는 B=1이되고 burstiness가 존재하게 됩니다.......

실제로 시간간격에 대해서 그림을 그려가면서 해보면 확실하게 이해가 됨니다. 그림도 올려드리고 싶은데.. 논문에 있는것이라.. 혹시나 저작권 문제가 될까 걱정이되서 올리기가 꺼려지네요..ㅠ_ㅠ 혹시 아시는 분은 답변좀 달아주세요.

다음으로 기억효과라는 개념이 나옴니다. 

M= \frac{1}{n_\tau - 1} \sum_{i=0}^{n_\tau -1} \frac{(\tau_{i+1} - m_1)(\tau_i -m_2)}{\sigma_1 \sigma_2}

인접한 사건들의 상관관계를 알아 보는건데요. 보면 대충 표준편차의 표준편차를 구한다는 그런 느낌입니다. 여기서 1,2 로 구분해놨는데 실제로 자기자긴을 한다면 1이든 2든 같은걸로 쓰면 자기자신의 상관관계를 알수 있겠죠?(autocorrelation). 그렇게 하여 처음사건과 바로 다음에 일어나는 사건이 어떤 관계인지를 알수 있게 됨니다. 

이 두가지를 가지고 고광일 교수님과 바라바시의 논문에서는 현상을 분석했는데요. 우선 이 시간간격들을 가지고 그래프를 그려보면 재밋는 것들을 알수 있습니다. 가장 작은 시간을 앞으로 보내고 큰 시간들을 x축의 뒤쪽으로 보내면 어떤 감쇠함수형태를 가지는데요. 여기서 이 메일을 보내는 패턴은 멱급스함수, 특정단어들이 등장하는 글자간격으로 그리면 지수함수를 따르고 심장박동은 특정 한 시간간격에 집중되는 형태의 delta-function(딱히 한국말이 없네요.ㅠ_ㅠ)형태를 지니게 됨니다. 그 다음으로 이런 사건들의 B,M을 구해서 그래프를 그려보면 (M,B diagram 이라고 하는데 이름이 맘에 안듬니다..-_-) 재밋는 모여있는 형태들이 나옵니다.

 

우선 인간행동패턴, 여기서는 이메일은 보내는 패턴이나 휴대전화가입신청, 도서관에서 책을 빌리는 시간간격등을 계산해 보았는데요.  M=0인 결과를 볼수 있습니다. 기억효과가 거의 없는거죠. 바로 전 사건과 다음 사건은 아무런 연관이 없다는 것입니다. 그리고 몇몇 행동에서는 B가 상당히 큰 부분들이 있습니다. 그러니까 사건들이 몰아서 일어나는 경우가 있다는 이야기 입니다. 이에 비해 자연현상들은 어느정도 일차함수 방향으로 점이 찍히는데요. 일본에서 일어나는 지진이나 뉴멕시코주에 강수같은 경우에는 기억효과도 burstiness도 어느정도 존재한다는 것을 말해줍니다. 그리고 글의 경우에는 둘다 0에 가까워서 기역효과도 특정단어가 연이어 나오는 일도 없습니다.  최근 연구 결과로는 인터넷 계시판에 글이 올라오는 시간간격에도 확실한 burstiness가 존재하고 그것을 연구하시는 분도 계시고 저희 그룹도 이것에 관심이 많습니다. 

 

더 많은 재밋는 이야기와 고민들이 많은데 우선은 연구실 일들이라 편하게 이야기 하기는 어렵네요.. ^^

이 글은 스프링노트에서 작성되었습니다.

Posted by blindfish
컴퓨터/linux2009. 4. 23. 20:26
종종 통계물리 연구를 하다보면 종종 여러 파일에 대해서 명령어를 연속적으로 입력해 야 할때가 있습니다. 예를 들어서 

./test1.o > object1.txt
./test2.o > object2.txt
./test3.o > object3.txt
./test4.o > object4.txt

이런 식으로 연속적으로 실행해야 하는경우 이죠.. 가장 좋은 방법은 bash  shell을 만드는 방법이 편하죠. 이것은 shell script라고도 합니다. 

vi example.sh 

으로 파일을 만든후에 안에 명령어를 차곡차곡 입력하면 됌니다. 파일을 실행하면 입력된 명령어들이 맨위부터 차례로 실행되게 되는데요 . 우선은 맨앞에서 쉘의 형식을 써주어야 하는데요. 대부분 bash쉘이니까

#!/bin/bash 

이런 식으로 써주면 됌니다. 그 다음부터 차근차근 써나가면 돼요. 다 쓰고 나서 실행을 할때는 실행 퍼미션을 설정해주고 실행을 하면 됌니다.

chmod +x example.sh 혹은 chmod 755 example.sh 

이런 식으로 입력해주면 실행권한을 가지게 되지요. 그리고나서 실행 하면 됌니다

./example.sh 

그럼 신나게 실행이 됨니다. 이 방법 외에도 오늘 전까지 제가 쓰던 방법은 명령어를 세미콜론 ; 으로 구분한 다음에 쉘에 그냥 갔다가 붙이는 방법입니다. 복사해서 붙여넣기를 하는거죠. 예를 들어 위에 있는걸 실행한다면

./test1.o > object1.txt; ./test2.o > object2.txt; ./test3.o > object3.txt; ./test4.o > object4.txt

이런 식으로 하고 넣어주기만 하면 맨앞 세미콜론부터 실행 시키기 시작합니다. 조금 무식한 방법 같아 보이긴 하지만 굉장히 편리한 방법입니다. 그렇다면 간단하게 10개 내외의 명령어의 경우에는 그냥 손으로 쓰면 되는데 저처럼 한 100개 정도이면 어떻게 할까요??
이 경우에도 간단하게 awk를 이용해서 해결하는 방법이 있습니다.

ls *.o > test.txt
awk '{print "./"$1, " > object"$0".txt"}' test.txt > example.sh

이런 식으로 처리해주는 방법인데요. 딱 봐도 약간 난해해 보이지만 실제로는 그다지 어렵지 않습니다. 이건 같단하게 명령어들을 쉘에 써주는게 되는데요. "" 안에는 문장이 들어가게 됨니다. 즉 "" 에는 반복적으로 들어가는 명령어 부분을 넣으면 되구요. 그외에 부분엔 $0.$1을 넣어서 test.txt의 열을 출력하게 됨니다. $1은 첫번째열 $2는 두번째열 이런식이죠. $0인경우에는 줄번호를 출력하게 됨니다. 
실제로 awk는 데이터 베이스를 위한 명령어로 파일을 정리하고 편집하는데 굉장히 편리한 명렁어 입니다. 개인적으로 작년쯤 프로그램으로 삽질을 하고 있었을때 연구실 누나가 가르쳐준 방법이죠.. 빨리 알았다면 그 고생 안햇을덴데..;; 

awk문법은 대충 
awk "{명령어 출령형식}" 읽어들일파일 

이런식인데요 이렇게 하고 치면 우선 화면에 출력이 됨니다. 이것을 리다이얼(>)로 bash파일에 쑤셔 넣으면 됨니다. 리다이얼을 아직 모르시는 분이 많으시려나? 라다이얼은 결과물을 꺽쇠방향으로 보내주는것인데요. 화면에 출력되는 것을 그대로 저장해줍니다. 두개를 써서 error를 저장해주기도 하는데요. 이는 나중에 다시 포스팅 하겠습니다.

이렇게 script를 만들거나 해서 실행하면 작업의 양이 많은 경우에는 시간이 상당히 걸리는데요. 이럴때는 bg로 만들거나 screen을 이용해서 세션 관리를 해두면 됨니다. 이는 나중에 언급하도록 하죠. 그런데 그정도로 오랜시간이 걸리는 계산을 하시는 분들이라면 이런것쯤은 알고 있지 않을까 싶네요..;;
Posted by blindfish
물리2009. 4. 19. 17:36
대부분의 사람들은 통계 물리에 대해 막연하게 생각하는 부분이 많다..
가장 좋은건 바라바시의 '링크' 를 읽거나 '넥서스' 혹은 'sync' 등을 읽어보는것이다.
(sync는 약간 동력한적인 개념을 더 내포하고 있긴 하지만..;)

하지만 그나마 이 문서를 읽는게 가장 이해하기 좋은건 아닐까 한다..;; 서울대 교수님들이 쓰신것인데 레퍼런스 보면 우리 김범준교수님논문과 성국이형이 했던일까지 들어있는거 보면 읽으면 나름 이해가 잘되지 않을까 싶다. 
글은 물리학도라면 누구나 쉽게 읽을수 있을만큼 쉬운 글이므로 한번쯤 읽어보길 권장한다.^^
Posted by blindfish
물리2008. 7. 8. 16:50
/* made by JEong Hyang Min  (blindfish)
 * 2008. 06. 22*/

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>

int main()
{
    int i,j;
    int node;
    int link;
    int num1=0;
    int num2=0;
    
    int **network;

    printf("input number of node===>");
    scanf("%d", &node);
    printf("\n");
    printf("input number of link===>");
    scanf("%d", &link);
    printf("\n");

    network = (int **)malloc(sizeof(int*) * node);

    for(i = 0; i < node; i++)
        network[i] = (int *)malloc(sizeof(int) * node);

    for(i=0; i<node; i++)
        for(j=0; j<node; j++)
            network[i][j]=0;

    srand(times(NULL));

    for(i=0; i<=link; i++)
    {
        num1=rand()%node;
        num2=rand()%node;

        if(network[num1][num2]!=0 && network[num2][num1]!=0 && num1!=num2)
            i--;
        else
        {
            network[num1][num2]=1;
            network[num2][num1]=1;
        }
    }
    for(i=0; i<node; i++)
    {
        for(j=0; j<node; j++)
            printf("%d", network[i][j]);
        printf("\n");
    }

    free(network);
    return 0;
}


Posted by blindfish
물리2008. 7. 8. 16:49

/* made by JEong Hyang Min  (blindfish)
 * 2008. 07. 08*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>

int main()
{
    int i,j,k;
    int node=0;
    int link=0;
    int num1=0;
    int totsum=0;
    int *sum;
    int *prob;

    int **network;

    printf("input number of node===>");
    scanf("%d", &node);
    printf("\n");
    printf("input number of link===>");
    scanf("%d", &link);
    printf("\n");

    network = (int **)malloc(sizeof(int*) * node);
    sum = (int *)malloc(sizeof(int) * node);
    prob = (int *)malloc(sizeof(int) * node);
    srand(times(NULL));

// 처음 행렬을 0을 채우고 노드갯수만큼의 행렬을 생성한다.
    for(i=0; i<node; i++)
        network[i] = (int *)malloc(sizeof(int) * node);
    for(i=0; i<node; i++)
        for(j=0; j<node; j++)
            network[i][j]=0;
//seed값을 주고 여기서 자라게 한다.
    network[0][0]=0;
    network[1][0]=1;
    network[0][1]=1;
    network[2][1]=1;
    network[1][2]=1;
//처음에 합산과 확률분포 행렬을 초기화한다.
    for(i=0; i<node; i++)
    {
        sum[i]=0;
        prob[i]=0;
    }

    for(i=3; i<node; i++)    //노드를 하나씩 추가한다.
    {
        totsum=0;
        for(j=0; j<i; j++)
        {
            for(k=0; k<j; k++)
            {
                sum[j] += network[j][k];    //노드의 링크수를 센다.
                totsum += network[j][k];    //총 링크수를 계산한다.
            }
        }

        for(j=0; j<i; j++)
        {
            for(k=0; k<=j; k++)
                prob[j] += sum[k];    //확률 분포를 만든다..
           
            printf("%d ", prob[j]);
        }
        printf("\n");

        num1=rand();    //몬테 카를로를 쓸 수를 만든다.
        num1=num1%totsum;    //확률분포안에 정규화 시킨다.
        for(j=0; j<i; j++)
        {
            if(num1<=prob[0])
            {
                network[i][0]=1;    //해당되는 확률함수를 찻고 링크와 노드를 추가시킨다.
                network[0][i]=1;
            }
            else if(prob[j]<num1 && num1<=prob[j+1])
            {
                network[i][j]=1;
                network[j][i]=1;
            }
            else
            {
                network[i][j]=0;
                network[j][i]=0;
            }
        }

        for(j=0; j<=i; j++)
        {
            sum[j]=0;    //값을 다시 초기화한다.
            prob[j]=0;
        }
    }

    for(i=0; i<node; i++)
    {
        for(j=0; j<node; j++)
            printf("%d", network[i][j]);
        printf("\n");
    }

    free(network);
    free(sum);    //동적할당에선 꼭 메모리를 free시킨다.
    free(prob);    // 안그러면 메모리 문제로 재부팅 해야할수도 있다.
    return 0;
}


척도없는 네크워크 = 정보가 다루는 계나 네트워크의 총체적 정보가 필요함..

포텐셜 문제의 real field, pow-law


매력도==> charge


random network


전체 네트워크에서의 총체적인 정보가 없어도 된다..


== mean field thoery 와 같다..


Posted by blindfish