Tuesday, August 12, 2008

Linux loadable kernel modules (LKM)

15. Giới thiệu các modules

15.1 Trình phiên dịch thi hành (Executable interpreters)

Bạn phải có ít nhất một trình phiên dịch thi hành gắn vào kernel cơ sở, vì để load một LKM phiên dịch thi hành (executable interpreter LKM), bạn cần phải thực thi một lệnh, và do đó, cần có chương trình để phiên dịch lệnh thực thi này.

Trình này gần như hiển nhiên là ELF, vì hầu hết các lệnh thực thi trong hệ thống Linux là ELF.

Trước khi ELF tồn tại trên Linux, dạng lệnh thực thi thông thường là a.out. Có một thời gian ngắn, các hệ thống nửa-ELF/nửa-a.out khá thông dụng. Một số vẫn còn tồn tại.

15.1.1. binfmt_aout: EI cho dạng a.out

a.out là định dạng thực thi phổ biến trong những ngày đầu của Linux và từng là định dạng duy nhất của Linux. Cho đến ngày nau, tên mặc định của các file xuất thực thi của một trình biên dịch GNU (GNU compiler) là a.out (bất kể chúng có định dạng gì).

Nếu bạn thử chạy một file thực thi a.out mà không cần EI, lệnh hệ thống exec sẽ không thực hiện được và báo lỗi "cannot execute binary file".

Không có tham số LKM

Ví dụ:


modprobe binfmt_aout


15.1.2 binfmt_elf: EI cho định dạng ELF

ELF là định dạng thực thi thông thường trên các hệ thống Linux.

Gần như không thể nào không có EI này trong kernel cơ sở của bạn (nếu không còn lý do nào khác thì: insmod là một file thực thi dạng ELF!). Tuy nhiên, về lý thuyết, có thể bỏ nó ra khỏi kernel cơ sở và đưa nó vào như một LKM.

Không có tham số LKM.

VD:

modeprobe binfmt_elf

15.1.3 binfmt_java: EI cho Java bytecode

Java là một ngôn ngữ lập trình hướng đối tượng khá hiện đại. Những chương trình Java truyền thống được biên dịch thành các "Java bytecode", nghĩa là cần phiên dịch bởi một trình phiên dịch Java bytecode. Điếm quan trọng đối với ngôn ngữ hướng đối tượng mới này là các file đối tượng hoàn toàn linh động: chúng có thể được chạy trên mọi hệ thống, miễn là hệ thống đó có một trình phiên dịch bytecode.

Trong khi dự tính ban đầu là trình phiên dịch bytecode sẽ chạy như một chương trình người dùng, với LKM này, bạn có thể làm cho kernel linux phiên dịch file thực thi Java như bất kỳ một file thực thi nào khác. Và vì vậy, bạn có thể chạy một chương trình biên dịch từ Java cũng như chương trình biên dịch từ C, tức là gõ tên chương trình tại dấu đợi lệnh của giao diện dòng lệnh.

Thực tế, lợi ích của ngôn ngữ bytecode trung gian vẫn chưa được chứng minh. Và thường, Java được biên dịch hẳn thành một file thực thi truyền thống như ELF. Nếu làm như vậy, bạn sẽ không cần tới binfmt_java.

Không có tham số LKM.

VD:
modeprobe binfmt_java

15.2. Block device drivers

15.2.1. floppy: floppy disk driver

Đây là driver thiết bị cho ổ đĩa mềm. Bạn sẽ cần đến driver này để có thể truy xauất một đĩa mềm. Tài liệu về LKM này được ghi trong README.fd đặt trong linux/drivers/block directory.

Lưu ý rằng nếu bạn boot từ đĩa mềm hay có hệ thống file root trên một đĩa mềm, bạn phải đưa driver này vào kernel cơ sở.

[ ... ]

15.2.2 loop: loop device driver

Module này cho phép bạn tổ chức một filesystem được lưu trữ dưới dạng file thông thường (trong một filesystem khác). File này được gọi là backing file.

