2차원 정규분포 함수 출력

박사님이 부탁하셔서 만든 프로그램이다. 2차원 정규분포 함수를 csv파일로 출력한다.

버전은 1.1

본인이 직접 만들었으며, 혹시 공부용으로 소스코드가 필요한 사람은 댓글로 요청하면 보내줄 수 있다.

바이러스 또는 악성코드 아님.

MD5SUM 은 다음과 같음.

7c46564ab39a068361667aa365bb6848

윈7 64비트 환경에서 만들었지만, 아마 도스에서 실행시켜도 잘 될 것 같다.

사용법 : 실행시키면 나오는 순서대로 필요한 정보를 입력하면 된다. 그럼 파일이 있던 위치에 gaussian.csv 파일이 생성된다.

코멘트

“2차원 정규분포 함수 출력”에 대한 16개 응답

  1. 
                정재훈
                아바타
    정재훈

    상세한 설명 감사합니다. 많은 도움이 됐습니다.

    설명해주신 부분 공부 좀 더 해보겠습니다. 좋은하루 되세요~

  2. 
                  snowall
                  아바타

    위에서 아래로 다 더하면

    5, 13, 17, 10, 4

    이 다섯개 값의 평균과 표준편차가 x방향, 즉 가로 방향의 평균과 표준편차가 됩니다.

    좌에서 우로 더하면

    9, 12, 11, 8, 9

    이 다섯개 값의 평균과 표준편차가 y방향, 즉 세로 방향이 평균과 표준편차가 됩니다.

    공식으로 본다면 무게중심이나 가중평균 구하는 공식과 같으므로 참고하시면 될겁니다.

    i_zero값은 x평균과 y평균값일때의 밝기 값이므로, 사실은 보간법을 통해서 구해야겠지만, 원본 데이터가 그럭저럭 정규분포에 가깝다고 가정할 수 있는 경우엔 최댓값을 넣으면 됩니다.

    더 정확하게 하려면 정규분포함수인 I*exp(-((x-x0)/Xsigma)^2+-((y-y0)/Ysigma)^2) 를 I, x0, Xsigma, y0, Ysigma에 대해서 최소제곱법으로 피팅하시면 됩니다.

  3. 
                정재훈
                아바타
    정재훈

    답변해주셔서 감사하구요, 제가 워낙 기초가 없어서 간단한 예를 들어 다시 여쭤봅니다.

    예를 들어 아래와 같이 5 by 5로 25개의 raw data가 있을 때

    i_zero, sigma_x variable, sigma_y variable에 각각 숫자를 어떻게 넣어야 하는지요.

    전체 25개의 평균 1.96을 i_zero에 넣으면 되나요?

    그리고 sigma_x variable, sigma_y variable을 구하는 방법이 궁금합니다.

    input I_zero = 1.96?

    input sigma_x variable = ?

    input sigma_y variable = ?

    1 2 3 2 1

    1 3 4 2 2

    1 5 3 2 0

    1 1 4 2 0

    1 2 3 2 1

  4. 
 아바타

    비밀댓글입니다

  5. 
                  snowall
                  아바타

    다차원이라고 해도 그냥 각 성분별로 평균과 표준편차를 구하면 됩니다.

    원본 데이터를 정규분포로 바꾸시려면 평균과 표준편차에 해당하는 정규분포 함수를 만들어서 쓰거나 최소제곱법으로 피팅하시거나 하면 될겁니다

    평균이든 표준편차든 성분별로 구하시면 됩니다

  6. 
                  snowall
                  아바타

    가우스 분포 함수의 함수값을 계산한다면, 문의하신 부분에서, x=1, y=2에 해당하는 함수값을 계산하면 됩니다. 이건 확률밀도함수의 값이 되겠죠.

    정적분을 계산해야 하는 경우는 dxdy구간에 뭔가가 들어갈 확률을 계산할 때인데요, 필터라고 하신다면 이 경우는 아닌 듯 싶네요.

  7. 
                  snowall
                  아바타

    가우스 함수 부분은 다음과 같습니다.

    double gaussian(double j, double i){

    double x, y;

    x = (w/2.0 – i)/xfwhm;

    y = (h/2.0 – j)/yfwhm;

    return izero*exp((-x*x-y*y));

    }

  8. 
                안재형
                아바타
    안재형

    궁금한 것이 있어서 물어봅니다. 2차원 가우시안 분포를 계산하려고 하는데요

    bivarate nomal density식을 이용하여 가우시안 필터를 만들어 보려고 합니다.

    문의 사항은 가우시안 분포를 계산할 경우 실제 1.2 위치이면 이 위치에 대해서 한점의 값을 계산하는 것인지 혹은 x를 0.5~ 1.5 구간 y 1.5~2.5 구간에 대해서 정적분을 계산하여 한포인트의 값을 계산하는지 궁금합니다.

    또 정적분을 하지 않아도 가우시안 분포를 한점씩 계산했을때 2차원에서 나오는 값의 합을 1이 되도록 정규화 시키면 정적분을 하지 않아도 그값이 같아 지는지 궁금합니다.

    혹 얻을수 있다면 소스코드도 보내주실수 있으면 감사하겠습니다.

    jaeahn84@naver.com

    입니다. 답변 부탁드려요

  9. 
                  snowall
                  아바타

    간절한 그 마음은 알겠지만, 허무할만큼 너무 쉬워서요…-_-;;;;

  10. 
                변강욱
                아바타
    변강욱

    안녕하세요.

    만드신 것과 비슷한 걸 꼭 만들어야 하는데 상당히 힘드네요.

    표준편차가 먼저 주어지고, 그 표준편차를 이루는 숫자 30개를 만드는 프로그램이 필요합니다.

    첨부파일처럼 직접 프로그램을 만들어주셔도 되고, 바쁘시다면 어떤식으로 만들어야 하는지정도의 설명이라도 좋습니다.

    어떻게 말씀드려야 제 간절함이 전달되런지. ^^;

    꼭 좀 부탁드립니다.

    fromstog@gmail.com

    고등학교때 공부좀 할걸 그랬어요. 표준편차라는게 서른 넘어서, 먹고 살다보니 필요해지네요.

  11. 
                  snowall
                  아바타

    csv는 그냥 텍스트니까 어려울게 없죠

  12. 
                  theta
                  아바타

    csv는 뭔가 복잡할 줄 알았더니, 아니군요. 답변 정말 감사합니다.

  13. 
                  snowall
                  아바타

    FILE *fp;

    fp=fopen(“gaussian.csv”, “w”);

    for(j=0.0;j fprintf(fp, “%lf”,gaussian(j,i));

    for(i=1.0;i fprintf(fp, “,%lf”,gaussian(j,i));

    }

    fprintf(fp, “\n”);

    }

    fclose(fp);

    CSV로 출력하는 루틴입니다. 그냥 텍스트 파일 출력하는거랑 똑같아요. 물론 이 루틴이 그대로 저 파일에 사용된건 아닙니다. 🙂

  14. 
 아바타

    비밀댓글입니다

  15. 
                  snowall
                  아바타

    네.

    exp(-x^2 – y^2 – z^2) 의 공식을 쓰기 때문에, x, y, z중 하나를 선택하면, 나머지는 지수법칙에 의해 크기를 결정하는 요소가 될 뿐입니다.

  16. 
                 goldenbug
                 아바타

    2차원이나 3차원의 가우시안의 경우엔 한 차원으로 바꾸면 (다른 2차원을 무시하고, 한 차원 값만 취해서 다시 통계를 내면) 우리가 알고 있는 정규분포로 되나요?

goldenbug 에 응답 남기기응답 취소

이 사이트는 Akismet을 사용하여 스팸을 줄입니다. 댓글 데이터가 어떻게 처리되는지 알아보세요.