iT邦幫忙

2021 iThome 鐵人賽

DAY 11
0
AI & Data

數據分析方法研究和理解演算法系列 第 11

DAY11支持向量機演算法

昨天介紹完支持向量機(Support Vector Machines)和SMO算法,今天就要來實戰這個方法,當然因為之前有說要用二維圖去做示範,所以先用matplotlib建立兩個維度的散點圖,程式如下:

import matplotlib.pyplot as plt
import numpy as np
#label1資料 第3維為類別
label1_data=np.array([[75,-15,1],[81,12,1],[71,-9,1],[86,20,1],[40,-20,1],[81,6,1],[84,-2,1],[81,15,1],[78,4,1],[74,-1,1]])
x_label1=[label1_data[i][0] for i in range(len(label1_data))]
y_label1=[label1_data[i][1] for i in range(len(label1_data))]

#label2資料 第3維為類別
label2_data=np.array([[35,19,-1],[30,25,-1],[23,2,-1],[36,17,-1],[3,-8,-1],[31,2,-1],[21,-7,-1],[8,-27,-1],[16,-12,-1],[59,20,-1]])
x_label2=[label2_data[i][0] for i in range(len(label2_data))]
y_label2=[label2_data[i][1] for i in range(len(label2_data))]

plt.scatter(x_label1,y_label1)   
plt.scatter(x_label2,y_label2) 
plt.show() 

如圖:
https://ithelp.ithome.com.tw/upload/images/20210925/20141654A5VvJfDAG5.png
好,接下來,依照SVM公式:
https://ithelp.ithome.com.tw/upload/images/20210925/20141654W5n65war64.png
https://ithelp.ithome.com.tw/upload/images/20210925/20141654vvhcaZJAWV.jpg
https://ithelp.ithome.com.tw/upload/images/20210925/20141654YyNeKHSCBs.png
這邊我們在找最佳解問題,採用拉格朗日乘數法:
https://ithelp.ithome.com.tw/upload/images/20210925/20141654RWD3K7m6gl.png
https://ithelp.ithome.com.tw/upload/images/20210925/201416542o1PegZKvo.jpg
所以就會變成
https://ithelp.ithome.com.tw/upload/images/20210925/20141654fuFcF9I7h5.png
所以我們要求這個極值(對係數做偏導)
https://ithelp.ithome.com.tw/upload/images/20210925/20141654LfWmXxJcrN.pnghttps://ithelp.ithome.com.tw/upload/images/20210925/20141654ZsvieWd8pn.png

而把上述當成條件並帶回:
https://ithelp.ithome.com.tw/upload/images/20210925/20141654Q7xRhvFWxp.png
最後要再求:
https://ithelp.ithome.com.tw/upload/images/20210925/20141654Wp33sCtCAY.png
然後現在把SMO算法帶入(為了求a(就可以求到w)和b)
第一步:計算誤差:
因為
https://ithelp.ithome.com.tw/upload/images/20210925/20141654p93TP1y8ZT.png

https://ithelp.ithome.com.tw/upload/images/20210925/20141654bCvaWGG1xp.png
所以
https://ithelp.ithome.com.tw/upload/images/20210925/20141654UI5MtRZfa8.png
起始我們會設定a_j為0,而b也設定為0; y_i為真實類別
另外x_i為資料特徵,但x_i矩陣會長這樣
https://ithelp.ithome.com.tw/upload/images/20210925/20141654WUvEn5ZJ2M.png

但是numpy格式資料
https://ithelp.ithome.com.tw/upload/images/20210925/201416545JHmvs6grA.png
所以有轉置地方會剛好反過來,程式如下:

#合併資料
full_label_data=np.vstack((label1_data,label2_data))
#取出x特徵
full_label_data_x=np.mat(full_label_data[:,[0,1]])
#取出y特徵
y=np.array([full_label_data[i][2] for i in range(len(full_label_data))])
#初始a,b
a=np.zeros((1,20))
b=0

#第一步:計算誤差Ei
for i in range(len(full_label_data)):
	fXi = float(np.multiply(a,y)*(full_label_data_x*full_label_data_x[i,:].T)) + b
	print("第",i+1,"筆fXi:",fXi)
	Ei = fXi - float(y[i])
	print("第",i+1,"筆Ei:",Ei)

結果如下:

第 1 筆fXi: 0.0
第 1 筆Ei: -1.0
第 2 筆fXi: 0.0
第 2 筆Ei: -1.0
第 3 筆fXi: 0.0
第 3 筆Ei: -1.0
第 4 筆fXi: 0.0
第 4 筆Ei: -1.0
第 5 筆fXi: 0.0
第 5 筆Ei: -1.0
第 6 筆fXi: 0.0
第 6 筆Ei: -1.0
第 7 筆fXi: 0.0
第 7 筆Ei: -1.0
第 8 筆fXi: 0.0
第 8 筆Ei: -1.0
第 9 筆fXi: 0.0
第 9 筆Ei: -1.0
第 10 筆fXi: 0.0
第 10 筆Ei: -1.0
第 11 筆fXi: 0.0
第 11 筆Ei: 1.0
第 12 筆fXi: 0.0
第 12 筆Ei: 1.0
第 13 筆fXi: 0.0
第 13 筆Ei: 1.0
第 14 筆fXi: 0.0
第 14 筆Ei: 1.0
第 15 筆fXi: 0.0
第 15 筆Ei: 1.0
第 16 筆fXi: 0.0
第 16 筆Ei: 1.0
第 17 筆fXi: 0.0
第 17 筆Ei: 1.0
第 18 筆fXi: 0.0
第 18 筆Ei: 1.0
第 19 筆fXi: 0.0
第 19 筆Ei: 1.0
第 20 筆fXi: 0.0
第 20 筆Ei: 1.0 

好,今天支持SMO算法第一步算是完成了,明天就開始寫第二部分

男孩發現胸口聲音消失,取而代之是一種恐懼和憤怒感覺聰他胸口發出,男孩不清楚發生了,甚麼事,他只想趕快離開這間小木屋,離開這,於是他衝了出來,並朝著森林深處狂奔,只是他沒有發現到,他的口袋裡的紙條掉落在小木屋內,在男孩走後,紙條突然燒了起來,偶後,從灰燼裡出現了一隻狐狸,只不過他一動也不動,像是在等待誰的到來
		--|我所做的一切都是為了你|--  MS.CM

上一篇
DAY10支持向量機
下一篇
DAY12支持向量機演算法(續一)
系列文
數據分析方法研究和理解演算法30

尚未有邦友留言

立即登入留言