군집이룬 자료의 비모수 두 표본 차이 검정 (C 구현)

두 표본 집단의 차이가 의미가 있나 알아볼 때 보통 t-검정을 많이 씁니다. t-검정에서는 값의 분포가 정규분포라는 가정이 있어서, 자료의 분포를 모르거나 정규분포로 바꾸기 매우 난감한 경우에는 t-검정을 할 수 없어서 비모수 검정을 사용하는데요, 이쪽으로 가장 인기있는 검정법은 아무래도 Mann-Whitney U test입니다.

어느날 MW-U로 재미나게~♪ 통계를 하다가~ 아니!! 결과가 엄청 편향되어 나오는 것입니다! 비모수라더니!! 마이크로RNA 마이크로어레이로 나온 결과를 분석하고 있었는데, 마이크로RNA가 염색체에서 떼로 몰려 있어서 한 놈이 올라오면 같이 우루루 올라오는 특성이 있다보니 군집이 엄청 큰 놈들에 의해 전체가 흔들려서, 아 무슨 좋은 방법이 없을까! 하다가 군집을 이룬 자료들에 쓸 수 있게 변형한 것 (Rosner and Grove, 1999, Datta and Satten, 2005, Haataja et al., 2009) 들을 발견했습니다. +_+

오.... 다 괜찮아 보이지만, 결국은 코드가 공개돼 있는 Datta와 Satten의 것으 로 해서 일단 결과를 뽑았습니다. 매우 만족스럽군요! ^_^

그런데 문제는 순수 R로 구현되어 있다보니 속도가 엄청나게 느려서, 자료가 별로 크지도 않은데 거의 2시간씩 돌려야 돼서 시험삼아 돌려볼 때도 마음을 크게 먹고 돌려야 해서, 바로바로 결과를 확인하는 재미가 없었습니다.

그래서 쭉 벼르고 있다가, 주말에 여자친구가 기말고사 공부해야 해서, 같이 공부하는 척 하느라 짬이 난 김에 C로 새로 코딩했습니다 (다운로드). R이나 SciPy같은데서 쉽게 쓸 수 있게 외부 의존성을 없애려고, Z-통계치에서 p-value구하는 부분은 빼서 의존성을 줄였습니다. 그냥 libm만 있으면 됩니다. (파이썬에서는 scipy.stats.norm.pdf를 써서 Z에서 p-value를 구할 수 있습니다.) 대략 돌려봤더니 2시간 걸리던게 30초로 줄었군요! 이히히 ^__^* 간단하게 컴파일한 다음에 파이썬에서 쓰려면 이렇게 쓸 수 있습니다~

import ctypes
cranksum = ctypes.cdll.LoadLibrary('./cranksum.so')
crs = cranksum.clustered_rank_sum
crs.restype = ctypes.POINTER(ctypes.c_double * 4)
freecrs = cranksum.free_clustered_rank_sum_result

def clustered_rank_sum(X, grp, cluster):
    N = len(X)
    ret = crs((ctypes.c_double * N)(*X), (ctypes.c_int * N)(*grp),
              (ctypes.c_int * N)(*cluster), N).contents
    r = {'S': ret[0], 'E.S': ret[1], 'Var.S': ret[2], 'z.stat': ret[3]}
    freecrs(ret)
    return r

X = [1,4,2,4,6,7,4,7,8]
grp = [0,1,0,0,1,1,1,0,1]
cluster = [1,1,2,2,2,2,0,0,0]
print clustered_rank_sum(X, grp, cluster)

으음.. R에 붙이는 것은... 아직 잘 몰라서... (나중에..;)

댓글 4 개 | 트랙백 0 개 (보낼곳) | 태그 happyhacking


26
May 2009

애지중지 매일 들고 다니면서 길을 함께한 아이팟 터치 - 방금 돌아가고 있는 트롬에서 급발견하여 구출했으나… ㅠ.ㅠ.ㅠ.ㅠ.ㅠ.ㅠ.ㅠ

21시 03분 (한국) 댓글 (26)
12
May 2009

강추하는 통계책~ 통계를 모르는 사람을 위한 책이지만 입문서가 절대 아니라고 강조하는 이 책은, 직접 통계를 하지는 않는 일반인이 통계학자들과 얘기할 때 사기치고 있는지 알아챌 수 있게 기본 개념만 익히는 것이 목적이다.

