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

<<:  【Day 25】JavaScript ajax

>>:  从零开始的8-bit迷宫探险【Level 17】稻草人也想要智慧大脑,给怪物一点灵魂跟一点点个性

Day23:交给专业的来

我们来看看Executor介面的内容: package java.util.concurrent; ...

[DAY 23]纠团通知功能(3/3)

纠团的功能我把它切成两个部分 使用者输入讯息 背景执行 今天介绍背景执行的部分 背景执行 这个部分主...

[ Day 8 ] - 回圈

回圈 想要重复做一件事,会依据条件而有不同的执行次数 for 回圈 写法如下 for (let i ...

Day 16 - 设定 PBR

我们今天要来设定 PBR,我们以 Juniper MX 为例 首先,我们要先决定一个 routing...

载入页面,什麽时候发 API 适合?

我们想要找一个适合的地方送出 $store.dispatch('fetchUser', 1); 今天...