Một ứng dụng của việc này là kiểm tra một filesystem ISO 9660 trước khi ghi chính thức lên một CD. Bạn xây dựng một filesystem trong một file thông thường 650MB. File này sẽ được đưa vào một chương trình ghi đĩa CD. Nhưng bạn có thể định nghĩa một loopback device dựatre6n file này như một backing file và sau đó tổ chức filesytem từ backing file.

Bạn cũng có thể dùng loop device để chuyển các tập hợp file qua một hệ thống mạng. Nó giống như một file .tar, chí khác là bạn không cần phải gói và mở gói. Bạn chỉ cần tổ chức lại file nguyên thủy.

Một số người dùng các loop device trên một hệ thống khi thì chạy WIndows, khi thì chạy Linux, để có thể duy trì hệ thống Linux thông qua hệ thống Windows: đặt một root filesystem vào một file trong hệ FAT để windows có thể truy xuất, sau đó tổ chức hệ thống Linux thông qua một loop device khi Linux đang chạy.

Bạn có thể giữ filesystem mã hóa hoặc nén, hoặc bất cứ cách biến đổi nào, trong một backing file. Loop device mã hóa khi bạn ghi vào, và giãi mã khi bạn truy xuất. Một chiến lược khác khá phổ biến để mã hóa và nén một filesystem là sử dụng một định dạng filesystem đã nén hoặc mã hóa, chẳng hạn như Cfs, Tcfs, Stegfs.

Một hệ thống mã hóa được dựa trên một hàm chuyển (transfer function). Có hai hàm chuyển sẵn có trong một loop module: identify (dùng cho trường hợp mã hóa thông thường: những gì bạn thấy trong loop device chính xác là những gì có trong backing file) và hàm mã hóa XOR đơn giản. Một module độc lập khác có thể bổ sung vào bất kỳ chức năng chuyển nào bằng cách gọi hàm loop_register_transfer() trong loop module.

Tuesday, August 5, 2008

[Chapter 20] Web automation - Perl cookbook

20.1 Truy xuất một URL từ một perl script

Vấn đề
Dùng một script để truy xuất đến một url

Giải pháp
Sử dụng hàm get từ module LWP::Simple.
use LWP::Simple$content = get($url)

Thảo luận
Hàm get trong LWP::SImple trả về undef nếu có lỗi, nên ta có thể kiểm tra lỗi như sau:

use LWP::Simple;
unless (defined ($content = get $url) ) {
die "could not get $url\n";
}

Tuy nhiên, với cách trên, ta không thể xác định được nguyên nhân gây lỗi. Để có được khả năng này cũng như một số xử lý tinh tế hơn, chúng ta cần dùng các module khác.Ví dụ 20.1 là một chương trình truy xuất một tài liệu từ xa. Nếu thất bại, chương trình sẽ xuất ra dòng trạng thái lỗi, ngược lại xuất ra tiêu đề của tài liệu và số byte có trong nội dung. Ở đây chúng ta sử dụng 3 module từ LWP và 1 module khác.

LWP::UserAgent
Module này tạo ra một trình duyệt ảo. Đối tượng trả về từ hàm new được dùng để tạo một request thực. Tên của trạm trình duyệt ảo được đặt là "Schimozilla/v9.14 Platinum" để webmaster thấy ganh tị khi họ kiểm tra file log. :))

HTTP::Request
Là đối tượng được trả về khi trạm người dùng (user agent) chạy request. Dùng để kiểm tra nội dung và lỗi.

URI::Heuristic
Module tí hon này sử dụng thuật toán đoán theo kiểu Netscape để mở rộng các URL chưa hoàn chỉnh. Ví dụ:
Đơn giản Đoán
perl http://www.perl.com/
www.oreilly.com http://www.oreilly.com/
ftp.funet.fi ftp://ftp.funet.fi/
/etc/passwd file:/etc/passwd

Mặc dù những địa chỉ này không phải là những url hợp lệ, Netscape cố đoán url chính xác của chúng. Hầu hết các browser khác cũng làm tương tự.
Source

#!usr/bin/perl# titlebytes - tim tieu de va kich thuoc cua tai lieu
use warnings;
use LWP:::UserAgent;

use HTTP::Request;
use HTTP::Response;
use URI::Heuristic;
my $raw_url = shift or die "usage: $0 url\n";