11시 58분 (한국) 댓글 (11)
1
May 2009

혹시 FreeBSD 지원하는 좋은 가상서버호스팅 서비스 써보거나 아시는 분! 졸업해서 오픈룩을 옮겨야하는데 RootBSD가 딱 좋지만 찾아보니 악평이 좀 있군요; (지금 일하는 건물은 80포트가 막혀있다는.. Y_Y)

17시 24분 (한국) 댓글 (3)
28
Apr 2009

헉! 내일 오후 2시 마우스와 키보드를 75% EtOH로 정갈히 닦고 기다리자! 모카 라이브 인 서울 티켓 오픈!

22시 33분 (한국) 댓글 (7)
15
Apr 2009

목캔디 물고 커피마시니 신기한 맛이예요. +_+

15시 20분 (한국) 댓글 (8)
2
Apr 2009

햄스터는 밤의 길이에 따라 낳는 자식들의 성별 확률이 약간 바뀌는데, 사람도 위도에 따라서 성비가 약간 다르다고 하는 통계가 나왔군요! 원인으로 추측되는 것은 멜라토닌이라고 하는데… (출생월별 성별 통계가 있으면 좋겠네!)

20시 17분 (한국) 댓글 (7)

한 리스트를 빙글 빙글 돌면서 빈 자리 찾기

요즘 블로그에 통 글을 안 써와서 거의 폐가와 같이 되어 가고 있었는데요.. ^_^ 다름이 아니라, 제가 "이러면 좋겠다!"하고 생각해왔던 바로 그런 성격의 너무 좋은 분을 만나게 되어서 다른 곳에는 신경 쓸 시간이 없었네요. 이히히;

그래도, 1달에 1개 정도는 유지해 두고자;; 쌓아뒀던 코드 단편 하나를 올려 봅니다. 헤헤.

종종 아주 긴 리스트에서 자원관리를 하면서, 자원을 순차탐색으로 할당해야하는 경우가 있습니다. 주로 자원이 직접 사람이 쓰는 것이거나 해서, 순서대로 가는 것이 인지적으로나 쓰고 있는 자리가 모아지는 점에서 유리한 경우에 그런데요. 도서관 같은 곳에서 좌석을 배정한다거나, DHCP서버에서 IP 주소를 나눠준다거나, 순차적으로 나눠주는 큐 관리 시스템에서 작업을 나눠줄 빈 큐를 찾는다거나 생각보다 제법 많습니다.

이런 경우에, 10번째부터 순차검색하기 시작했으면 끝까지 돈 다음에 처음부터 9번째까지 돌아야 하는 것이 중심원리(?)인데요. 구현하는 방법은 물론 클래스 인스턴스가 최근 찾은 인덱스를 변수로 들고 있다가 그 인덱스부터 끝까지 한 번 돌리고, 처음부터 시작한 인덱스까지 다시 돌리는 방법이 가장 평범하겠습니다. 완전 순서대로 배정할 필요는 없고 대충만 맞으면 되는 경우다 싶으면, FIFO 큐 같은 것도 괜찮은데, 이걸 쓰면 시간이 지날 수록 여기저기 듬성 듬성 나와서 원래 목적과는 달라질 수도 있고요~

그래서 range 2번 돌리는 폼 안 나는(?) 코드 대신 보통 끊임없는 이터레이터에서 개수 제한하는 트릭으로 많이 쓰이는 zip을 섞어서 이렇게 하면 비교적 폼 나게(;;) 연속 검색이 가능한 순차검색이 되겠습니다~

from itertools import izip, cycle

def contiters(L):
    cycleiter = cycle(L)
    return lambda: (elem for elem, _ in izip(cycleiter, L))

# 여기부터는 테스트
itgen = contiters('abcdef')

g = itgen()
for i in range(3):
    print g.next(),
print

g = itgen()
for c in g:
    print c,
    if c == 'b':
        break
print

g = itgen()
for c in g:
    print c,
print

실행하면 이렇게 나옵니다.

a b c
d e f a b
c d e f a b

못 찾으면 전체를 한 번 돌고, 찾으면 거기서 중단하면 그 다음에 시작하면 거기서부터 시작합니다~

