昨天介绍完SMO算法第四步,今天就要来写这个方法在迭代中的限制,
基本上每次在计算完Ei之後就要看Ei的值有没有超过每单位的y-->所以我们会设定一个可容选误差ei
如果ei太大就要用之前讲的SMO算法去更新ai使得Ei下降
所以程序如下:
#设定容许值
mis=0.001
#因为y为+1和-1
if (y[i]*Ei < -mis) or (y[i]*Ei > mis):
pass
并且设定如果aj和之前变化太小,就不更新
学习率小於等於0也不更新
L=H也不更新
所以程序会写成
if K <= 0:
print("K<=0");
continue
if L==H:
print("L==H")
continue
if (abs(a[0][j] - a_j) < 0.00001):
print("aj变化太小")
continue
最後在设定迭代次数上限(这边设定40),整个程序就会变成:
#合并资料
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
#设定a上界C
C=0.6
#设定容许值
mis=0.001
#设定最大上限
maxIter=40
#迭代次数
iter_num = 0
while (iter_num < maxIter):
#a被优化次数初始化
alphaPairsChanged = 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)
#因为y为+1和-1
if (y[i]*Ei < -mis) or (y[i]*Ei > mis):
#第二步:计算上下界(每个i都要做)
j=select_J(i,len(full_label_data))
#保留旧的ai和aj
a_i = copy.deepcopy(a[0][i])
a_j = copy.deepcopy(a[0][j])
#不同边
if (y[i] != y[j]):
L = max(0, a[0][j] - a[0][i])
H = min(C, C + a[0][j] - a[0][i])
#同边
else:
L = max(0, a[0][j] + a[0][i] - C)
H = min(C, a[0][j] + a[0][i])
# print("第",i+1,"笔H:",H)
# print("第",i+1,"笔L:",L)
#第三步:计算K(学习率)和并算出限制aj
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)
if K <= 0:
print("K<=0");
continue
#算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])
#限制范围L和H
if a[0][j] > H:
a[0][j] = H
elif L > a[0][j]:
a[0][j] = L
if L==H:
print("L==H")
continue
# print("第",i+1,"笔经过限制a:",a[0][j])
if (abs(a[0][j] - a_j) < 0.00001):
print("aj变化太小")
continue
#步骤6:更新ai
a[0][i] += y[j]*y[i]*(a_j - a[0][j])
# print("第",i+1,"个ai:",a[0][i])
#更新b1和b2
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)
#更新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
# print("第",i+1,"个b:",b)
alphaPairsChanged += 1
if (alphaPairsChanged == 0):
iter_num += 1
else:
iter_num = 0
print("迭代次数: %d" % iter_num)
print("最後b:",b)
print("最後a:",a)
最後求出a和b就会长:
最後b: [[-4.00488047]]
最後a: [[0. 0. 0. 0. 0.00710502 0.
0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0.00416361
0. 0.0028869 ]]
好,今天支持SMO算法算出a,b算是完成了,明天就算出w和做绘图
当男人正与狐狸对峙时,男孩还在不断奔跑,跑着跑着,他突然看见一座士兵的雕像,雕像手里拿着狙击枪正瞄准地面上作出射击的动作,男孩在经过时,突然雕像开始往地面射击,男孩吓到趴在地上发抖,终於枪声停了,地面被射出了一个大洞,男孩惊魂未定地站起来,突然男孩听到洞里传来跟之前一样的歌声,男孩在好奇心驱使下,往洞里面看了过去
--|我需要你,这次我不会放手|-- MS.CM
<<: [ Day 14 ] 佳评如潮的 React Hooks
>>: Day14 - Shioaji X Backtesting -回测框架搭配API历史资料
要进入写测试之前呀~我们必须要先了解为什麽要写测试,及我们会说明一种测试的开发方法(TDD) 写测试...
Day1 Setup 前置准备 工欲善其事,必先利其器。 此节会先准备现代开发中不可或缺的一些工具,...
前篇提到Samatha的运作原理与可能使用的AWS服务,今天续提她与Theodore在工作使用系统上...
终於,我们要进入 UX/UI 设计中的最後一个流程- 高精度原型 Hi-Fi Prototype,这...
上一篇完成了缴款纪录的查询,确认缴款纪录是否完成。 为了查询方便,每日批次去抓取前两日资料写入自己的...