iT邦幫忙

2021 iThome 鐵人賽

DAY 13
0
AI & Data

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

DAY13支持向量機演算法(續二)

  • 分享至 

  • xImage
  •  

昨天介紹完SMO算法第二步,今天就要來寫這個方法第三步,
第三步:計算學習率K並計算aj(限制範圍)
https://ithelp.ithome.com.tw/upload/images/20210927/20141654txXJGReowI.png
程式碼如下:

K = -2.0 * full_label_data_x[i,:]*full_label_data_x[j,:].T + full_label_data_x[i,:]*full_label_data_x[i,:].T + full_label_data_x[j,:]*full_label_data_x[j,:].T
	print("第",i+1,"筆K:",K)	

結果:

第 1 筆K: [[197.]]
第 2 筆K: [[3961.]]
第 3 筆K: [[73.]]
第 4 筆K: [[3716.]]
第 5 筆K: [[1961.]]
第 6 筆K: [[2516.]]
第 7 筆K: [[6597.]]
第 8 筆K: [[4954.]]
第 9 筆K: [[73.]]
第 10 筆K: [[197.]]
第 11 筆K: [[2165.]]
第 12 筆K: [[1818.]]
第 13 筆K: [[578.]]
第 14 筆K: [[2665.]]
第 15 筆K: [[5090.]]
第 16 筆K: [[2600.]]
第 17 筆K: [[2845.]]
第 18 筆K: [[5032.]]
第 19 筆K: [[3490.]]
第 20 筆K: [[3920.]] 

算完之後帶回
https://ithelp.ithome.com.tw/upload/images/20210927/20141654MuEzRsf0RH.png
就可以得到更新後a值,不過在此之前,為了得到j點的誤差值,所以要再算一次誤差-->(之前是計算i),算完誤差Ej ,之後就可以帶入
程式碼如下:

#算j點誤差
	fXj = float(np.multiply(a,y)*(full_label_data_x*full_label_data_x[j,:].T)) + b
	Ej = fXj - float(y[j])
	print("第",i+1,"筆Ej:",Ej)
	#帶回公式
	a[0][j] += y[j]*(Ei - Ej)/K
	print("第",i+1,"筆a:",a[0][j])

結果如下:

第 1 筆Ej: 1.0
第 1 筆a: 0.00038218994840435696
第 2 筆Ej: 0.9545193961398816
第 2 筆a: 0.0005076246701730175
第 3 筆Ej: -1.8831573154518741
第 3 筆a: -1.371065412029723e-05
第 4 筆Ej: -1.9790222090609924
第 4 筆a: -1.0340868586040355e-05
第 5 筆Ej: -2.0444414676852096
第 5 筆a: 0.00018170608599350841
第 6 筆Ej: -0.8774225656724229
第 6 筆a: -0.0011927618928813974
第 7 筆Ej: -9.412946850594
第 7 筆a: 0.000703022663047214
第 8 筆Ej: 0.8390105025646216
第 8 筆a: 0.001066839425425307
第 9 筆Ej: -0.10157905044296056
第 9 筆a: 0.001914480569161919
第 10 筆Ej: -9.664588349599235
第 10 筆a: 0.008956264784050677
第 11 筆Ej: 51.00899861035159
第 11 筆a: -0.009735147587753203
第 12 筆Ej: -3.442576883213487
第 12 筆a: 0.00027379122944610665
第 13 筆Ej: -3.8034337236234546
第 13 筆a: -0.00037184448981867165
第 14 筆Ej: -0.07532520299004797
第 14 筆a: 0.0038761578625881605
第 15 筆Ej: -18.08345430086565
第 15 筆a: -0.0070364892806495626
第 16 筆Ej: 3.2571522501932657
第 16 筆a: 0.007169560528442682
第 17 筆Ej: -13.11523754861583
第 17 筆a: 0.0037770094813644206
第 18 筆Ej: 7.543437855094942
第 18 筆a: 0.0010896256504895792
第 19 筆Ej: 2.945063765437575
第 19 筆a: 0.008803649131895111
第 20 筆Ej: 2.0985230305104867
第 20 筆a: 0.00046520592849444203 

然後依據之前所說的H和L,來決定正確的a
https://ithelp.ithome.com.tw/upload/images/20210927/20141654N3JLomRb3I.png
所以程式碼如下:

#限制範圍L和H
	if a[0][j] > H:
		a[0][j] = H
	elif L > a[0][j]:
		a[0][j] = L
	print("第",i+1,"筆經過限制a:",a[0][j])

限制之後,結果如下:

第 1 筆經過限制a: 0.0008988764044943821
第 2 筆經過限制a: 0.0
第 3 筆經過限制a: 0.0
第 4 筆經過限制a: 0.0
第 5 筆經過限制a: 0.0
第 6 筆經過限制a: 0.0
第 7 筆經過限制a: 0.0
第 8 筆經過限制a: 0.0051160018542637025
第 9 筆經過限制a: 0.006715828942402496
第 10 筆經過限制a: 0.0
第 11 筆經過限制a: 0.0
第 12 筆經過限制a: 0.006715828942402496
第 13 筆經過限制a: 0.0
第 14 筆經過限制a: 0.011608034286430874
第 15 筆經過限制a: 0.0051160018542637025
第 16 筆經過限制a: 0.0
第 17 筆經過限制a: 0.0
第 18 筆經過限制a: 0.0
第 19 筆經過限制a: 0.0008988764044943821
第 20 筆經過限制a: 0.0

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

男人走著走著來到了小木屋前,剛到小木屋時, 男人並沒有進去,只是站在外面,望向了屋內,隨即男子舉起了手,朝著木屋方向,劃了下去,頓時,木屋就燃燒了起來,而在同一時間,屋子內的狐狸衝了出來,伸出利爪,朝男人撲了過去, 男人一個側身閃過,同時狐狸立刻扭身後翻,用後腳踢向男人,男人瞬間朝著後方飛了出去
		--|即便你忘了我,我還是會守護你|--  MS.CM

上一篇
DAY12支持向量機演算法(續一)
下一篇
DAY14支持向量機演算法(續三)
系列文
數據分析方法研究和理解演算法30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言