여기서 종종 마지막으로 돌았던 놈에서부터 다음에 찾을 때 시작하고 싶은 경우가 있는데요. 비슷한 것이 아쉬운 사례로, itertools.takewhile을 쓰면 처음엔 조건이 맞을 때까지 다 가져오는 것은 좋은데, 그 다음 원소를 가지고 오고 싶어서 .next()하면 이미 조건 맞는지 보려고 갖고간 바람에, 조건 안 맞는 것 가져오는 목적으로 그 다음 이터레이터를 쓰지 못하는 것이 엄청 불편합니다.

그래서 전에 찾았던 부분에서 다시 시작하도록 해 보자면~

from itertools import izip, cycle

def contiters(L):
    cycleiter = cycle(L)
    indicesnonfirst = xrange(len(L) - 1)
    def geniter(keeping=[cycleiter.next()]):
        yield keeping[0]
        for elem, _ in izip(cycleiter, indicesnonfirst):
            keeping[0] = elem
            yield elem

    return geniter

# 테스트 부분은 동일

네~ 좀 지저분하긴 해 졌는데요;; 실행하면 이렇게~

a b c
c d e f a b
b c d e f a

모르는 것을 보면 전혀 못 알아볼지라도 찾아보기 좋아하는 어떤 분(^_^)을 위해 용어에 좀 과도하게 링크를 걸었습니다 ^^;

댓글 18 개 | 트랙백 0 개 (보낼곳) | 태그 python


16
Mar 2009

난 F4 얘기를 들으면 자꾸 SAVE " 가 생각나는…

14시 27분 (한국) 댓글 (11)
14
Mar 2009

“오늘 우리가 보고 있는 모습은, 지금 이 순간에만 볼 수 있는 것입니다.” - 갈라파고스

20시 18분 (한국) 댓글 (2)
9
Mar 2009

청주에서 시내버스를 탔더니만, 안내방송으로 “탈 때 꼭 목적지를 말씀해주세요.” 오우. 왠지 자면 깨워줄 것 같아서 한편으로는 좋은 것 같기도 하고..(?) ;;;;

23시 54분 (한국) 댓글 (6)
8
Mar 2009

오늘 어쩌다보니 대전에 다녀오게 됐는데, 서울에 완전히 이사한지 1주일 만에 벌써 향수병이라도 걸린 듯이 대전이 정겹다. ;ㅁ; 아무래도 내가 살고 싶은 곳은 여유롭고 한가한 대전이로구나!

0시 05분 (한국) 댓글 (10)
4
Mar 2009
3
Mar 2009

실험랩으로 옮기니 하루가 언제 가는지 모르게 빨리 가긴 하는데, 몸은 대략 5배로 피곤한듯 -ㅇ-; 그래도 보람차고 재미있다 +_+

23시 31분 (한국) 댓글 (3)
1
Mar 2009

생일 축하해 주신 가족, 친구, 미친, 동료/선후배, 비씨카드, 우리은행, 기업은행, 싸이월드, 네이트온, KTF 등등.. 모두 정말 고마워요~ 이렇게 생일을 축하받기는 처음이라 너무 기분이 좋아요 에헤헤 *^^* (사진은 선물 자랑하려고~~ 헤헷)

21시 50분 (한국) 댓글 (18)

어제 상정된 저작권법 개정안

어제는 작년에 한참 대치하던 이른바 "MB악법"들을 포함한 여러 법안이 직권상정되거나 소위를 통과했습니다. 미디어관련법개정안들과 FTA비준안이 진행되고 있는 데에 대해서 굉장히 유감이지만 다른 곳에도 글이 많기에 생략하고, 어제 직권상정된 저작권법 개정안들은 이번의 쟁점법안은 아니지만 오픈룩과는 관련이 많기에 정리해 봤습니다.

이번에 상정된 저작권법 개정안은 의안번호 1800400 진성호의원등 12인, 의안번호 1802291 강승규의원등 11인의안번호 1802888 변재일의원등 12인입니다. 앞의 둘은 지금 나뉘어 있는 컴퓨터프로그램보호법과 저작권법을 저작권법 하나로 통합해서 저작권법에서 컴퓨터 소프트웨어까지 관할하도록 하는 것이 주요 취지이고, 마지막 것은 FTA비준을 위해서 요구사항을 맞추는 것과 청소년 저작권 위반 처벌 완화에 대한 것입니다.

