日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

SVM原理以及Tensorflow 实现SVM分类(附代码)

發布時間:2023/12/15 综合教程 29 生活家
生活随笔 收集整理的這篇文章主要介紹了 SVM原理以及Tensorflow 实现SVM分类(附代码) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.1. SVM介紹
1.2. 工作原理

1.2.1. 幾何間隔和函數間隔
1.2.2. 最大化間隔

1.3. 軟間隔
1.4. SMO算法
1.5. 核函數
1.6. 實例

1.1. SVM介紹

SVM(Support Vector Machines)——支持向量機是在所有知名的數據挖掘算法中最健壯,最準確的方法之一,它屬于二分類算法,可以支持線性和非線性的分類。發展到今天,SVM已經可以支持多分類了,但在這一章里,我們著重講支持向量機在二分類問題中的工作原理。
假設在一個二維線性可分的數據集中,圖一A所示,我們要找到一個超平面把兩組數據分開,這時,我們認為線性回歸的直線或邏輯回歸的直線也能夠做這個分類,這條直線可以是圖一B中的直線,也可以是圖一C中的直線,或者圖一D中的直線,但哪條直線才最好呢,也就是說哪條直線能夠達到最好的泛化能力呢?那就是一個能使兩類之間的空間大小最大的一個超平面。
這個超平面在二維平面上看到的就是一條直線,在三維空間中就是一個平面...,因此,我們把這個劃分數據的決策邊界統稱為超平面。離這個超平面最近的點就叫做支持向量,點到超平面的距離叫間隔。支持向量機就是要使超平面和支持向量之間的間隔盡可能的大,這樣超平面才可以將兩類樣本準確的分開,而保證間隔盡可能的大就是保證我們的分類器誤差盡可能的小,盡可能的健壯。

圖一

1.2. 工作原理

1.2.1. 幾何間隔和函數間隔

在最大化支持向量到超平面距離前,我們首先要定義我們的超平面(h({{x}}))(稱為超平面的判別函數,也稱給定({w})和({b})的泛函間隔),其中({w})為權重向量,({b})為偏移向量:

[h({{x}})={w}^T{x}+{b}
]

樣本({x})到最優超平面的幾何間隔為:

[r=frac{h({x})}{||{w}||}=frac{{w}^T{x}+{b}}{||{w}||}
]

(||{w}||)是向量({w})的內積,是個常數,即(||{w}||=sqrt{{w_{_0}}^2+{w_{_1}}^2+...+{w_{_n}}^2}),而(h({{x}}))就是下面要介紹的函數間隔。

函數間隔

[widehat{r}=h({{x}})
]

函數間隔(h({x}))它是一個并不標準的間隔度量,是人為定義的,它不適合用來做最大化的間隔值,因為,一旦超平面固定以后,如果我們人為的放大或縮小({w})和({b})值,那這個超平面也會無限的放大或縮小,這將對分類造成嚴重影響。而幾何間隔是函數間隔除以(||{w}||),當({w})的值無限放大或縮小時,(||{w}||)也會放大或縮小,而整個(r)保持不變,它只隨著超平面的變動而變動,不受兩個參數的影響。因而,我們用幾何間隔來做最大化間隔度量。

1.2.2. 最大化間隔

在支持向量機中,我們把幾何間隔({r})作為最大化間隔進行分析,并且采用-1和1作為類別標簽,什么采用-1和+1,而不是0和1呢?這是由于-1和+1僅僅相差一個符號,方便數學上的處理。我們可以通過一個統一公式來表示間隔或者數據點到分隔超平面的距離,同時不必擔心數據到底是屬于-1還是+1類。
我們一步一步的進行分析,首先如下圖,在這個(mathbb{R}^2)空間中,假設我們已經確定了一個超平面,這個超平面的函數關系式應該是(h({{x}})={w}^T{x}+{b}=0),這個式子表示我們圖中的那條虛線,很明顯,這個式子意思是說點x在超平面上,但我們要想使所有的點都盡可能的遠離這個超平面,我們只要保證離這個超平面最近的點遠離這個超平面,也就是說這些叫支持向量的點(x^*)需要盡可能的遠離它。

我們把其中一個支持向量(x^*)到最優超平面的距離定義為:

