昨天介紹完SMO並算出a,b,今天就要來算出w和標記在圖上,
依照w的公式,我們可以得到下面程式:
y=np.array(y)
a=np.array(a)
full_label_data_x=np.array(full_label_data_x)
w = np.dot((np.tile(y.reshape(1, -1).T, (1, 2)) * full_label_data_x).T, a.T)
所以w結果如下
[[ 0.07407407]
[-0.07393454]]
這樣子就算出斜率,接下來我們開始繪圖:首先幫大家複習一下繪圖:
import matplotlib.pyplot as plt
import numpy as np
import copy
#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()
好,現在依據剛剛求得W-->我們程式如下:
#設置直線最大和最小x座標
x1 = max(full_label_data_x[:,0])
x2 = min(full_label_data_x[:,0])
#使用斜率
a1, a2 = w
b = float(b)
a1 = float(a1[0])
a2 = float(a2[0])
#算出對應X值的y值
y1, y2 = (-b- a1*x1)/a2, (-b - a1*x2)/a2
#劃出那條線
plt.plot([x1, x2], [y1, y2])
這樣子分割線就畫完了
接下來要找出支持向量機的分割點:
程式如下:
for i in range(len(a[0])):
#找尋ai大於0的點
if abs(a[0][i]) > 0:
x, y = full_label_data_x[i]
#把它標示出來
plt.scatter([x], [y], s=150, c='none', alpha=0.7, linewidth=1.5, edgecolor='red')
結果為:
好,今天支持向量算法算是完成了,明天就開始研究分類和聚類方法
洞裡面是一隻娃娃,跟剛剛桌上娃娃基本上款式一模一樣,不同的是,這個有嘴巴,只是與其說是嘴巴,不如說是被刀子劃了一橫,看起來就像是嘴巴,男孩伸手慢慢地拿起了這個娃娃仔細端詳,突然娃娃像是有意識一樣,坐在男孩的肩膀上,並緩緩收起手,指著遠處冒火的地方,那正是燃燒中的小木屋
--|去吧,我是一直如此地相信你|-- MS.CM