강승규의원외 개정안(강승규 정병국 진성호 백성운 안형환 김영우 배은희 조진래 김금래 조전혁 이달곤)에서 컴퓨터프로그램보호법이 통합되는 것은 특별한 변동사항은 없고 두 법이 통합되는 정도인데, 점점 콘텐츠 융합 추세로 컴퓨터프로그램과 일반저작권의 경계가 모호해지는 것에 대응하기 위한 것이라고 합니다. 실질적으로 바뀌는 것은 기존에 분리되어 있던 저작권위원회컴퓨터프로그램보호위원회가 통합된다고 하는군요.

그리고 통합 외에 온라인에서 불법적으로 전송하는 사람 또는 올라오는 게시판을 정지시킬 수 있는 법적 근거를 넣는다고 합니다. 그 부분은 저작권법 133-2에 신설되는데 불법복제물이 올라오면 삭제하고 이용자를 정지하도록 요청할 수 있다고 되어있습니다. 단, 여기서 서비스정지를 해야 하는 서비스 제공자 중에 기간통신사업자가 빠지는데, 인터넷 선만 제공하는 사업자가 불법복제를 하는지 관리를 해야하는 건 힘들어서 뺐다고는 하지만, 검토보고서를 보면 기간망사업자(KT, SK브로드밴드 등)만 인터넷 서비스를 제공하는 것도 아니고, 기간망사업자도 다른 것을 제공하는 경우가 많아서 좀 더 검토를 해 봐야 한다는군요.

이 내용은 진성호의원외 개정안(진성호 현경병 조전혁 강성천 황영철 박선영 김효재 강승규 윤석용 김동성 박준선 유정현)에서도 다룬 것인데, 그 개정안에서는 P2P같은 서비스도 온라인서비스사업자로 추가하는 내용과 위의 133-2를 같이 다루었고, 강승규의원외 개정안과는 다르게 기간망사업자도 대상에 포함되어 있습니다.

변재일의원외 개정안(변재일 양승조 강성종 이춘석 권영길 홍재형 강봉균 안규백 강기갑 이시종 김종률 백원우)은 한미FTA비준을 위해 나온 개정안 세트 중의 일부입니다. 한미FTA의 저작권부분에서도 인정하는 여러 공정한 사용(Fair Use)을 미리 도입하고, 청소년들이 저작권을 잘 모른채로 어겨서 심각하게 처벌되고 가정 문제나 성장 문제까지도 연결되는 것을 막기 위한 안입니다.

가장 눈에 띄는 것은, P2P 업자나 온라인서비스제공자들이 저작권보호를 위해 충분한 장치를 하고 노력한 경우에는 사용자들이 발생시키는 저작권문제에 대해 책임이 없다는 것인데요. 그동안은 사용자들이 저작권을 어기면 서비스제공자도 책임이 있었던 모양입니다. 그리고 "공정한 사용"이 폭넓게 정의가 되었는데요. "통상적인 이용 방법과 충돌하지 아니하고 저작자의 합법적인 이익을 불합리하게 해하지 아니하는 경우에는 저작물의 이용을 가능하게 함."이라고 정의되어서, 지금까지 저작권자에게 해가 없는 경우에도 엄밀하게는 불법적인 사용이 되어 버린 경우가 이제 어느 정도는 합법화가 되었습니다. 위키백과에서 도움이 되지 않을까 싶군요.

또한 청소년들이 자기도 모른채 저작권법을 어기고 5년 이하의 징역까지 받을 수 있었던 문제가 있고, 이걸 악용해서 일부 나쁜 변호사들이 저작권 어기는 사람들 골라다가 협박메일을 보내는 일이 심심찮게 있었는데요. 이제 침해 권리의 소매가가 100만원 이하이면 처벌하지 못하도록 단서가 붙었습니다. 그리고 인터넷 서비스 같은 곳에서 캐싱 목적으로 저작물을 저작권자 동의없이 임시 저장해 두는 것도 이번에 합법화가 되었습니다.

댓글 5 개 | 트랙백 0 개 (보낼곳) | 태그 computer


22
Feb 2009

저도 이제 서울 주민이 되었어요~ 낙성대역 1번 출구예요. 헤헤 ^-^*

15시 42분 (한국) 댓글 (18)
17
Feb 2009

아히히히히 ^-^ 오히히히히 (^o^) 우히히히히 *^^* 이히히히히 (/^o^)/ 므히히히히 ☺☻