my $url = URI::Heuristic::uf_urlstr($raw_url);
$ = 1; # flush dòng kế tiếp

printf "%s =>\n\t", $url;

my $ua = LWP::UserAgent->new();
$ua->agent("Schmozilla/v9.14 Platinum"); # đợi đi, thế nào cũng có
my $req = HTTP::Request->new(GET => $url);$req->referer("http://wizard.yellowbrick.oz"); # tung hoả mù cho các chương trình phân tích log
my $response = $ua->request($req);

if ( $response->is_error() ) {
printf " %\n", $response->status_line;
} else {
my $count;
my $byte;
my $content = $response->content();
$bytes = length $content;
$count = ($content =~ tr/\n/\n/);
printf "%s (%d lines,%d bytes)\n", $response->title(), $count, $byte;
}

Khi chạy, chương trình sẽ cho ra kết quả như sau:

% titlebytes http://www.tpj.com/

http://www.tpj.com/ =>
The Perl Journal (109 lines, 4530 bytes)

Xem thêm

Tài liệu CPAN về LWP::Simple, trang hướng dẫn của lwpcook đi kèm với LWP; tài liệu của các module LWP::UserAgent, HTTP::Request, HTTP::REsponse, URI::Heuristic, công thức 20.2.

[Chapter 20] Web automation - Perl cookbook

20.0 Giới thiệu

Chương này tiếp cận Web từ một hướng khác so với chương 19 (CGI programing): thay vì trả lời một yêu cầu từ trình duyệt, ở đây chúng ta giả làm một trình duyệt, phát sinh yêu cầu và xử lý kết quả trả về. Vì các giao thức mạng và các định dạng tài liệu rất phức tạp, chúng ta sẽ tận dụng các module sẵn có để đơn giản hoá quá trình này và có thể tập trung vào chương trình của mình.

Những module thích hợp có thể tìm thấy tại http://www.perl.com/CPAN/modules/by-category/15_World_Wide_Web_HTML_HTTP_CGI/

Có những module dùng để kết toán thẻ tín dụng, tương tác với Netscape hay API của server Apache, xử lý bản đồ hình ảnh, kiểm tra tính hợp lệ của HTML, thao tác MIME. Những module lớn nhất và quan trọng nhất đối với chương này được tìm thấy trong bộ module libwww-perl, gọi tắt là LWP. Sau đây là một số module được tích hợp trong LWP:

Các module HTTP và LWP cho phép thực hiện một yêu cầu tài liệu từ một server. Cụ thể, module LWP::Simple cung cấp một cách thức dơn giản đế lấy về một tài liệu. Tuy nhiên , module này không có khả năng truy xuất đến từng thành phần riêng biệt của một trả lời http. Để có thể truy xuất các thành phần này, cần dùng đến TTP::Request, HTTP::Response và LWP::UserAgent.








ModuleMục đích
LWP::UserAgentwww user agent class
LWP::RobotUAPhát triển các ứng dụng robot
LWP::Protocolgiao tiếp với các kiểu giao thức khác nhau
LWP::Authen::BasicXử lý các trả lời 401 và 407
LWP::MEdiaTypescấu hình các kiểu MIME (text/html, ...)
LWP::Debugdebug logging module
LWP::Simplegiao tiếp với các giao thức đơn giản cho các hàm chung
HTTP::Headerscác dạng header MIME/RFC822
HTTP::Messagemessage dạng HTTP
HTTP::RequestHTTP request
HTTP::ResponseHTTP response
HTTP::Deamon1 lớp HTTP server
HTTP::Statusmã status HTTP
HTTP::Datelấy ngày từ định dạng ngày http
HTTP::NegotiateHTTP content negotiation calculation
HTTP::RobotRulesđọc các file robot.txt
File::Listingđọc danh sách liệt kê thư mục


Liên hệ chặt chẽ với LWP nhưng không được phát hành chung với LWP là các module HTML. Các module này cho phép diễn dịch tài liệu HTML. Chúng cung cấp nền tảng cho các recipe được giới thiệu trong phần 20.5, 20.4, 20.3 và 20.7

