UFS는 'Unsupervised Forward Selection'의 약자로서 relevance, redundancy, 그리고 multicollinearity 등을 고려하여 분자표현자(일반적인 통계용어로는 independent variable)을 선택하는 프로그램이다. 지난 2000년에 논문에 발표되었으며, 해당 기능을 하는 프로그램도 홈페이지에 공개되어 있다.
(사)분자설계연구소에서 개발한 PreADMET와 같은 프로그램을 사용해서 많은 수의 분자표현자를 계산한 후에 이를 활용하여 QSAR 연구를 진행하고자 할 때 가장 문제가 되는 것은 너무나 많은 분자표현자가 있다는 점이다. 어떤 분자표현자를 선택해야 하는가의 문제가 매우 복잡하다는 것이다. 특히 분자의 물리화학적인 성질을 직접 나타내는 분자표현자가 아닌 topological descriptor나 여러 종류의 3D descriptor의 경우에는, 눈으로 봐서는 그 중요도를 알기가 거의 어렵기 때문에 적절한 분자표현자를 골라내는 것이 더욱 어려운 문제가 아닐 수 없다.
(사실 생각해보면, 분자의 어떤 성질을 결정하는 요소가 수백가지일리는 없으니, PreADMET가 계산하는 2000개 이상의 분자표현자 중에서 실제로 의미를 갖는 것은 몇 퍼센트에 불과할 것이다.)
이런 경우에 사용할 수 있는 테크닉이 물론 여러 가지 있다. 가장 쉽게는 유전 알고리즘을 사용할 수 있을 것이고, 이 외에도 몇 가지 방법들이 있다. 그렇지만 여전히 수천개의 분자표현자로부터 이런 방법을 쓰는 것은, 굉장히 큰 컴퓨터 자원을 사용해야만 가능할 것이기 때문에, 이런 방법들을 사용하기 이전에 의미있는 분자표현자의 개수를 줄여놓는 것은 실용적으로 매우 중요한 일이다. 그리고 이런 일을 위해서 UFS가 만들어졌다고 볼 수 있다.
문제는 이 프로그램이 자체적인 형식의 input 파일을 요구한다는 점이다. 이 형식이라는게 아주 간단하기는 하지만, 매번 그에 맞춰서 input 파일을 만드는 것도 귀찮은 일이 아닐 수 없다. 얼마 후에 있을 분자설계 교육에서 QSAR 강의를 맡았고, 실습 내용을 구성하는데 있어서 UFS를 사용하기로 했는데, 이 부분에서 막혀버렸다. 어쩔 수 없이 csv 파일을 ufs input 파일로 변경해주는 간단한 프로그램을 만들었다. 프로그램의 이름은 당연히 CSV2UFS가 될 수 밖에.
대충 만든 코드지만 잘 동작을 했다. Rubyscript2exe를 사용해서 도스용 프로그램을 만들어 봤는데 동작을 잘 했다. 결국, 실습 시간에는 이 도스용 프로그램을 사용하기로 했다.
가만 생각해보니, 이렇게 가끔씩 만드는 코드들을 쓸데없이 버리지 말고 잘 관리해봐야겠다는 생각이 들었다. 개인적으로 subversion을 사용하기는 하는데, 굳이 혼자만 봐야 할 필요는 없는거고 해서 구글 코드에 cheminformatics-snippets라는 이름의 프로젝트를 만들고 거기에 넣어두기로 했다. 라이센스 때문에 0.5초 정도 고민을 했는데, 처음에는 BSD license로 하려다가 별 이유없이 GPL로 하기로 했다. 0.12 버전에서도 필요한만큼은 동작을 한다. 물론 테스트도 제대로 되어 있지 않고, 에러 처리 부분이라는게 거의 없어서 내놓기 민망하기는 하지만, 악의없는(!) 정상적인 환경에서라면 해야 할 일은 제대로 할 것이다.
코드를 받기 위해서는 아래와 같이 실행하면 된다.
svn checkout http://cheminformatics-snippets.googlecode.com/svn/trunk/ cheminformatics-snippets-read-only


댓글을 달아 주세요
만우절도 아닌데, 이런 프로그램을 올리시면 곤란하지 않을까요?? ^^;; 농담입니다.