0시 02분 (한국) 댓글 (14)
8
Feb 2009

어려보인다는 말은 아무리 많이 들어도 질리지 않는 듯.~ -O-;;;;;

22시 38분 (한국) 댓글 (5)
7
Feb 2009

내일은 이사갈 집 구하러 서울에 갑니다~ ^.^ 혹시 봉천동에 좋은 곳이 있으면 추천해 주세요~

1시 30분 (한국) 댓글 (9)

사진 프리젠테이션 배경음악으로 좋은 노래

여러 명이 모이면, 사진 찍는 사람이 한 명은 있기 마련이고, 기억에 오래 남습니다. 행사가 끝날 무렵 사진을 모아서 동영상 비슷한 걸 만들어서 같이 보면, 회상도 되고 뿌듯하기도 해서 뭉클해지는데요. 사진 프리젠테이션이 사실을 왜곡하는 게 아닌가 싶을 정도로 강력해서 웬만한 기억은 모두 순식간에 아름다웠던 기억으로 만들어버리는 막강한 힘이 있습니다.

마침 어제도 어학당 마지막 학기를 기념해서 학기 중에 다른 분들이 찍었던 사진들을 모아서 FotoMagico로 음악을 깔아서 보여드렸는데, 다들 반응이 "아니 이랬었나!" 하면서 센티멘탈해진다고 놀랐습니다. :)

팬 & 줌 효과 (켄 번 효과)도 중요하지만 역시 배경음악도 큰 역할을 하는데, 이런 회고용 사진 프리젠테이션 배경음악을 몇 번 골라보니까 좋은 회고 사진 배경음악의 기준이 몇몇 있는 것 같습니다~

  • 전반적으로 비슷한 느낌으로 진행돼야 하고, 너무 극적인 전개가 있으면 안 좋다.
  • 거북하거나 복잡한 느낌을 남기지 않으려면 코드와 가사가 긍정적인 편이 좋다.
  • 전주가 짧아서, 가사가 시작되기 전의 썰렁함이 적어야 좋다.
  • 간주가 길어서 가사 부분과 이질적인 시간이 생기면 다른 종류의 사진을 중간에 넣어야 해서 귀찮으니, 그냥 간주가 짧은게 좋다.
  • 보컬이 너무 기교있거나 강한 느낌을 주면 사진보다 보컬에 신경이 쓰이기 때문에, 기교 없이 간단하게 부르는 노래가 좋다.
  • 체육활동이나 승부와 관련이 있는 행사라면 좀 발랄한 비트도 괜찮다.
  • 간단한 멜로디 패턴이 많이 반복되는 형식이면, 중간에 잘라 붙여서 길이 조절하기가 쉬워서 좋고, 모르는 노래라도 프리젠테이션 도중에 익숙해져서 친숙한 느낌을 줄 수 있다.