Recipe 20.12 đưa ra một rehular expression để giải mã các trường trong file log của web server và trình bày cách diễn dịch các trường này. Regular expression này được sử dụng cùng với module Logfile::Apache trong recipe 20.13 để trình bày hai cách tóm lược dữ liệu trong log file của web server.

Linux loadable kernel modules (LKM)

4. Công cụ LKM

Chương trình cần để load, unload và thực hiện các tác vụ khác với LKM nằm trong gói modutils. Bạn có thể tìm thấy gói này trong thư mục modutils tại đây

Gói này chứa những chương trình sau giúp bạn sử dụng LKM:

insmod gắn một LKM vào kernel
rmmod gỡ một LKM khỏi kernel
depmod xác định sự phụ thuộc lẫn nhau giữa các LKM
kerneld chương trình kernel daemon
ksyms thể hiện các symbol được kernel xuất ra để các LKM mới sử dụng
lsmod liệt kê các LKM đang được load
modinfo thể hiện nội dung của phần .modinfo trong file object LKM
modprobe gắn hoặc gỡ một LKM hay một bộ các LKM một cách thông minh. Ví dụ, nếu bạn phải load A trước khi load B, modprobe sẽ tự động load A rồi mới load B.

Thay đổi trên kernel thường yêu cầu kèm theo thay đổi trên modutils, vì vậy hãy chắc chắn bạn đang sử dụng phiên bản mới nhất của modutils khi bạn nâng cấp kernel. modutils luôn luôn tương thích ngược (hoạt động với các kernel cũ hơn).

Cảnh báo: modprobe sẽ khởi động insmod với vị trí cố định trong code là /sbin/insmod. Có thể có những PATH không được modutils sử dụng để tìm kiếm chương trình. Vì vậy hãy chỉnh sửa code của modutils trước khi bạn xây dựng, hoặc bảo đảm bạn sẽ cài đặt chương trình vào các thư mục truyền thống.

Linux loadable kernel modules (LKM)

vietnamized and note-taking version of Linux Loadable Kernel Module HOWTO

3.Tạo LKM


Một LKM nằm trong một file đối tượng ELF (thường được đặt tên theo dạng serial.o) Thông thường bạn lưu tất cả file object LKM trong một thư mục nhất định (gần file image của kernel cơ sở). Khi dùng chương trình insmod để chèn một LKM vào kernel, bạn cần đưa vào tên của file đối tượng đó.

