2021-03-20 数据挖掘算法—SVM算法 python
數據挖掘算法—SVM算法
簡介
SVM(Support Vector Machine)名為支持向量機,是常見的一種判別方法。在機器學習領域,是一個有監督的學習模型,通常用來進行模式識別、分類以及回歸分析。
?
相關概念
分類器:分類器就是給定一個樣本的數據,判定這個樣本屬于哪個類別。例如在天氣預測中,我們認為晚上能看到星星數量和亮度對于第二天的天氣情況是有影響的,那么分類器就是通過能看到星星數量和亮度預測第二天的天氣情況。
?
特征:在分類問題中,輸入分類器的數據叫做特征。天氣預測問題特征就是前一天晚上能看到星星數量和亮度。
?
線性分類器:線性分類器是分類器中的一種,就是判定分類結果的根據是通過特征的線性組合得到的。以上面的天氣預測問題為例,判斷的依據只能是前一天晚上能看到星星數量和亮度的線性組合,不能將星星數量和亮度值進行開方、立方等運算。
線性分類器起源
在實際中我們往往遇到這樣的問題:給定一些數據點,它們分別屬于兩個不同的類,現在要找到一個線性分類器把這些數據分成兩類。
?
用二維空間舉個例子,我們用一條直線把空間切割開來,直線左邊的點屬于類別-1,直線右邊的點屬于類別1。
如果用數學語言呢,就是這樣的:空間是由X1和X2組成的二維空間,直線的方程是X1+X2 = 1,用向量表示即為[1,1]^{T}[X1,X2]-1=0 。點x在直線左邊時,把x放入方程左邊,計算結果小于0。同理,在右邊就是把x放入方程左邊,計算出的結果大于0。
?
在三維空間中呢,需要用一個平面把空間切成兩半,對應的方程是X1+X2+X3=1,也就是[1,1,1]^{T}[X1,X2,X3]-1=0 。?
在高維(n>3)空間呢?就需要用到n-1維的超平面將空間切割開,數學描述:
如果用x表示數據點,用y表示類別,一個線性分類器的學習目標便是要在n維的數據空間中找到一個超平面(hyper plane),把空間切割開,W^{T}中的T代表轉置:?
W^{T}X+b=0
?
分類器類型
常見的線性分類器有感知器模型和邏輯回歸。上一節舉出的例子是感知器模型,直接分好類。有時候,我們除了要知道分類器對于新數據的分類結果,還希望知道分類器對于這次分類的概率-->邏輯回歸。
?
邏輯回歸將線性分類器的超平面方程計算結果通過logistic函數從正負無窮映射到0到1。這樣,映射的結果就可以認為是分類器將x判定為類別1的概率,從而指導后面的學習過程。
?
舉個例子,用感知器的天氣預報只會告訴你明天要下雨(y=1),或者明天不下雨(y=-1);而用了邏輯回歸的天氣預報就能告訴你明天有80%的概率要下雨,20%的概率不下雨。
?
邏輯回歸的公式g(z)=\frac{1}{1+e^{-z}} :?
?
在感知器模型中,將特征代入判別方程中,如果得到的值是-3,我們可以判定類別是-1(因為-3<0)。而邏輯回歸中呢,將-3代入g(z),我們就知道,該數據屬于類別1的概率是0.05(近似數值),那么屬于類別-1的概率就是1 – 0.05 = 0.95。
?
SVM
SVM最基本的應用是分類。求解最優的分類面,然后用于分類。
?
最優分類面的定義:?
對于SVM,存在一個分類面,兩個點集到此平面的最小距離最大,兩個點集中的邊緣點到此平面的距離最大。
?
從直觀上來看,下圖左邊的,肯定不是最優分類面;而右邊的能讓人感覺到其距離更大,使用的支撐點更多,至少使用了三個分類面,應該是最優分類面。
?
那么,是不是一個最優分類面需要兩個或三個以上的點才能確定那?
這個要依據實際情況而定。
如下圖,左圖是由三個點,來確定的一個最優分類面,不同類別的兩個點確定一個中心點,而同類的兩個點可以確定方向向量。這個最優分類面,需要三個點。
?
但對于右圖,直接獲取不同類別的兩個點的垂面,即是最優分類面。這個分類面,則需要兩個點。
?
以上,情況的分析,使得求解最優分類面的思路,模式比較復雜。
若采用窮舉法,至少需要以下過程。
先取不同類別的兩個點,求解中心連線的垂面。如以上右圖模式
然后判斷其他點到此垂面的距離,若有更小的距離(或負值,即分類錯誤),則選取以上左圖模式。
?
窮舉所有點。采用最直接的方式處理,則其運算復雜度為 m*n*n, 若n > m.
?
這個還沒有用到高維映射哪,如果再加上高維映射的處理,算法恐怕就更復雜了。所以,窮舉法是不太現實的。
?
核函數
在原始特征的維度上,能直接找到一條分離超平面將數據完美的分成兩類的情況。但如果找不到呢?
?
比如,原始的輸入向量是一維的,0< x <1的類別是1,其他情況記做-1。這樣的情況是不可能在1維空間中找到分離超平面的(一維空間中的分離超平面是一個點,aX+b=0)。
?
這就要說到SVM的黑科技—核函數。核函數可以將原始特征映射到另一個高維特征空間中。?
將原始的一維特征空間映射到二維特征空間X^{2}和x,那么就可以找到分離超平面X^{2}-X=0。當X^{2}-X<0的時候,就可以判別為類別1,當X^{2}-X>0 的時候,就可以判別為類別0。如下圖:?
?
再將X^2-X=0映射回原始的特征空間,就可以知道在0和1之間的實例類別是1,剩下空間上(小于0和大于1)的實例類別都是0。?
?
利用特征映射,就可以將低維空間中的線性不可分問題解決了。核函數除了能夠完成特征映射,而且還能把特征映射之后的內積結果直接返回,大幅度降低了簡化了工作。
?
樣例代碼
# encoding=utf-8 import time from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score from sklearn import datasets from sklearn import svmif __name__ == '__main__':print('prepare datasets...')# Iris數據集iris = datasets.load_iris()features = iris.datalabels = iris.target# 選取33%數據作為測試集,剩余為訓練集train_features, test_features, train_labels, test_labels = train_test_split(features, labels, test_size=0.33,random_state=0)time_2 = time.time()print('Start training...')clf = svm.SVC() # svm class clf.fit(train_features, train_labels) # training the svc model time_3 = time.time()print('training cost %f seconds' % (time_3 - time_2))print('Start predicting...')test_predict = clf.predict(test_features)time_4 = time.time()print('predicting cost %f seconds' % (time_4 - time_3))score = accuracy_score(test_labels, test_predict) print("The accruacy score is %f" % score)總結
以上是生活随笔為你收集整理的2021-03-20 数据挖掘算法—SVM算法 python的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021-03-16 汽车二自由度操纵稳
- 下一篇: 2021-03-20 GPS抽稀之道格拉