[작성자:] snowall
-
Cartoon heroes
We are what we’re supposed to be
Illusions of your fantasy
All dots and lines that speak and say
What we do is what you wish to doWe are the color symphony
We do the things you wanna see
Frame by frame, to the extremeOur friends are so unreasonable
They do the unpredictable
All dots lines that speak and say
What we do is what you wish to doIt’s all an orchestra of strings
Doin’ unbelievable things
Frame by frame, to the extreme
One by one, we’re makin’ it funWe are the Cartoon Heroes – oh-oh-oh
We are the ones who’re gonna last forever
We came out of a crazy mind – oh-oh-oh
And walked out on a piece of paperHere comes Spiderman, arachnophobian
Welcome to the toon town party
Here comes Superman, from never-neverland
Welcome to the toon town partyWe learned to run at speed of light
And to fall down from any height
It’s true, but just remember that
What we do is what you just can’t doAnd all the worlds of craziness
A bunch of stars that’s chasing us
Frame by frame, to the extreme
One by one, we’re makin’ it funWe are the Cartoon Heroes – oh-oh-oh
We are the ones who’re gonna last forever
We came out of a crazy mind – oh-oh-oh
And walked out on a piece of paperHere comes Spiderman, arachnophobian
Welcome to the toon town party
Here comes Superman, from never-neverland
Welcome to the toon town partyYou think we’re so mysterious
Don’t take us all too serious
Be original, and remember that
What we do is what you just can’t doWhat we do is what you just can’t do
What we do is what you just can’t do
What we do is what you just can’t do
What we do is what you just can’t doWe are the Cartoon Heroes – oh-oh-oh
We are the ones who’re gonna last forever
We came out of a crazy mind – oh-oh-oh
And walked out on a piece of paperThere’s still more to come
And everyone will be
Welcomed at the
Toon – Toon
Town – Town
Party—–
Aqua의 Cartoon heroes이다. Aqua는 우리나라의 “거북이”와 뭔가 비슷한 느낌의 그룹이다.아무튼, 이 곡은 맘에 드는 곡인데, 특히 가사중에 “Be original”이 맘에 든다. 독창적인, 유일한, 고유한 존재가 되라는 뜻인데, 여러모로 의미를 둘 수 있는 부분이다.
-
16비트 TIFF
16비트 TIFF를 처리하기 위해 삽질을 하고 있다. 일단 파이썬에서 기본적으로 못 불러온다.PIL을 써 보니 파일 형식을 이해 못하겠다고 작업 중단.
http://code.google.com/p/pylibtiff/
Pylibtiff라는 프로젝트가 있어서 설치해보려고 했더니 파이썬 2.6 전용. 설치조차 못한다.
난 지금 2.7에서 작업중이다.검색해보니 tiffimageplugin.py라는 모듈을 쓰면 된다는데 그 모듈은 PIL 1.1.7에서 도입되었다고 한다.
PIL 1.1.7은 알파버전 상태인데, 어쨌든 갖다 설치하고 싶었는데
2.7 버전용 PIL 1.1.7a2 패키지를 설치했는데 안된다.구글 검색해보면 해결했다는 사람은 몇몇 있는데 왜 난 안되지…-_-
—-
해결했다.
http://www.lfd.uci.edu/~gohlke/code/tifffile.py.html
일단 위의 프로그램을 import하고
import tifffile
def fileloader(filename):
tif = tifffile.TIFFfile(filename)
images = tif.asarray()
return images이렇게 하면 16비트 TIFF파일을 numpy배열로 불러올 수 있다.
나날이 삽질만 느는구나…
-
나를 당황케 하다니
이건 파이썬이라서 발생한 문제는 아니겠지만 어쨌든 코드를 파이썬으로 하다가 만난 문제다.지금 만든 프로그램은 f(x)의 평균값을 구해야 한다. 간단하게 x*f(x)를 x에 대해 다 더하고, f(x)를 x에 대해 다 더한 후 둘을 나눠주면 된다.
for m in range(wbegin,wend):
for n in range(hbegin, hend):
x=x+m*array[n][m]
y=y+n*array[n][m]
total=total+array[n][m]
x = x/total
y = y/total
return x, y
문제는 x*f(x)를 다 더했더니 overflow가 나 버린다는 것. f(x)중에 음수가 하나도 없고 x도 음수가 하나도
없는데 음수가 나오길래 왜그런가 했더니 x*f(x)를 다 더하다 보니 정수의 한계를 넘어가서 음수부터 다시 시작한 것 같다.
(양수를 계속 더했는데 음수가 나오는 경우는 수학적으로는 불가능하니까.)그래서 이 문제를 해결하기 위해 f(0)부터 시작해서 재귀적으로 계산하여 f(x)까지의 평균을 알 때 f(x+1)까지의 평균을 계산하는 방법으로, 점화식으로 문제를 해결하려고 했다. 이러면 계속해서 나눠주기 때문에 int의 최대값을 넘어가지는 않을 거라고 생각했다. 그러나… 그것은 순진한 생각이었다.
이번엔 f(0)=0에서 시작하는 경우가 문제가 된다. 초항이 0이라 0으로 나누는 오류 발생.
for m in range(wbegin,wend):
for n in range(hbegin, hend):
x=(x*total+m*array[n][m])/(total+array[n][m])
y=(y*total+n*array[n][m])/(total+array[n][m])
total=total+array[n][m]
return x, y
아… 뭐 이래 -_-;
아무튼, 그래서 total = 1로 줬더니 계산은 되는데 오차가 커진다. total = 0.000000000000000001로 주는 무리수를 둬야 하나…
-
다시 타블로 의혹?
http://segama.tistory.com/509
위 글을 읽고 보니 타블로가 스탠포드를 졸업했는가에 대해 다시 의혹을 제기하고 있다.성적표에 기계과 수업이 하나 있는걸 걸고 넘어지길래 인터넷에서 성적표를 찾아보았다.
http://web.humoruniv.com/board/humor/read.html?table=pds&pg=0&number=313311
기계과 수업인듯 보이는게 하나 있는데 ENGR 297B다. 검색해 봤더니 공대 수업인건 맞다. 근데 제목이 “국제 환경에서의 개발 윤리”이다. 대단히 문과스럽다.
한명 더 있다는 Daniel Lee는 “뭔 개소리냐”는 반응이라고.
http://www.stanfordalumni.org/news/magazine/2011/julaug/features/tablo.html
스탠포드 동문회에서 발행한 소식지에도 보도되었다.의혹을 제기하는 위의 블로거는 “기계과에 D. Lee가 있는데, 타블로 성적표에 기계과 수업을 들은 적이 있다면 그 수업에 대해 해명해야 한다”고 주장하고 있다. 기계과를 졸업한 D. Lee의 성적표도 공개하라고 할 기세인듯. 영문과 수업만 듣다보면 지겨우니 다른 학과 과목도 쉬워보이는 것 중에 한두개 정도는 다들 듣지 않나?
MBC의 그 방송을 안봐서 잘 모르겠지만, [토마스 블랙 사무처장이 “다니엘 선웅 리”는 한명뿐이라고 했는데 “다니엘 리”가 위스콘신에 일하고 있다면 타블로는 “다니엘 리”일 수 없다]고 주장하고 있다. 그런데 “다니엘 리”와 “다니엘 선웅 리”는 다른 사람이다. 자막이 제대로 되어 있다면 위의 블로거의 주장은 억지이다.
“타블로가 스탠포드를 졸업하지 않았다”고 주장하는 사람들은 그렇게 주장하는 사람들이 그 사실을 증명할 책임이 있다. 타블로는 “타블로가 스탠포드를 졸업했다”는 사실을 증명했기 때문이다. 즉, 타블로의 증거가 사실이 아님을 증명하거나 타블로의 증거가 사실이지만 타블로가 스탠포드를 졸업했다는 사실을 적극적으로 또는 타당하게 지지하지 않음을 논리적으로 증명해야 한다.
타블로가 스탠포드를 졸업하지 않았음을 적극적으로 지지하는 증거가 발견된다면 그 즉시 타블로가 스탠포드를 졸업하지 않았다는 주장을 사실로 믿을 생각이지만, 그렇지 않는 한 나는 타블로가 스탠포드를 졸업하였다는 주장이 사실이라고 생각한다.
-
나머지 하나
0, 1, 2의 인덱스를 가지는 어떤 놈이 있다. 즉, a[0], a[1], a[2]가 있다. 이 셋의 인덱스를 순서대로 재 배열해야 하는데, a[0]은 셋중 가장 작은 것, a[2]는 셋중 가장 큰 것, a[1]는 나머지 하나. 가장 큰 것과 가장 작은 것은 알아낼 수 있는데 나머지 하나가 어떤 것인지 알아내야 한다. 그냥 정렬하면 되지 않나 싶은데, 원래 어떤 인덱스를 갖고 있었는지 보존시켜야 하는 상황이다.인덱스 중 가장 작은 것이 갖고 있던 걸 m, 가장 큰 것이 갖고 있는 것을 M이라고 하자. 그럼 나머지 하나의 인덱스 x는
x = (m + M) * 2 % 3
으로 표현된다.
(0,1)인 경우 2, (0,2)인 경우 1, (1,2)인 경우 0이 나온다.아무튼 이런 함수가 필요한 상황이어서 만들었다.
-
Beam pointing stability checker
실험을 하다보면 레이저 빔이 오락가락 한다. 얘들을 찍어다가 모아보면 대략 다음과 같은 자료가 된다.
물론 이건 실제 데이터는 아니고 GIMP로 만든 가짜 데이터다. 진짜 데이터는 실험실에 놓고 왔기 때문에 테스트 해볼 수 없었다. 내일 해봐야지.
1. 가장 밝은 위치를 찾아서
2. 그 점의 적당한 주변에서 밝기에 대한 위치의 가중평균값을 빔의 위치로 정하고
3. 각 자료가 갖는 빔의 위치에 대한 평균과
4. 표준편차를 이용하여
5. 각 자료의 위치와, 표준편차에 대해 1sigma, 2sigma, 3sigma에 대해 얼마나 떨어져 있는지 표시하는 프로그램
알려진 버그
1. 정수와 실수 사이의 캐스팅 문제로 1000픽셀 규모의 데이터에 대해 1%정도의 오차가 발생한다.
(무시하기로 했음.)
2. 원본 자료에 핫픽셀이 있을 때 핫픽셀 주변으로 데이터가 쏠려버린다.
(이건 그냥 사람이 눈으로 보고 맞춰줘야 할 듯.)추가할 기능
1. 그림 자체에 평균, 표준편차 정보를 직접 그리는 기능
2. 1sigma, 2sigma, 3sigma를 표시한 타원에 라벨 붙여주기내가 만들었지만 (복잡하거나 어려운 소스도 아니지만) 소스코드는 왠지 공개하면 연구소에서 싫어할 것 같고, 바이너리로 공개하고 싶은데 python 2.7.1용 py2exe는 VS2008의 DLL을 필요로 한다. (내게는 VS2005가 있다.)
소스 공개해도 된다고 하면 GPL로 공개해야겠다. -
파이썬에서 range 함수
어떤 언어든지간에 어떤 변수를 정해진 범위 내에서 한번씩 적용시켜가면서 반복 실행하는 구문은 필요하다. 파이썬에서는 for 구문으로 구현하고 정해진 범위를 리스트로 주도록 되어 있다.예를 들어, C언어에서 for(i=0;i<10;i++)으로 주어진 반복문이라면 파이썬에서는 for i in range(0, 10) 으로 쓸 수 있다. 이때 주의해야 할 점은 range가 함수라는 부분이다. range(a, b, c)는 a부터 b까지 c칸씩 달리는 리스트를 되돌려 준다. c=1은 기본 사항이다.
1
http://docs.python.org/release/1.5.1p1/tut/range.html
그러나, 나에게 필요한 것은 for(i=0.0;i<1.0;i+=0.1)과 같은 구문이었고 파이썬에서 for i in range(0.0, 1.0, 0.1)은 나에게 좌절을 안겨주었다. range는 int에서만 잘 작동하는 함수였기 때문이다. 그래서 일단은 다음과 같은 코드를 작성해서 썼다.
x = 0.0
for i in range(0, 10):
x=x+0.1
function(x)급한대로 이렇게 쓰긴 했는데, 이건 for구문이지만 while같다. 이럴거면 그냥 while을 쓰는게 낫지 싶은 느낌? 그래서 다른 방법들을 찾아보았다. 기본적으로는, 파이썬의 for문은 주어진 리스트 안의 변수들을 하나씩 순서대로 적용한다. 그럼 내가 원하는 대로 0.1씩 증가하는 리스트를 만들어서 주면 된다. 예를 들어
for i in [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]:
function(x)이렇게 쓰는 것은 의도한 대로 작동하는 구문이다. 물론 이건 10개니까 손으로 썼지만 100만개쯤 되면 손으로 쓰는건 컴퓨터 편하자고 사람이 고생하는 비극을 초래하므로 좀 더 멋진 방법을 찾아야 한다.
http://stackoverflow.com/questions/477486/python-decimal-range-step-value
http://code.activestate.com/recipes/66472/
몇가지 방법을 찾았는데, numpy에서 제공하는 arange 함수를 쓰는 방법이 있고, frange함수를 새로 정의하는 방법이 있다. 어떻든, 위에 쓴 0.0부터 1.0까지의 리스트를 제공하기만 하면 되고, 여러 사람들이 이 문제를 해결하고 있다.그러다 보니, 문득 range함수를 오버로딩하면 안되는건가? 하는 생각이 들어서 검색해 보았다. 물론 이런 생각을 나만 하는건 아니었다.
http://ironboundsoftware.com/blog/2007/05/29/a-shortfall-of-python-no-function-overloading/
http://www.artima.com/weblogs/viewpost.jsp?thread=155514
귀도 반 로썸도 그런 생각을 했고, 2006년에 대충 구현을 해봤다고 하니 파이썬3에서는 잘 되지 않을까 싶었다. 그러나 그렇게 되지 않은 것 같다.
http://openlook.org:625/blog/2008/12/04/python3/
http://kldp.org/node/123275#comment-555572
아무튼, 일단 range 대신에 새로운 다른 함수로 정의해서 사용해야 한다는 점을 알게 되었다.
-
좀 더 정확히 쓰자면, for i in range(0, 10)이랑 같은 C언어 구문은 for(i=0;i<=10;i++)이다.
[본문으로]
-
좀 더 정확히 쓰자면, for i in range(0, 10)이랑 같은 C언어 구문은 for(i=0;i<=10;i++)이다.
-
평균과 분산이 바뀔 때
프로그램을 만들다 보니 별걸 다 하게 되는 상황이다. (납땜하다가 사포질하다가 왜 프로그래밍이냐면, 웃지요 -_-; 내 일이 원래 그렇다. 뭐든지 다 하는…)실험 결과를 분석하는 프로그램인데, 분석은 별게 아니라 입력값의 평균과 표준편차(분산의 제곱근)를 계산하는 프로그램이다. 문제는 입력값을 적절히 구분해야 한다는 점이다. 즉, 지금 읽어온 입력값이 마지막 값이 아닐 수도 있다는 것이 문제점이다. 원래는 다음과 같이 프로그램을 설계해야 한다.
항목이 여러개 있다. A샘플, B샘플 …
각 샘플마다 실험 측정값이 있다. 1번, 2번, …
당연히 각 샘플마다 평균과 분산을 구해야 한다. 문제는 샘플이 순서대로 정렬되어 있지 않고 뒤섞여 있다는 점이다.1. 샘플을 순서대로 정렬한다.
2. DB에 넣어서 Group by로 묶은 후 평균과 분산을 구한다.알고리즘은 이게 가장 단순한데 실제 구현은 삽질이다. 왜냐하면 난 VB.net에서 개발을 하려고 하고 있고, 여기서 DB를 쓰려면 MSSQL을 쓰든가 전에 여기서 언급했던 SQLite의 VB 포트를 쓰든가 해야 하는데, 어쨌거나 SQL까지 다루는 건 골치아픈 일이다. 따라서 저 정렬 부분을 직접 구현해야 하나 하는 고민이 들다가 귀찮으니까 그러지 말자고 생각했다.
1. 데이터 테이블을 싹 읽어서 샘플이 어떤 종류가 있는지 목록을 만든다.
2. 목록에서 순서대로 읽어다가 평균과 분산을 구한다. 즉, 데이터 테이블을 읽으면서 A샘플 값만 골라서 평균과 분산을 구하고, 데이터 테이블을 또 읽으면서 B샘플 값만 골라서 구하고 … 끝날때까지 반복.그나마 조금 단순하지만 데이터 테이블을 너무 여러번 읽는다. 더군다나, 항목 구분이 샘플로만 이뤄지는게 아니라 실험 날짜와 샘플의 위치에 따라서도 달라진다. 즉, 같은 샘플이라도 다른 날짜라면 따로 분석해야 하고, 다른 위치라고 해도 따로 분석해야 한다. 이러면 항목 구분 목록을 여러개 만든 후 각각의 목록을 이용해서 모든 경우의 수를 다 따지는 루틴을 넣어야 하는데 이건 다시 삽질이다.
그래서
1. 데이터 테이블에서 한줄을 읽어온다.
2. 기존에 없던 항목 구분이면? 새로 항목 구분을 만들어 주고 데이터 분석을 갱신한다
2. 기존에 있던 항목 구분이면? 해당 항목 구분에 데이터 분석을 갱신한다
3. 끝까지 간다.여기에 데이터 분석을 갱신하는 루틴이 추가되는데 이게 조금 수학적이다. 그래서 이 글은 수학에 구분되어 있다.
지금까지 N개의 자료를 이용해서 평균과 분산을 계산했다고 하자. 이걸 $m$과 $\sigma^2$라고 하자. 그런데 여기에 N+1번째 자료인 $x_{N+1}$가 새로 들어왔다. 어쩌지?
새로운 평균 $m’$은 다음과 같이 구할 수 있다. (왜 그런가는 암산으로 해보자.)
$m’ = \frac{mN+x_{N+1}}{N+1}$그리고 새로운 분산 $\sigma ‘ ^2$은 다음과 같이 구할 수 있다. 왜 그런가는 직접 계산해 보자.
$\sigma ‘ ^2= \frac{N(\sigma ^2 + m^2) + x_{N+1}^2}{N+1} – m’^2$
어쨌든 위와 같은 간단한 계산으로 자료가 추가될 때마다 평균과 분산을 갱신할 수 있다. 물론 이게 위에서 여러번 읽어오는 알고리즘보다 더 계산양이 적을지 어떨지는 모르겠다. 난 단지 이런 방식으로 프로그램을 만들고 싶었을 뿐이다.
————-
최근에 이 알고리즘을 다시 사용해야 해서 생각해보니, 그냥 단순하게 계산해도 된다.
N개의 자료의 평균과 분산을 알고 싶으면, x(i)의 합과 x(i)의 제곱의 합을 일단 다 계산한다.
그리고 자료를 출력하라고 요청하는 시점에 평균과 분산을 한번만 계산하면 된다.처음에 생각한 공식은 점화식으로 주어진 공식이었고 좀 더 흥미로운 계산이지만, 컴퓨터한테 일 시키려면 새로 생각한 방법이 좀 더 나을 것 같다. (물론, 처음의 공식도 쓸모가 있긴 하다.)