대충 몇 번 해보지는 않았지만 이런 게 중요했던 것 같습니다. 그래서 제가 써 봤던 배경음악을 소개해 드릴게요~

  • 상상 - 송은이: 단순하게 계속 반복돼서 쉽게 친숙해지고 자르기도 정말 쉽고, 목소리도 친근한데다, 아무 행사 사진에 깔아도 아무데나 척척 잘 어울려서 감동도 주고 긍정적인 느낌도 주는 곡~ 원곡은 3분 29초인데, 잘라붙이면 2분 10초, 1분 30초 로도 편집이 가능하고 중간을 반복해서 5분 정도로 늘릴 수도 있습니다. (BioXP 7기 동영상 (글 중간에 있음)에서 사용)
  • 비밀의 화원 - 이상은: 창준형이 소개해 준 매우 좋은 회고용 배경음악. 역시 친숙해지기 쉬운 멜로디, 단순한 전개, 희망적 메시지 등 중요 요건을 모두 갖추고 있습니다. 중간에 분위기가 다른 패턴이 몇 번 나오는데, 여기서 다른 사건 뭉치의 사진으로 전환하면 좋습니다.
  • 많이 안아 주고 싶어요 - 비누도둑: 비밀의 화원은 좀 부담스러운 분위기도 있긴 한데, 이 곡은 시종일관 사랑스러운 분위기라 긍정적인 분위기 사진만 있을 때 일관적으로 좋은 분위기를 만들 수 있습니다. +_+ 역시 반복이 매우 많아서 길이 조절이 쉽고, 비트가 앞의 두 곡에 비해서 좀 빠른 편이라 화면전환에 대충 동기화하기가 쉽습니다.
  • Love - 요조: 마찬가지로 처음부터 끝까지 사랑스러운 분위기이고, 쉽게 친숙해지는 분위기에 아주 따뜻한 느낌을 줍니다. 전주도 기타가 썰렁하지 않고 바로 사진이 나와도 좋은 분위기로 시작해 줍니다. 화기애애한 모임들 배경음악으로 아주 좋습니다.
  • Games People Play - Inner Circle: 지루하다 못해 상투적일 정도의 배경음악이기는 하지만, 그래도 전주도 전혀 없는데다 여행이나 야외 활동 사진으로 아무데나 깔아도 정말 잘 어울립니다. 누구나 다 아는 멜로디에, 영어라 가사가 안 들리는 것도 장점이고요. :)
  • Signal Song - 라이너스의 담요: 담요 노래는 거의 대부분이 강아지를 안고 부르는 분위기이기는 하지만, 이 곡은 특히 아기나 애완동물 사진 프리젠테이션 배경음악으로 잘 어울립니다. +_+ 다만 0:35 근처까지 전주 부분이 효과음만 나오기에 그 앞을 잘라야 프리젠테이션이 안 썰렁합니다.
  • Ready, Get Set, Go! (radio edit) - 페퍼톤스: 사진 부분보다는, 엔딩 크레딧 롤 올릴 때 매우 좋습니다. 엔딩 크레딧 롤(?)은 참가한 사람들 이름이나 간단한 통계, 있었던 사건들 목록 같은 것을 보여주면서 사진과는 또 다른 매우 효과적인 회고용 감동 도구로 쓸 수 있습니다. Radio Edit는 원래 3분 46초인데, 역시 1분 10초, 1분 40초, 2분 20초 정도로 편집할 수 있습니다.

여러분들이 알고 계시는 좋은 사진 프리젠테이션 배경음악은 어떤 게 있나요? 저도 알려주세요~ +_+

댓글 9 개 | 트랙백 0 개 (보낼곳) | 태그 life


1
Feb 2009

<<경숙이 경숙이 아버지>> 심은경과 정성화를 보는 것만 해도 내내 흐뭇하게 볼 수 있는 명랑하면서도 섬세하고 재미있으면서도 감동적인 드라마! +_+/~*

16시 58분 (한국) 댓글 (3)
30
Jan 2009

얼마 전 이사나온 집의 주인이 난데없이 본 적도 없는 TV가 방 안에 있었다며 내놓으라고, 안 내놓으면 경찰에 신고하겠다고 한다. 헐헐. 재미있게 되었다. 어떻게 될지 무척 기대된다.

15시 17분 (한국) 댓글 (11)
29
Jan 2009

설도 지나고 해서, 거의 만나는 분마다 물어보시는 FAQ에 대한 근황보고: 2월 22일에 관악구(아마 녹두거리)로 이사가서, 3월 2일부터 서울에서 출근할 예정입니다. ^_^*

15시 33분 (한국) 댓글 (7)
23
Jan 2009

10년 전 1999년 1월 24일 드라마 카이스트 첫회가 방송되었다. 1달 뒤 2009년 2월 24일 처음엔 따분하다가 점점 정이 들어 가는 대전을 떠난다. 만감이 교차하는 하루. ^~.~^

12시 07분 (한국) 댓글 (16)

동네 안에서 이사했어요. +_+ 며칠 안 되지만, 1가구2원룸(?)을 갖고 있다고 생각하니 왠지 뿌듯;;;

3시 34분 (한국) 댓글 (2)
21
Jan 2009

오늘은 서울대에 다녀 왔는데, (1) 까먹고 있었던 황우석 얘기가 온통 정문에 있었다. (2) 헉! 학교 안에서 차가 막히다니 문화충격이다.

21시 42분 (한국) 댓글 (15)

Apple Keynote Remote - 한 페이지 넘기는데 거의 10초씩 걸려서 도저히 못 쓸 지경인데, 다들 이러나요? 아흑흑. T_T

3시 15분 (한국) 댓글 (5)
18
Jan 2009

뒤늦게 <그들이 사는 세상>을 보기 시작했는데, 너무 예쁘게 잘 찍었다. 나도 언젠가(;;) 연애하게 되면 저렇게 해야겠다.

