昨天介紹完SMO算法第三步,今天就要來寫這個方法第四步,
昨天我們得到aj,接下來要使用aj來更新ai
第四步: 更新ai和b
(更新b1和b2)
再利用b1和b2更新b
只要算出a和b就可以帶回
就可以算出分割線
所以程式如下:
首先:
#保留舊的ai和aj
a_i = copy.deepcopy(a[0][i])
a_j = copy.deepcopy(a[0][j])
然後更新ai
a[0][i] += y[j]*y[i]*(a_j - a[0][j])
print("第",i+1,"個ai:",a[0][i])
結果如下:
第 1 個ai: 0.0004316857327865314
第 2 個ai: 0.0
第 3 個ai: 0.00012976182870841016
第 4 個ai: 0.0
第 5 個ai: 0.0
第 6 個ai: 0.0
第 7 個ai: 0.0
第 8 個ai: 0.0
第 9 個ai: 0.0
第 10 個ai: 0.0
第 11 個ai: 0.0
第 12 個ai: 8.424245746413649e-05
第 13 個ai: 0.0
第 14 個ai: 0.00037026095235359607
第 15 個ai: 0.0
第 16 個ai: 0.0
第 17 個ai: 0.0
第 18 個ai: 0.0004316857327865314
第 19 個ai: 0.0
第 20 個ai: 0.0005000227810620062
接下來更新b1和b2來算出b
程式如下:
b1 = b - Ei- y[i]*(a[0][i]-a_i)*full_label_data_x[i,:]*full_label_data_x[i,:].T - y[j]*(a[0][j]-a_j)*full_label_data_x[i,:]*full_label_data_x[j,:].T
b2 = b - Ej- y[i]*(a[0][i]-a_i)*full_label_data_x[i,:]*full_label_data_x[j,:].T - y[j]*(a[0][j]-a_j)*full_label_data_x[j,:]*full_label_data_x[j,:].T
print("第",i+1,"個b1:",b1)
print("第",i+1,"個b2:",b2)
結果如下:
第 1 個b1: [[1.]]
第 1 個b2: [[1.]]
第 2 個b1: [[1.]]
第 2 個b2: [[1.]]
第 3 個b1: [[-1.00838574]]
第 3 個b2: [[-1.00838574]]
第 4 個b1: [[-1.6918239]]
第 4 個b2: [[-1.0754717]]
第 5 個b1: [[-0.00628931]]
第 5 個b2: [[-1.47798742]]
第 6 個b1: [[-1.42767296]]
第 6 個b2: [[-1.6918239]]
第 7 個b1: [[-1.44863732]]
第 7 個b2: [[-1.47798742]]
第 8 個b1: [[-1.50314465]]
第 8 個b2: [[-1.0754717]]
第 9 個b1: [[-1.37797208]]
第 9 個b2: [[-1.37797208]]
第 10 個b1: [[-1.21495321]]
第 10 個b2: [[-1.50686302]]
第 11 個b1: [[-2.54204735]]
第 11 個b2: [[-2.54204735]]
第 12 個b1: [[-2.35083904]]
第 12 個b2: [[-1.86381791]]
第 13 個b1: [[-1.97834905]]
第 13 個b2: [[-1.86381791]]
第 14 個b1: [[-2.56397375]]
第 14 個b2: [[-1.63621178]]
第 15 個b1: [[-1.10197473]]
第 15 個b2: [[-1.86137684]]
第 16 個b1: [[-2.42958329]]
第 16 個b2: [[-2.42958329]]
第 17 個b1: [[-1.95617818]]
第 17 個b2: [[-1.71874257]]
第 18 個b1: [[-1.32858274]]
第 18 個b2: [[-2.74969293]]
第 19 個b1: [[-1.71874257]]
第 19 個b2: [[-2.5955026]]
第 20 個b1: [[-5.25369212]]
第 20 個b2: [[-5.25369212]]
最後利用限制範圍就可以算出誤差b
程式如下:
#更新b,C為之前所說上界-->那時候帶入為0.6
if (0 < a[0][i]) and (C > a[0][i]):
b = b1
elif (0 < a[0][j]) and (C > a[0][j]):
b = b2
else:
b = (b1 + b2)/2
結果如下:
第 1 個b: [[-1.79865772]]
第 2 個b: [[-1.84697987]]
第 3 個b: [[-2.4604409]]
第 4 個b: [[-2.71749958]]
第 5 個b: [[-1.77429244]]
第 6 個b: [[-3.02793887]]
第 7 個b: [[-3.21142206]]
第 8 個b: [[-2.34219118]]
第 9 個b: [[-3.21351504]]
第 10 個b: [[-2.29521131]]
第 11 個b: [[-2.51540433]]
第 12 個b: [[-1.87184751]]
第 13 個b: [[-2.26508294]]
第 14 個b: [[-3.24817907]]
第 15 個b: [[-2.23019153]]
第 16 個b: [[-2.2969842]]
第 17 個b: [[-2.16926286]]
第 18 個b: [[-2.16926286]]
第 19 個b: [[-2.35918226]]
第 20 個b: [[-2.55068351]]
好,今天支持SMO算法第四步算是完成了,明天就開始寫真正再迭代可能會遇到甚麼情況
狐狸不敢大意,小心翼翼地往前查看,發現男子消失不見了,狐狸立刻警覺的看著四周,突然從土裡伸出一隻紅色手抓住了狐狸的尾巴,剎那間,狐狸的尾巴燒了起來,狐狸立刻在地上翻滾了起來,企圖把火焰熄滅,男子趁機破土而出,並從口袋裡拿出了一把刀,往狐狸的方向衝過去
--|這是獻祭給他的禮物,希望你會喜歡|-- CS.MM