Đối với các LKM là một phần của linux, bạn xây dựng chúng cùng lúc với việc tạo image của kernel cơ sở. Đọc file README trong cây thư mục chứa source Linux. Ngắn gọn, sau khi tạo image cho kernel cơ sở với một lệnh (chẳng hạn như make zImage, bạn sẽ tạo tiếp tất cả các LKM với lệnh

make modules

Lệnh này sẽ cho ra một loạt các file đối tượng LKM *.o trong cây thư mục chứa source Linux. (Trong những phiên bản cũ của Linux, sẽ có link trong thư mục modules trỏ đến tất cả các file này. Những LKM này đã sẵn sàng để được load, nhưng có thể bạn sẽ muốn cài đặt chúng trong những thư mục thích hợp hơn.

Một trong những công việc cần làm để cấu hình kernel (lúc xây dựng) là chọn những phần nào của kernel để đưa vào kernel cơ sở và những phần nào để tạo LKM độc lập. Trong quá trình cấu hình cơ bản theo dạng hỏi-trả lời ( make config ), với mỗi phần tuỳ chọn của kernel, bạn sẽ được chọn Y - để tích hợp vào kernel cơ sở, hay M - để tạo module độc lập, hay N - bỏ qua hoàn toàn. Những cách cấu hình khác cũng tương tự.

Như đã giải thích trong phần 2.3, bạn chỉ nên đưa vào kernel cơ sở những phần tối thiểu, và bỏ qua những phần chắn chắn là bạn không cần tới. Không mất mát gì nhiều nếu bạn tạo một LKM mà bạn không dùng tới. Chỉ là một ít thời gian biên tập (compile), một ít không gian lưu trữ, và khả năng lỗi trong module đó làm cản trở quá trình xây dựng kernel.

Cũng trong bước cấu hình, bạn phải chọn có sử dụng symbol versioning hay không. Lựa chọn này ảnh hường đến cả việc xây dựng kernle cơ sở lẫn LKM, và bạn nhất thiết phải chọn đúng. (Xem phần 6).

Monday, August 4, 2008

Developing bioinformatics computer skills - 14.7

14.7 Khai khóang dữ liệu và thông tin sinh học

Một trong những lĩnh vực hứng thú nhất của sinh học hiện đại là việc ứng dụng khai khoáng dữ liệu vào các cơ sở dữ liệu sinh học. Rất nhiều phương pháp trong số này cũng đồng thời rơi vào lĩnh vực máy học (máy học - tên gọi phổ biến trong lĩnh vực trí tuệ nhân tạo, chỉ các chương trình thay đổi dần hoạt động để thích nghi với dữ liệu được tiếp xúc). Ở đây giới thiệu tóm tắt một vài phương pháp đã xuất hiện gần đây trong những công trình liên quan đến tin - sinh học. Danh sách này chưa đầy đủ, nhưng cũng hy vọng tạo một điểm xuất phát để bước vào lĩnh vực đang phát triển này.

Xin lưu ý rằng: cách nói nhân cách hóa đã thâm nhập khá sâu vào lĩnh vực khai khoáng dữ liệu và máy học. Tuy nhiên, không có gì bí ẩn ở đây. Các chương trình 'học' hay 'được huấn luyện', chỉ có nghĩa là chúng tuân theo những bộ lệnh được định nghĩa rõ ràng. Cũng như với bất kì công cụ nào được giới thiệu trong quyển sách này, công cụ khai khoáng dữ liệu chỉ nhằm hỗ trợ, chứ không thay thế, cho kiến thức và trực giác của con người. Không có chương trình nào đủ thông minh đến mức có thể lấy vào một mớ dữ liệu thô rồi phát sinh ra những kết quả thú vị và có đủ chất lượng để công bố trên tạp chí khoa học. Như đã nhấn mạnh , việc tạo ra những câu hỏi có ý nghĩa, thiết kế thí nghiệm và diễn giải kết quả hoàn toàn là trách nhiệm của bạn.

14.7.1 Các vấn đề trong khai khoáng dữ liệu và máy học

Các chủ để khai khóang dữ liệu đã được các nhà thống kê học và toán học ứng dụng nghiên cứu trong nhiều thập kỷ. Chính vì vậy, ranh giới giữa thống kê và khai khoáng dữ liệu trở nên cực kỳ mờ nhạt. Nếu bạn làm việc với các kỹ thụât khai khoáng dữ liệu hay phương pháp máy học, bạn sẽ muốn đào sâu vào các kỹ thuật thống kê cổ điển. Nếu vấn đề của bạn có thể giải quyết bằng thuật tóan khai khoáng dữ liệu mới nhất hay một phép tính thống kê đơn giản, rất có thể bạn sẽ chọn phép tính đơn giản. Tương tự như vậy, hãy tránh bị cám dỗ bởi việc tự thiết lập các phương pháp tính điểm của riêng bạn trước khi tham khảo một quyển sách thống kê để xem liệu một phương pháp thích hợp đã có hay chưa. Trong cả hai trường hợp, sẽ dễ dàng hơn cho bạn khi tìm lỗi cũng như khi lý giải lựa chọn của bạn đối với người cộng tác.

14.7.1.1 Máy học có-hướng-dẫn và không-hướng-dẫn

Các phương pháp máy học có thể được chia thành 2 nhóm lớn: học có-hướng-dẫn và không-hướng-dẫn. Học có-hướng-dẫn là trường hợp một thuật toán máy học được đưa vào các dữ liệu mẫu đã gắn nhãn đúng để làm dữ liệu luyện, và được kiểm tra bằng các mẫu chưa gắn nhãn. Học không-hướng-dẫn là trường hợp chỉ cung cấp dữ liệu mà hòan tòan không có thêm thông tin gì về dữ liệu. Mục tiêu của thuật toán là tìm ra các mô hình chung hoặc các xu hướng của dữ liệu, nhằm hỗ trợ cho việc hiểu dữ liệu. Ví dụ như chương trình MEME giới thiệu trong chương 8 là một chương trình học không-hướng-dẫn, mục tiêu tìm ra các motif trình tự từ những trình tự chưa được sắp gióng, tức là trong điều kiện không rõ trình tự có dạng chung hay không, xác định xem dạng chung nằm ở đâu và như thế nào.

Phân tích cluster là một dạng khác của máy học không-hướng-dẫn. Phương pháp này đã được chú ý trong lĩnh vực phân tích dữ liệu microarray. Clustering là một thủ tục phân loại dữ liệu sao cho các thành phần giống nhau nằm trong cùng một nhóm, trong điều kiện chưa biết thực tế có những nhóm như thế nào. Đây là một phương pháp chuẩn để làm việc với dữ liệu đa chiều.

14.7.2 Một số phương pháp khai khoáng dữ liệu

Trong phần này, chúng tôi mô tả một số phương pháp khai khoáng dữ liệu thường được báo cáo trong các tài liệu tin - sinh học. Mục tiêu của phần này là tóm lược các kỹ thuật phức tạp dùng trong phân tích dữ liệu. Chúng tôi không mong bạn có thể cài đặt các thuật toán này bằng cách sử dụng một ngôn ngữ lập trình nào đó. Tuy nhiên, nếu bắt gặp bất cứ phương pháp nào trong số này được sử dụng trong một báo cáo khoa học, bạn sẽ có thể nhận ra phương pháp và nếu cần, có thể đánh giá cách chúng được áp dụng. Cũng như bất kì kỹ thuật nào trong sinh học thực nghiệm, quan trọng là bạn phải hiểu những phương pháp máy học để biết được chúng có được áp dụng hợp lý và đúng đắn hay không.

14.7.2.1 Cây quyết định

Ở dạng đơn giản nhất, một cây quyết định là một loạt các câu hỏi có-không được sắp xếp phân cấp để dẫn đến một quyết định. Ví dụ, để quyết định liệu một đoạn DNA có phải là gene hay không, chúng ta sẽ cần một cây quyết định giống như trong hình 14.6.

Một cây quyết định như thế này rất dễ chạy, vì chúng có một số xác định các khả năng tại mỗi điểm nhánh, và mọi con đường đi qua cây đều đưa đến một quyết định. Cấu trúc cây và các quy luật tại mỗi nhánh được xác định từ dữ liệu, bằng thuật toán máy học. Phương pháp luyện một cây quyết định được mô tả bởi Leo Breiman và đồng sự vào đầu những năm 1980, sau trở nên phổ biến nhờ J. R. Quinlan, tác giả của phần mền C4.5 miễn phí và C5 - những phần mềm chuẩn mực trong lĩnh vực cây quyết định.

Một ưu điểm chính của cây quyết định là chúng tạo ra các kết quả mà con người có thể diễn giải được. Đây là một đặc điểm quan trọng, vì các chuyên gia có thể nhìn vào một cây quyết định và đánh giá liệu một mô hình đã học có đúng trong các điều kiện thực hay không. Trong sinh học có xu hướng các hàm phân loại dạng cây trong các vấn đề tìm mẫu chung (pattern regconition), ví dụ như tìm các vị trí splice của gene, xác định họ cho các protein chưa được phân loại. MORGAN genefinder được phát triển bởi Steven Salzberg và đồng sự là một ví dụ vế ứng dụng cây quyết định trong tìm kiếm gene.

14.7.2.2 Mạng neuron

Mạng neuron là mô hình thống kê sử dụng trong pattern regconition và phân loại. Được phát triển đầu tiên vào năm 1940 như một mô hình toán học của trí nhớ, mạng neuron đôi khi còn được gọi là mô hình kết nối, vì chúng được biểu diễn bằng các node (thường là các biến) được nối với nhau bằng các hàm có trọng số. Hình 14.7 thể hiện quá trình xây dựng một mạng neuron. Chú ý rằng, không có gì liên quan đến neuron trong mô hình này, các node và liên kết giữa chúng cũng không phải là thực thể vật lý. Ý tưởng đằng sau mạng neuron là, bằng cách làm việc phối hợp, các phần tử xử lý đơn giản có thể thực hiện được những phép tính phức tạp hơn.

Một mạng neuron bao gồm một tập hợp các node liên kết nhau theo một dạng hình học xác định, trong đó mỗi node đều có liên kết vào và liên kết ra đối với các node khác. Tổng quát, một mạng neuron sẽ nhận tín hiệu vào , thiết lập giá trị cho các node ở lớp đầu tiên; các giá trị này được phát tán nhờ các hàm chuyển (các liên kết) để đến lớp tiếp theo... cho đến khi chạm đến lớp tín hiệu ra. Dạng của tín hiệu ở lốp đầu ra chính là kết quả của mạng.

Mạng neuron được dùng rất nhiều trong các vấn đề sinh học, ví dụ như PHD, PSIPRED trong dự đoán cấu trúc bậc 2, GRAIL genefinder (chương 7).

14.7.2.3 Thuật toán di truyền

Thuật toán di truyền là thuật toán tối ưu hoá. Chúng tìm trong một lượng lớn các giải pháp khả dĩ để đưa ra giải pháp tốt nhất, trong đó 'tốt nhất' được xác định thông qua hàm chi phí hay hàm phù hợp. Cũng như mạng neuron, những mô hình nảy lấy cảm hứng từ các ý tưởng sinh học, nhưng hoàn toàn không có ý nghĩa sinh học bên trong. Trong thuật toán di truyền, một số lượng các giải pháp ứng cử được phát sinh ngẫu nhiên. Những giải pháp ứng cử này được xem như các nhiễm sắc thể. Những phần trên mỗi nhiễm sắc thể được trao đổi tương tự như tái tổ hợp ở nhiễm sắc thể thật. Chiến lược tái tổ hợp cuối cùng được đánh giá bằng hàm phù hợp, và những nhiễm sắc thể có điểm cao nhất sẽ được nhân lên qua thế hệ kế tiếp. Sự tái tổ hợp và nhân lên như vậy được lặp lại liên tục cho đến khi một giải pháp khá tốt được tìm thấy. Thuật toán di truyền thường được sử dụng trong mô phỏng phân tử, chẳng hạn như docking va gấp cuộn protein.

14.7.2.4 Support vector machine

Cuối 1998, một công cụ máy học gọi là SVM bắt đầu thu hút khá nhiều sự chú ý từ phía tin - sinh học. SVM được phát triển bởi Vladimir Vapnik, thuộc phòng thí nghiệm Bell Lab, và đã được ứng dụng trong nhiều vấn đề, từ nhận diện các ký tự quang cho đến phân tích tài chính và nhận diện spam. SVM được ứng dụng vào các vấn đề sinh học lần đầu tiên bởi Tommi Jaakola (hiện thuộc MIT), David Haussler và đồng sự tại UC Santa Cruz, trong việc phân loại trình tự protein. Từ đó chúng được ứng dụng trong nhiều vấn đề khác của tin - sinh học (dự đoán chức năng, dự đoán cấu trúc, tìm kiếm gene), nhưng được chú ý nhiều nhất là trong lĩnh vực phân tích microarray.
SVM là các hàm phân loại có-hướng-dẫn, nhằm mục tiêu tìm một phân cách tuyến tính giữa các nhóm điểm trong không gian đa chiều. Trong không gian 2 chiều, phân cách này là 1 đường thẳng; trong không gian 3 chiều là mặt phẳng. Tổng quát, mặt phân cách này được gọi là một siêu phẳng. SVM có hai đặc điểm: (1) Không chỉ tìm ra siêu phẳng phân cách, chúng còn đảm bảo tìm ra siêu phẳng tối ưu, tức là siêu phẳng mà vị trí của nó tạo ra sự phân cách lớn nhất giữa hai nhóm. Các điểm dữ liệu nằm gần biên giới nhất gọi là các support vector; (2) dù SVM là hàm phân loại tuyến tính, chúng có thể phân loại các điểm dữ liệu không tuyến tính bằng cách chuyển các điểm dữ liệu vào không gian nhiều chiều hơn.