18시 50분 (한국) 댓글 (6)

“새로운 세기에는 진실이 아닌 것들이 너무 많이 유포될 가능성이 있기 때문에 진실의 필요성은 더욱 커지고 있다.” - Kovach & Rosenstiel. The Elements of Journalism (p. 49) via <cine21>

6시 58분 (한국) 댓글 (1)

정수선형계획법으로 팀 짜기

2006년의 한 워크숍을 진행하면서 팀을 짜는데, 모든 팀이 비슷한 조건을 갖도록 잔기술을 썼던 적이 있습니다. 기준은 평균 실력, 평균 연령, 성비 같은 것들을 모두 비슷하게 맞추고 가능한 다른 곳에서 온 사람들이 섞이도록 했는데요. 이게 손으로 대충해도 되지만 문제는 신청을 한 분이 모두 오는 게 아니라, 몇몇 분들이 빠지거나 지각해서 미리 팀을 짜도 헛수고라 빨리빨리 모두 고려해서 좋은 팀 구성을 해야해서 자동화를 해야 했습니다.

그래서 당시에는 학교에 사이트 라이선스가 있어서 ILOG OPL정수계획(IP)을 했었는데요. 얼마 전에 창준형이 그 소스를 참고하고 싶어 하셔서 찾았는데 소스가 없어졌더군요. 크흐. 그래서 생각난 김에 한 번 오픈소스 선형계획 툴킷인 GLPK용으로 만들어 봤습니다.

모델 코드, 데이터 예제

예제는 누구나 쉽게 데이터 성질을 해석할 수 있도록(;;) 소녀시대, 브라운 아이드 걸스, 원더걸스를 모아놓고 수학캠프를 하는 것을 가정하고(;;;) 최대한 다른 그룹끼리 섞이게, 팀 간 평균 나이, 수학실력, 성비는 비슷하게 하도록 하는데, 수학실력은 몰라서 관련이 있을리는 만무하지만 epg 스타정보에서 인기순위로 대충 매기고, 성비는 모두 여자라 제 맘대로 다수를 남자로 바꿨습니다. ^.~

자 그러면 시험삼아 예제 데이터를 한 번 해 볼까요! 팀은 6개로 나누는 것으로 하고, 우선 제대로 돌아가는지 보기 위해 멤버 수만 같게 맞추는 걸 조건으로 해 보면 결과가..

구성 성비(가상) 평균 나이 평균 EPG 인기
A 제시카 써니 티파니 1:2 21.0 4.33
B 가인 제아 선미 2:1 22.7 2.7
C 태연 윤아 예은 2:1 20.7 5.0
D 수영 서현 선예 2:1 20.0 3.0
E 효연 미료 소희 2:1 22.0 3.0
F 유리 나르샤 유빈 3:0 23.3 3.0

팀 안의 인원 수만 맞지, 어느 하나도 비슷하게 흩어진 게 없습니다. 특히 B, C팀은 여러모로 차이가 많이 나서 비슷한 팀구성 목표에 맞지 않고요, A팀은 소녀시대만 있죠. 그럼 앞에서 언급한 4가지 조건 모두를 맞춰서 최적화한 결과는.. (120초 제한으로 풀어서 최적해는 아님)

구성 성비(가상) 평균 나이 평균 EPG 인기
A 제시카 가인 예은 2:1 21.7 3.7
B 태연 서현 유빈 2:1 20.7 3.7
C 티파니 제아 선미 2:1 22.0 3.7
D 유리 나르샤 소희 2:1 22.0 3.3
E 효연 수영 선예 2:1 20.7 3.3
F 써니 윤아 미료 2:1 22.7 3.3

그런대로 비슷비슷한 팀들로 구성이 됐습니다~ 재미있는 수학시간이 될 것 같네요. -ㅇ-;

사실 이 문제 같은 경우에는 결정하는 변수가 모두 정수라서 (정수가 적을수록 쉽게 구할 수 있음) 사실 전수조사에 주먹구구 좀 넣어서 돌리는 거나 큰 차이는 안 납니다만.. 그래도 재미로~ ^.^;;

댓글 5 개 | 트랙백 1 개 (보낼곳) | 태그 happyhacking


이전 글 보기

누구?

장혜식 (Hyeshik Chang)
내일을 사랑하는 소년(!)