周斯涵,劉月蘭
(哈爾濱師范大學(xué))
驗證蛋白質(zhì)的親疏水性對蛋白質(zhì)的穩(wěn)定性、構(gòu)象和蛋白質(zhì)功能具有重要意義.多年來,科學(xué)工作者為測定蛋白質(zhì)的親疏水性做了多方面的研究,目前,研究者多用ExPASy的Protparam[1]用來預(yù)測蛋白質(zhì),但是仍未出現(xiàn)一種比較精確的預(yù)測方法.
機(jī)器學(xué)習(xí)[2](Machine Learning, ML)是一門多領(lǐng)域交叉學(xué)科,涉及概率論、統(tǒng)計學(xué)、逼近論、凸分析、算法復(fù)雜度理論等多門學(xué)科.該文基于機(jī)器學(xué)習(xí)中的四種分類算法,設(shè)計出四種分類器,并將四種分類器整合,得到最優(yōu)解.可將多個含有親疏水性特征值的蛋白質(zhì)作為一個數(shù)據(jù)集輸入到分類器中.分類器利用該數(shù)據(jù)集進(jìn)行自我訓(xùn)練與學(xué)習(xí),最終準(zhǔn)確預(yù)測出蛋白質(zhì)的疏水性.
通過Python編程語言編寫數(shù)據(jù)挖掘方法,利用Enterz與包含正則表達(dá)式的re模塊,實(shí)現(xiàn)自動從美國NCBI數(shù)據(jù)庫獲取指定ID號的多個蛋白質(zhì)一級結(jié)構(gòu)序列數(shù)據(jù),并以蛋白質(zhì)名、序列數(shù)據(jù)存入可指定位置的本地文檔,部分源代碼如下所示:
def get_protein_sequence(protein_id):
handle=Entrez.efetch(db="protein",id=str(protein_id),rettype="genbank", email="")
record=handle.read()
protein_name=re.findall(r'
(.+?)',str(record))
protein_sequence=re.findall(r'
(.+?)
',str(record))
for n in range(100000,200000):
line=get_protein_sequence(n)
line=str(line)
line=line.replace(',',' ')
print line
f.write(line+' ')
f.flush()
f.close()
return protein_name,protein_sequence
def get_term(database_name,Term):
handle=Entrez.esearch(db=str(database_name),term=str(Term),email="")
record=Entrez.read(handle)
return record['Count']
def browse_record(m,n,record):
return record["IdList"][m:n]
蛋白質(zhì)的親疏水性的鑒定是一個二分類問題,故將親水性蛋白質(zhì)(hydrophilic protein)的特征值定為-1,疏水性蛋白質(zhì)(lyophobic protein)設(shè)為1.
由于分類算法中的輸入數(shù)據(jù)集必須為數(shù)值型數(shù)據(jù),故將蛋白質(zhì)序列數(shù)據(jù)中各個氨基酸根據(jù)表1中的疏水性參數(shù)[9]進(jìn)行轉(zhuǎn)化.
如glutamate--ammonia ligase (EC 6.3.1.2) - kidney bean中的氨基酸序列可轉(zhuǎn)化為如下數(shù)組:[-3.5, -1.6,-1.3,4.2 4.2,-0.7, -0.8, 3.8,3.8, 1.8, -3.5, -0.7,-0.8,3.8,3.8,-0.9,-3.5,-1.6,-0.7,3.8,-3.5,1.8,-3.5,1.8,3.8,1.8,1.8,-3.5,-3.9,3.8,1.8,3.8,-3.9, 4.2].
表1 氨基酸疏水性參數(shù)
將從美國NCBI數(shù)據(jù)庫中隨機(jī)獲取的500個來自不同物種的非等長蛋白質(zhì)序列匹配相應(yīng)的參數(shù)值與特征值,作為訓(xùn)練數(shù)據(jù)集輸入到分類器中,分類器通過算法進(jìn)行學(xué)習(xí)后,達(dá)到對未知親疏水性的蛋白質(zhì)進(jìn)行自動分類.
1.3.1 支持向量機(jī)(Support Vector Machine)算法
支持向量機(jī)[3](Support Vector Machine,SVM)算法是由所屬于AT&TBell實(shí)驗室的V.Vapnik等人所提出的一種新的機(jī)器學(xué)習(xí)算法.支持向量機(jī)目前已經(jīng)用在了基因分類、目標(biāo)識別、函數(shù)回歸、函數(shù)逼近、時間序列預(yù)測及數(shù)據(jù)壓縮、數(shù)據(jù)挖掘等各個領(lǐng)域中.
SVM的主體思想[4]是針對二分類問題,找到一個能分成兩部分訓(xùn)練樣本點(diǎn)的超平面,達(dá)到保證最小的分類錯誤率.在線性可分的情況下,有一個或多個超平面能讓訓(xùn)練樣本全部分開,支持向量機(jī)算法的目的就是為了找到其中最優(yōu)的超平面.
SVM的基本模型:設(shè)輸入樣本集合{a[n]} ∈Rn由兩部分點(diǎn)組成, 如果a[n]屬于第一部分,則y[n] = 1 , 如果x[n]屬于第二部分,則y[n] = -1 , 有訓(xùn)練樣本的集合{a[n] ,b[n]} ,n= 1 ,2,3 , …,n,求最優(yōu)分類面ka-p=0,滿足:b[n](wa[i] -p) >= 1;并使得2*h= 2/‖k‖最大,即min‖k‖*‖k‖/2.
根據(jù)對偶理論,可以通過解該問題的對偶問得到最優(yōu)解,對偶問題為:
max∑α[n] - 1/2 ∑α[n]*α[m]*b[n]*b[m]*a[n]*a[m]
0≤α[n]≤C*∑α[n]*b[m]=0.
其中a[n] ·a[m]表示這兩個向量的內(nèi)積,當(dāng)對于線性不可分的情況,用核內(nèi)積K(a[n],a[m])(通過核函數(shù)映射到高維空間中對應(yīng)向量的內(nèi)積)代替a[n] ·a[m].根據(jù)對偶問題的解α,求得k,p,得到最優(yōu)分類面.
SVM 模型求解 :當(dāng)向量維數(shù)較大且訓(xùn)練樣本向量比較多時,上述的對偶問題是一個大型矩陣的問題,用一般的矩陣求逆的方法不管是在時間復(fù)雜度上還是在空間復(fù)雜度上都是非常不可取的.序貫最小優(yōu)化(sequential minimal optimization,簡稱SMO)算法是目前解決大量數(shù)據(jù)下支持向量機(jī)訓(xùn)練問題的一種比較有效的方法.
SMO[6]算法的大致步驟為:
(1)將m向量分為兩個集合,工作集a,固定集b,即:m= {a,b}.
(2)每次對a求解單個較小的二次規(guī)劃時,使b中的值不變.
(3)每次迭代選擇不同的a和b,每次解出一個小規(guī)模的優(yōu)化問題,都是在原來的基礎(chǔ)上向最后的解集前進(jìn).
(4)在每次迭代后,檢查結(jié)果.當(dāng)滿足優(yōu)化條件時,便得到了優(yōu)化問題的解,該算法結(jié)束.
將該算法封裝成一個易于調(diào)用的函數(shù),其部分源代碼如下所示:
def SVM(test_protein):
model=SVC()
model.fit(dataset.data,dataset.label)
svm_result=model.predict([dataset.To_staticlist(dataset.Delplace(test_protein))])
sum_result.append(svm_result[0])
1.3.2 決策樹(Decision Tree)算法
決策樹[5]也是經(jīng)常使用的數(shù)據(jù)挖掘算法,決策樹分類器就像判斷模塊和終止塊組成的流程圖,構(gòu)造決策樹的過程就是尋找有決定性作用的特征,根據(jù)其決定性大小的程度來構(gòu)建一個倒立的樹,將最大決定性作用的特征作為根節(jié)點(diǎn),之后遞歸尋找各個分支下子集里其次要決定性作用的特征,直到子集中所有的數(shù)據(jù)都屬于同一類別.故建立決策樹的過程實(shí)際上就是依據(jù)數(shù)據(jù)的特征將數(shù)據(jù)集進(jìn)行分類的遞歸過程.
決策樹的基本構(gòu)造步驟如下;
(1)Create node M
(2)if訓(xùn)練集為NULL,在返回node M標(biāo)記為False
(3)if訓(xùn)練集中所有數(shù)據(jù)都屬于同一個類,則用此類別標(biāo)記node M
(4)如果候選的屬性為空,則返回M作為葉節(jié)點(diǎn),標(biāo)記為訓(xùn)練集中最普通的類;
(5)for each 候選屬性 Att_List
(6)if 候選屬性是連續(xù)的
(7)then對該屬性進(jìn)行離散化
(8)選擇候選屬性Att_List中具有最高信息增益率的屬性A
(9)標(biāo)記node M為屬性A
(10)for each 屬性A的統(tǒng)一值a
(11)由節(jié)點(diǎn)M長出一個條件為A=d的分支
(12)設(shè)置S是訓(xùn)練集中A=d的訓(xùn)練樣本的集合
(13)if S==NULL
(14)加上一個樹葉,標(biāo)記為訓(xùn)練集中最普通的類
(15)else加上一個返回的點(diǎn)
將上述算法封裝成一個易被調(diào)用的函數(shù),其部分源代碼如下所示:
def Decision_Tree(test_protein):
model = DecisionTreeClassifier()
model.fit(dataset.data,dataset.label)
tree_result=model.predict([dataset.To_staticlist(dataset.Delplace(test_protein))])
sum_result.append(tree_result[0])
1.3.3 邏輯回歸(Logistic Regression)算法
邏輯回歸[7]是機(jī)器學(xué)習(xí)中一種常見的分類方法,主要用于二分類問題,利用Logistic函數(shù),自變量取值范圍為(-INF, INF),自變量的取值范圍為(0,1),函數(shù)形式為:
因為Logistic函數(shù)的定義域是(-INF, +INF),而值域為(0, 1),所有最基本的LR分類器適合于對二分類(類0,類1)目標(biāo)進(jìn)行分類.Logistic 函數(shù)是“S”形圖案的函數(shù),如圖1所示.
圖1 Logistic 函數(shù)
(1)
函數(shù)hθ(X)的值表示結(jié)果為1的概率(特征屬于y=1的概率)所以對于輸入x分類結(jié)果類別1和類別0的概率如式(2)所示:
P(y=1|x;θ)=hθ(x)
P(y=0|x;θ)=1-hθ(x)
(2)
當(dāng)要判別一個新來的特征屬于哪個類時,按式(3)求出一個z值:
(3)
(x1,x2,…,xn是某樣本數(shù)據(jù)的各個特征,維度為n)
進(jìn)一步求出hθ(X),當(dāng)其大于0.5時,就是y=1的類,相反則屬于y=0的類.(假設(shè)統(tǒng)計樣本是均勻分布的,設(shè)閾值為0.5).
Logistic算法也可以用于多分類問題,但是二分類的更較常用.因此實(shí)際中最常用的就是二分類的Logistic算法.LR分類器適用數(shù)據(jù)類型:數(shù)值型和標(biāo)稱型數(shù)據(jù).其優(yōu)點(diǎn)是計算代價不高,易于理解和實(shí)現(xiàn);其缺點(diǎn)是容易欠擬合,分類精度可能不高.
將上述算法封裝成一個函數(shù),其部分源代碼如下所示:
def Logistic_Regression(test_protein):
model=LogisticRegression()
model.fit(dataset.data,dataset.label)
logic_result=model.predict([dataset.To_staticlist(dataset.Delplace(test_protein))])
sum_result.append(logic_result[0])
1.3.4 K近鄰(K-Nearest Neighbor)算法
KNN[8](K Nearest Neighbors,K近鄰)是一種基于實(shí)例的監(jiān)督學(xué)習(xí)算法,利用計算訓(xùn)練集和新數(shù)據(jù)集特征值之間的距離,然后選取k(k>=1)個距離最近的鄰居進(jìn)行回歸或者分類判斷.當(dāng)k=1,新數(shù)據(jù)就會被簡單分配給其相鄰的類.KNN算法的過程為:
(1)選取一個計算距離的方式, 利用所有的數(shù)據(jù)特征來計算新數(shù)據(jù)集與已知類別數(shù)據(jù)集中數(shù)據(jù)點(diǎn)的距離.
(2)依照距離,遞增排序,選擇和當(dāng)前距離最進(jìn)的k個點(diǎn).
(3)對于離散的分類問題,對返回k個點(diǎn)出現(xiàn)頻率最多的類別進(jìn)行預(yù)測分類;對于回歸則返回k個點(diǎn)的加權(quán)值用作預(yù)測值.
將上述算法封裝成一個函數(shù),其部分源代碼如下所示:
def KNN(test_protein):
model=KNeighborsClassifier(n_neighbors=10)
model.fit(dataset.data,dataset.label)
knn_result=model.predict([dataset.To_staticlist(dataset.Delplace(test_protein))])
sum_result.append(knn_result[0])
根據(jù)上述算法,開發(fā)出名為protein verify的軟件,可從本地打開包含氨基酸序列的文本文檔作為輸入數(shù)據(jù)寫入軟件,其輸入格式具有很強(qiáng)的健壯性,可對輸入數(shù)據(jù)進(jìn)行增刪更改,輸入數(shù)據(jù)無格式要求,可包含空格數(shù)字,對輸入序列大小寫無要求.該軟件界面如圖2所示.
圖2 protein verify軟件界面
軟件功能如下:
(1)open按鈕;可從本機(jī)打開存有蛋白質(zhì)一級序列的文檔,打開后序列呈現(xiàn)在文本框內(nèi).
(2)Save按鈕:對打開后的序列進(jìn)行增刪更改后可保存到本地.
(3)verify按鈕;即可對該蛋白質(zhì)做出親疏水性鑒定.其查詢結(jié)果與預(yù)測準(zhǔn)確率如圖3所示.
圖3 查詢結(jié)果顯示
通過以上四種分類器算法的集成,隨機(jī)選擇多個蛋白質(zhì)進(jìn)行軟件測試,利用圖4所示的計算方法得出表2的預(yù)測準(zhǔn)確率:
True Positive(TP):被模型預(yù)測為正的正樣本
True Negative(TN):被模型預(yù)測為負(fù)的負(fù)樣本
False Positive(FP):被模型預(yù)測為正的負(fù)樣本
False Negative(FN):被模型預(yù)測為負(fù)的正樣本
True Positive Rate(TPR)
TPR = TP/(TP + FN)正樣本預(yù)測結(jié)果數(shù)/正樣本實(shí)際數(shù)
True Negative Rate(TNR) TNR = TN/(TN + FP)負(fù)樣本預(yù)測結(jié)果數(shù)/負(fù)樣本實(shí)際數(shù)
False Positive Rate(FPR) FPR = FP/(FP + TN)被預(yù)測為正的負(fù)樣本結(jié)果數(shù)/負(fù)樣本實(shí)際數(shù))
False Negative Rate( FNR)FNR = FN/(TP + FN)被預(yù)測為負(fù)的正樣本結(jié)果數(shù)/正樣本實(shí)際數(shù)
圖4 概率計算方法
Precision:正確預(yù)測的概率
F1-Score:precision和recall的調(diào)和平均數(shù)
Recall(真陽性率):正確識別的概率
Support:訓(xùn)練集樣本容量
表2 Classification report
經(jīng)過實(shí)驗,該算法可將多個含有親疏水性特征值的蛋白質(zhì)作為一個數(shù)據(jù)集輸入到分類器中.分類器利用該數(shù)據(jù)集進(jìn)行自我訓(xùn)練與學(xué)習(xí),最終準(zhǔn)確預(yù)測出蛋白質(zhì)的疏水性.
該算法可作為蛋白質(zhì)疏水性分析預(yù)測的有力工具,在生物信息領(lǐng)域中得到廣泛的應(yīng)用.