[r^*={frac{h({x}^*)}{||{w}||}}= left{egin{matrix}
{frac{1}{||{w}||}} & if:y^*=h({x}^*)=+1 \
& \
{-frac{1}{||{w}||}} & if:y^*=h({x}^*)=-1
end{matrix}ight.]

這是我們通過把函數間隔(h({x}))固定為1而得來的。我們可以把這個式子想象成還存在兩個平面,這兩個平面分別是({w}^T{x}_{_s}+{b}=1)和({w}^T{x}_{_s}+{b}=-1),對應上圖中的兩根實線。這些支持向量({x}_{_s})就在這兩個平面上,這兩個平面離最優超平面的距離越大,我們的間隔也就越大。對于其他的點({x}_{_i})如果滿足({w}^T{x}_{_i}+{b}>1),則被分為1類,如果滿足滿足({w}^T{x}_{_i}+{b}<-1),則被分為-1類。即有約束條件:

[left{egin{matrix}
{{w}^T{x_{_i}}+{b}}geqslant 1 & y_{_i}=+1 \
& \
{{w}^T{x{_i}}+{b}} leqslant -1& y_{_i}=-1
end{matrix}ight.]

支持向量到超平面的距離知道后,那么分離的間隔(ho)很明顯就為:

[ho=2r^*=frac{2}{||{w}||}
]

這下我們就要通過找到最優的({w})和({b})來最大化(ho)了,感覺又像回到了邏輯回歸或線性回歸的例子。但是這里,我們最大化(ho)值需要有條件限制,即:

[egin{cases}
& max limits_{{w},{b}} {frac{2}{||{w}||}} \
& \
& {y_{_i}}({w}^T{x_{_i}}+{b}) geqslant 1, (i=1,..,n)
end{cases}]

({y_{_i}}({w}^T{x_{_i}}+{b}))的意思是通過判斷({y_{_i}})和({w}^T{x_{_i}}+{b})是否同號來確定分類結果。
接著,為了計算方便,我們把上式最大化(ho)換成:

[egin{cases}
& min limits_{{w},{b}} {frac{1}{2}}||{w}||^2 \
& \
& {y_{_i}}({w}^T{x_{_i}}+{b}) geqslant 1, (i=1,..,n)
end{cases}]

這種式子通常我們用拉格朗日乘數法來求解,即:

[L({x})=f({x})+sumalpha g({x})
]

(f({x}))是我們需要最小化的目標函數,(g({x}))是不等式約束條件,即前面的({y_{_i}}({w}^T{x_{_i}}+{b}) geqslant 1),(alpha)是對應的約束系數,也叫拉格朗日乘子。為了使得拉格朗日函數得到最優化解,我們需要加入能使該函數有最優化解法的KKT條件,或者叫最優化條件、充要條件。即假設存在一點({x}^*)

1.2.2.0.0.1. (L({x}^*))對({x}^*)求導為0

1.2.2.0.0.2. (alpha_{_i} g_{_i}({x}^*)=0),對于所有的(i=1,.....,n)

這樣構建我們的拉格朗日函數為:

[L({w},{b},alpha)=frac{1}{2}{w}^T{w}-sum_{i=1}^{n}alpha_{_i}[y_{_i}({w}^T{x_{_i}}+{b})-1]
]

以上的KKT條件(alpha_{_i}[y_{_i}({w}^T{x_{_i}}+{b})-1]=0)表示,只有距離最優超平面的支持向量((x_i,y_i))對應的(alpha)非零,其他所有點集的(alpha)等于零。綜上所述,引入拉格朗日乘子以后,我們的目標變為:

[min_{{w},{b}}max_{alphageqslant 0 }L({w},{b},alpha)
]

即先求得(alpha)的極大值,再求({w})和({b})的極小值。可以把該問題轉為為等價的凸優化和對偶問題來求解,對于凸優化和對偶問題可以參考《凸優化》這本書,因為該理論可以整整用一本書來介紹了,筆者在這里也只能點到為止了。通過對偶,我們的目標可以又變成:

[max_{alphageqslant 0}min_{{w},{b}}L({w},{b},alpha)
]

即先求得({w})和({b})的極小值,在求(alpha)的極大值。用(L({w},{b},alpha))對({w})和({b})分別求偏導,并令其等于0:

[egin{cases}
& frac{partial L({w},{b},alpha )}{partial {w}} =0\
& \
& frac{partial L({w},{b},alpha )}{partial {b}}=0
end{cases}]

得:

[egin{cases}
& {w}=sum_{i=1}^{n}alpha{_i}y_{_i}x_{_i} \
& \
& sum_{i=1}^{n}alpha{_i}y_{_i}=0
end{cases}]

把該式代入原來的的拉格朗日式子可得(推導過程省略):

[W(alpha)=sum_{i=1}^{n}alpha{_i}-frac{1}{2}sum_{i=1}^{n}sum_{j=1}^{n}alpha{_i}alpha{_j}y_{_i}y_{_j}{x_{_i}}^Tx_{_j}
]

[sum_{i=1}^{n}alpha{_i}y_{_i}=0 , alpha_{_i}geqslant 0 (i=1,...,n)]

該(W(alpha))函數消去了向量({w})和向量({b}),僅剩(alpha)這個未知參數,只要我們能夠最大化(W(alpha)),就能求出對應的(alpha),進而求得({w})和({b})。對于如何求解(alpha),SMO算法給出了完美的解決方案,下一節我們詳細講述。這里我們假設通過SMO算法確定了最優(alpha^*),則

[{w}^*=sum_{i=1}^{n}alpha{_i}^*y_{_i}x_{_i}
]

最后使用一個正的支持向量({x}_{_s}),就可以計算出({b}):

[{b}^*=1-{{w}^*}^T {x}_{_s}
]

1.3. 軟間隔

在4.2節中我們推導了如何計算({w})、({b})和({alpha}),但別忘了以上所有的推導都是在線性可分的條件下進行的,但是現實世界的許多問題并不都是線性可分的,尤其存在許多復雜的非線性可分的情形。如果樣本不能被完全線性分開,那么情況就是:間隔為負,原問題的可行域為空,對偶問題的目標函數無限,這講導致相應的最優化問題不可解。
要解決這些不可分問題,一般有兩種方法。第一種是放寬過于嚴格的間隔,構造軟間隔。另一種是運用核函數把這些數據映射到另一個維度空間去解決非線性問題。在本節中,我們首先介紹軟間隔優化。
假設兩個類有幾個數據點混在一起,這些點對最優超平面形成了噪聲干擾,軟間隔就是要擴展一下我們的目標函數和KKT條件,允許少量這樣的噪聲存在。具體地說,就要引入松馳變量(xi_{_i})來量化分類器的違規行為:

[egin{cases}
& min limits_{{w},{b}} {frac{1}{2}}||{w}||^2 +Csum_{i=1}^{n} {xi_{_i}}
& \
& \
& {y_{_i}}({w}^T{x_{_i}}+{b}) geqslant 1-xi_{_i} & ,xi_{_i}geqslant0, & (i=1,..,n)
end{cases}]

參數C用來平衡機器的復雜度和不可分數據點的數量,它可被視為一個由用戶依據經驗或分析選定的“正則化”參數。松馳變量(xi_{_i})的一個直接的幾何解釋是一個錯分實例到超平面的距離,這個距離度量的是錯分實例相對于理想的可分模式的偏差程度。對上式的化解,可得:

[W(alpha)=sum_{i=1}^{n}alpha{_i}-frac{1}{2}sum_{i=1}^{n}sum_{j=1}^{n}alpha{_i}alpha{_j}y_{_i}y_{_j}{x_{_i}}^Tx_{_j}
]

[sum_{i=1}^{n}alpha{_i}y_{_i}=0, 0leqslant alpha_{_i}leqslant C (i=1,...,n)
]

可以看到,松馳變量(xi_{_i})沒有出現在(W(alpha))中,線性可分與不可分的差異體現在約束(alpha_{_i}geqslant 0)被替換成了約束(0leqslant alpha_{_i}leqslant C)。但是,這兩種情況下求解({w})和({b})是非常相似的,對于支持向量的定義也都是一致的。
在不可分情況下,對應的KKT條件為:

[alpha_{_i}[y_{_i}({w}^T{x_{_i}}+{b})-1+xi_{_i}]=0, (i=1,...,n)
]

1.4. SMO算法

1996年, John Platt發布了一個稱為SMO的強大算法,用于訓練SVM。 SMO表示序列最小優化(Sequential Minimal Optimization)。 Platt的SMO算法是將大優化問題分解為多個小優化問題來求解,這些小優化問題往往很容易求解,并且對它們進行順序求解的結果與將它們作為整體來求解的結果是完全一致的。
SMO算法的目標是求出一系列(alpha),一旦求出了這些(alpha),就很容易計算出權重向量({w})和({b}),并得到分隔超平面。
SMO算法的工作原理是:每次循環中選擇兩個(alpha)進行優化處理。一旦找到一對合適的(alpha),那么就增大其中一個同時減小另一個。這里所謂的“合適”就是指兩個(alpha)必須要符合一定的條件,條件之一就是這兩個(alpha)必須要在間隔邊界之外,而其第二個條件則是這兩個(alpha)還沒有進行過區間化處理或者不在邊界上。
對SMO具體的分析如下,在4.3節中我們已經得出了

[W(alpha)=sum_{i=1}^{n}alpha{_i}-frac{1}{2}sum_{i=1}^{n}sum_{j=1}^{n}alpha{_i}alpha{_j}y_{_i}y_{_j}{x_{_i}}^Tx_{_j}
]

[sum_{i=1}^{n}alpha{_i}y_{_i}=0, 0leqslant alpha_{_i}leqslant C (i=1,...,n)
]

其中((x_i,y_i))已知,C可以預先設定,也是已知數,現在就是要最大化(W(alpha)),求得參數({alpha}=[alpha_{_1},alpha_{_2},...,alpha_{_n}])。SMO算法是一次選擇兩個(alpha)進行優化,那我們就選擇(alpha_{_1})和(alpha_{_2}),然后把其他參數([alpha_{_3},alpha_{_4},...,alpha_{_n}])固定,這樣(alpha_{_1})、(alpha_{_2})表示為下面的式子,其中(zeta)是實數值:

[alpha_{_1}y_{_1}+alpha_{_2}y_{_2}=-sum_{i=3}^{n}alpha_{_i}y_{_i}=zeta
]

然后用(alpha_{_2})來表示(alpha_{_1}):

[alpha_{_1}=(zeta-alpha_{_2}y_{_2})y_{_1}
]

把上式帶入(W({alpha}))中:

[W(alpha)=W(alpha_{_1},alpha_{_2},...,alpha_{_n})=W((zeta-alpha_{_2}y_{_2})y_{_1},alpha_{_2},...,alpha_{_n})
]

省略一系列化解過程后,最后會化解成我們熟悉的一元二次方程,a,b,c均是實數值:

[W(alpha_{_2})=aalpha_{_2}^2+balpha_{_2}+c
]

最后對(alpha_{_2})求導,解得(alpha_{_2})的具體值,我們暫時把這個實數值叫(alpha_{_2}^*)。而這個(alpha_{_2}^*)需要滿足一個條件(Lleqslant alpha_{_2}^*leqslant H),其中(L)和(H)是什么呢?如下圖所示:


(圖片來自網絡)

根據之前的條件(0leqslant alpha_{_i}leqslant C)和等式(alpha_{_1}y_{_1}+alpha_{_2}y_{_2}=zeta)知(alpha_{_1})和(alpha_{_2})要在矩形區域內,并且在直線上。當(y_{_1})和(y_{_2})異號時:

[egin{cases}
L=max(0,alpha_{_2}-alpha_{_1}) \
&\
H=min(C,C+alpha_{_2}-alpha_{_1})
end{cases}]

當(y_{_1})和(y_{_2})同號時:

[egin{cases}
L=max(0,alpha_{_2}+alpha_{_1}-C) \
&\
H=min(C,alpha_{_2}+alpha_{_1})
end{cases}]

最后,滿足條件的(alpha_{_2})應該由下面的式子得到,(alpha_{_2}^{**})才為最終的值:

[alpha_{_2}^{**} =egin{cases}
H &, alpha_{_2}^*> H \
\
alpha_{_2}^*& , Lleq alpha_{_2}^*leq H \
\
L & ,alpha_{_2}^*<L
end{cases}]

求得(alpha_{_2}^{**})后我們就可以求得(alpha_{_1}^{**})了。然后我們重復地按照最優化((alpha_{_1},alpha_{_2}))的方式繼續選擇((alpha_{_3},alpha_{_4})),((alpha_{_5},alpha_{_6}))....((alpha_{_{n-1}},alpha_{_n}))進行優化求解,這樣({alpha}=[alpha_{_1},alpha_{_2},...,alpha_{_n}])求解出來后,整個線性劃分問題就迎刃而解。

1.5. 核函數

對于以上幾節講的SVC算法,我們都在線性可分或存在一些噪聲點的情況下進行的二分類,但是如果我們存在兩組數據,它們的散點圖如下圖所示,你可以看出這完全是一個非線性不可分的問題,我們無法使用之前講的SVC算法在這個二維空間中找到一個超平面把這些數據點準確的分開。

解決這個劃分問題我們需要引入一個核函數,核函數能夠恰當的計算給定數據的內積,將數據從輸入空間的非線性轉變到特征空間,特征空間具有更高甚至無限的維度,從而使得數據在該空間中被轉換成線性可分的。如下圖所示,我們把二維平面的一組數據,通過核函數映射到了一個三維空間中,這樣,我們的超平面就面成了一個平面(在二維空間中是一條直線),這個平面就可以準確的把數據劃分開了。

核函數有Sigmoid核、線性核、多項式核和高斯核等,其中高斯核和多項式核比較常用,兩種核函數均可以把低維數據映射到高維數據。高斯核的公式如下,(sigma)是達到率,即函數值跌落到0的速度參數:

[K({x_1},{x_2})=exp(frac{-||{x_1}-{x_2}||^2}{2sigma^2 })
]

多項式核函數的公式如下,(R)為實數,(d)為低維空間的維數:

[K({x_1},{x_2})=(left langle {x_1}, {x_2}ight angle +R)^d
]

應用于我們的上個例子,我們先定義,用(phi : {x} o H)表示從輸入空間({x}subset mathbb{R}^n)到特征空間H的一個非線性變換。假設在特征空間中的問題是線性可分的,那么對應的最優超平面為:

[{w}^{phi T}phi({x})+{b}=0
]

通過拉格朗日函數我們推導出:

[{w}^{phi *}=sum_{i=1}^{n}alpha{_i}^*y_{_i}phi({x_{_i}})
]

帶入上式得特征空間的最優超平面為:

[sum_{i=1}^{n}alpha{_i}^*y_{_i}phi^T({x_{_i}})phi({x})+{b}=0
]

這里的(phi^T({x_{_i}})phi({x}))表示內積,用核函數代替內積則為:

[sum_{i=1}^{n}alpha{_i}^*y_{_i}K({x_{_i}},{x})+{b}=0
]

這說明,我們的核函數均是內積函數,通過在低維空間對輸入向量求內積來映射到高維空間,從而解決在高維空間中數據線性可分的問題,至于具體的推導過程,這里就不再進行了,感興趣的可以自己再推導一次,加深理解。
為什么核函數可以把低維數據映射成高維數據呢,我們以多項式核來解釋一下。
假設有兩個輸入樣本,它們均為二維行向量({x_1}=[x_1,x_2]),({x_2}=[x_3,x_4]),他們的內積為:

[left langle {x_1},{x_2} ight angle={x_1}{x_2}^T=egin{bmatrix}
x_1 &x_2
end{bmatrix}egin{bmatrix}
x_3\x_4
end{bmatrix}=x_1x_3+x_2x_4]

用多項式核函數進行映射,令(R=0),(d=2):

[ K({x_1},{x_2})=(left langle {x_1},{x_2} ight angle)^2
=(x_1x_3+x_2x_4 )^2={x_1}^2{x_3}^2+2x_1x_2x_3x_4+{x_2}^2{x_4}^2=phi({x_1}) phi({x_2})]

按照線性代數中的標準定義,(phi({x_1}))和(phi({x_2}))為映射后的三維行向量和三維列向量,即:

[phi({x_1})=egin{bmatrix}
{x_1}^2 & sqrt{2}{x_1}{x_2} & {x_2}^2
end{bmatrix}]

[phi({x_2})=egin{bmatrix}
{x_3}^2\ \ sqrt{2}{x_3}{x_4}\
\ {x_4}^2
end{bmatrix}]

它們的內積用向量的方式表示則更直觀:

[phi({x_1})phi({x_2})=egin{bmatrix}
{x_1}^2 & sqrt{2}{x_1}{x_2} & {x_2}^2
end{bmatrix}egin{bmatrix}
{x_3}^2\ \ sqrt{2}{x_3}{x_4}\
\ {x_4}^2
end{bmatrix}={x_1}^2{x_3}^2+2x_1x_2x_3x_4+{x_2}^2{x_4}^2]

這樣我們就把二維數據映射成了三維數據,對于高斯核的映射,會用到泰勒級數展開式,讀者可以自行推導一下。
對于核函數我們就暫時介紹到這里。下一節我們開始運用tensorflow來進行實戰,由于沒有找到線性不可分的數據集,我們的例子中就沒有用到核函數來建模,因為我們只找到了一個線性可分的數據集,所以下一節我們僅運用tensorflow來進行線性二分類的分類器構建。

1.6. 實例

我們在網上下載了一組鳶尾花數據集,這組數據集有100個樣本點,我們用SVM來預測這些鳶尾花數據集中哪些是山鳶尾花,哪些是非山鳶尾花。

首先需要加載數據集,加載數據集需要用到sklearn、scipy、mkl庫,sklearn直接在Pycharm中安裝即可,而另外兩個庫需要在網上下載安裝,下載地址:http://www.lfd.uci.edu/~gohlke/pythonlibs/

import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
from sklearn import datasets

sess = tf.Session()

# 加載數據
# iris.data = [(Sepal Length, Sepal Width, Petal Length, Petal Width)]
iris = datasets.load_iris()
x_vals = np.array([[x[0], x[3]] for x in iris.data])
y_vals = np.array([1 if y == 0 else -1 for y in iris.target])

分離測試集與訓練集


# 分離訓練和測試集
train_indices = np.random.choice(len(x_vals),
                                 round(len(x_vals)*0.8),
                                 replace=False)
test_indices = np.array(list(set(range(len(x_vals))) - set(train_indices)))
x_vals_train = x_vals[train_indices]
x_vals_test = x_vals[test_indices]
y_vals_train = y_vals[train_indices]
y_vals_test = y_vals[test_indices]

定義模型和loss函數


batch_size = 100

# 初始化feedin
x_data = tf.placeholder(shape=[None, 2], dtype=tf.float32)
y_target = tf.placeholder(shape=[None, 1], dtype=tf.float32)

# 創建變量
A = tf.Variable(tf.random_normal(shape=[2, 1]))
b = tf.Variable(tf.random_normal(shape=[1, 1]))

# 定義線性模型
model_output = tf.subtract(tf.matmul(x_data, A), b)

# Declare vector L2 'norm' function squared
l2_norm = tf.reduce_sum(tf.square(A))

# Loss = max(0, 1-pred*actual) + alpha * L2_norm(A)^2
alpha = tf.constant([0.01])
classification_term = tf.reduce_mean(tf.maximum(0., tf.subtract(1., tf.multiply(model_output, y_target))))
loss = tf.add(classification_term, tf.multiply(alpha, l2_norm))

開始訓練數據

my_opt = tf.train.GradientDescentOptimizer(0.01)
train_step = my_opt.minimize(loss)

init = tf.global_variables_initializer()
sess.run(init)

# Training loop
loss_vec = []
train_accuracy = []
test_accuracy = []
for i in range(20000):
    rand_index = np.random.choice(len(x_vals_train), size=batch_size)
    rand_x = x_vals_train[rand_index]
    rand_y = np.transpose([y_vals_train[rand_index]])
    sess.run(train_step, feed_dict={x_data: rand_x, y_target: rand_y})

繪制圖像

[[a1], [a2]] = sess.run(A)
[[b]] = sess.run(b)
slope = -a2/a1
y_intercept = b/a1
best_fit = []

x1_vals = [d[1] for d in x_vals]

for i in x1_vals:
    best_fit.append(slope*i+y_intercept)


# Separate I. setosa
setosa_x = [d[1] for i, d in enumerate(x_vals) if y_vals[i] == 1]
setosa_y = [d[0] for i, d in enumerate(x_vals) if y_vals[i] == 1]
not_setosa_x = [d[1] for i, d in enumerate(x_vals) if y_vals[i] == -1]
not_setosa_y = [d[0] for i, d in enumerate(x_vals) if y_vals[i] == -1]

plt.plot(setosa_x, setosa_y, 'o', label='I. setosa')
plt.plot(not_setosa_x, not_setosa_y, 'x', label='Non-setosa')
plt.plot(x1_vals, best_fit, 'r-', label='Linear Separator', linewidth=3)
plt.ylim([0, 10])
plt.legend(loc='lower right')
plt.title('Sepal Length vs Pedal Width')
plt.xlabel('Pedal Width')
plt.ylabel('Sepal Length')
plt.show()

訓練后的結果

轉載注明出處http://www.cnblogs.com/vipyoumay/p/7560061.html

總結

以上是生活随笔為你收集整理的SVM原理以及Tensorflow 实现SVM分类(附代码)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。