DAY15支持向量机演算法(续四)

昨天介绍完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历史资料

【Day11】测试方法、Jest、Ezyme的介绍(•‿•)

要进入写测试之前呀~我们必须要先了解为什麽要写测试,及我们会说明一种测试的开发方法(TDD) 写测试...

[Day1] Vite 出小蜜蜂~前置准备 + 用程序画 Pixel Art!

Day1 Setup 前置准备 工欲善其事,必先利其器。 此节会先准备现代开发中不可或缺的一些工具,...

Day 15:AWS是什麽?30天从动漫/影视作品看AWS服务应用 -《云端情人》part 2

前篇提到Samatha的运作原理与可能使用的AWS服务,今天续提她与Theodore在工作使用系统上...

Day 28. Hi-Fi Prototype-以 Figma 制作高精度原型 (上)

终於,我们要进入 UX/UI 设计中的最後一个流程- 高精度原型 Hi-Fi Prototype,这...

[day26]批次实作-缴款纪录收档

上一篇完成了缴款纪录的查询,确认缴款纪录是否完成。 为了查询方便,每日批次去抓取前两日资料写入自己的...