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