import matplotlib.pyplot as plt
from matplotlib import style
import numpy as np
style.use('ggplot')
class Support_Vector_Machine:
def __init__(self, visualization=True):
self.visualization = visualization
self.colors = {1:'r',-1:'b'}
if self.visualization:
self.fig = plt.figure()
self.ax = self.fig.add_subplot(1,1,1)
# train
def fit(self, data):
pass
def predict(self,features):
# sign( x.w+b )
classification = np.sign(np.dot(np.array(features),self.w)+self.b)
return classification
data_dict = {-1:np.array([[1,7],
[2,8],
[3,8],]),
1:np.array([[5,1],
[6,-1],
[7,3],])}
我們開始填充fit
方法:
def fit(self, data):
self.data = data
# { ||w||: [w,b] }
opt_dict = {}
transforms = [[1,1],
[-1,1],
[-1,-1],
[1,-1]]
要注意這個方法首先傳遞self
(記住這是方法的約定)呜舒,之后傳遞data
朋譬。data
就是我們我們打算訓練或者優(yōu)化的數據休蟹。我們這里棍苹,它是data_dict
无宿,我們已經創(chuàng)建好了。
我們將self.data
設為該數據∈嗬铮現(xiàn)在孽鸡,我們可以在類中的任何地方引用這個訓練數據了(但是,我們需要首先使用數據來調用這個訓練方法栏豺,來避免錯誤)彬碱。
下面,我們開始構建最優(yōu)化字典opt_dict
奥洼,它包含任何最優(yōu)化的值巷疼。隨著我們減小我們的w
向量,我們會使用約束函數來測試向量灵奖,如果存在的話嚼沿,尋找最大的滿足方程的b
,之后將所有數據儲存在我們的最華友字典中瓷患。字典是{ ||w|| : [w,b] }
骡尽。當我們完成所有優(yōu)化時,我們會選擇字典中鍵最小的w
和b
值擅编。
最后爆阶,我們會設置我們的轉換。我們已經解釋了我們的意圖沙咏,來確保我們檢查了每個可能的向量版本辨图。
下面,我們需要一些匹配數據的起始點肢藐。為此故河,我們打算首先引用我們的訓練數據,來選取一些合適的起始值吆豹。
# finding values to work with for our ranges.
all_data = []
for yi in self.data:
for featureset in self.data[yi]:
for feature in featureset:
all_data.append(feature)
self.max_feature_value = max(all_data)
self.min_feature_value = min(all_data)
# no need to keep this memory.
all_data=None
我們所做的就是遍歷所有數據鱼的,尋找最大值和最小值±砼瑁現(xiàn)在我們打算定義我們的步長。
step_sizes = [self.max_feature_value * 0.1,
self.max_feature_value * 0.01,
# starts getting very high cost after this.
self.max_feature_value * 0.001]
這里我們設置了一些大小的步長凑阶,我們打算這樣執(zhí)行猿规。對于我們的第一遍,我們會采取大跨步(10%)宙橱。一旦我們使用這些步長找到了最小值姨俩,我們就將步長降至 1% 來調優(yōu)。我們會繼續(xù)下降师郑,取決于你想要多么精確环葵。我會在這個項目的末尾討論,如何在程序中判斷是否應該繼續(xù)優(yōu)化宝冕。
下面张遭,我們打算設置一些變量,來幫助我們給b
生成步長(用于生成比w
更大的步長地梨,因為我們更在意w
的精確度)菊卷,并跟蹤最后一個最優(yōu)值。
# extremely expensive
b_range_multiple = 5
b_multiple = 5
latest_optimum = self.max_feature_value*10
現(xiàn)在我們開始了:
for step in step_sizes:
w = np.array([latest_optimum,latest_optimum])
# we can do this because convex
optimized = False
while not optimized:
pass
這里的思想就是沿著向量下降宝剖。開始洁闰,我們將optimized
設為False
,并為我們會在每個主要步驟重置它诈闺。optimized
變量再我們檢查所有步驟和凸形狀(我們的碗)的底部之后渴庆,會設為True
铃芦。
我們下個教程中會繼續(xù)實現(xiàn)這個邏輯雅镊,那里我們會實際使用約束問題來檢查值,檢查我們是否找到了可以保存的值刃滓。
目前為止的代碼:
import matplotlib.pyplot as plt
from matplotlib import style
import numpy as np
style.use('ggplot')
class Support_Vector_Machine:
def __init__(self, visualization=True):
self.visualization = visualization
self.colors = {1:'r',-1:'b'}
if self.visualization:
self.fig = plt.figure()
self.ax = self.fig.add_subplot(1,1,1)
# train
def fit(self, data):
self.data = data
# { ||w||: [w,b] }
opt_dict = {}
transforms = [[1,1],
[-1,1],
[-1,-1],
[1,-1]]
all_data = []
for yi in self.data:
for featureset in self.data[yi]:
for feature in featureset:
all_data.append(feature)
self.max_feature_value = max(all_data)
self.min_feature_value = min(all_data)
all_data = None
step_sizes = [self.max_feature_value * 0.1,
self.max_feature_value * 0.01,
# point of expense:
self.max_feature_value * 0.001,]
# extremely expensive
b_range_multiple = 5
#
b_multiple = 5
latest_optimum = self.max_feature_value*10
for step in step_sizes:
w = np.array([latest_optimum,latest_optimum])
# we can do this because convex
optimized = False
while not optimized:
pass
def predict(self,features):
# sign( x.w+b )
classification = np.sign(np.dot(np.array(features),self.w)+self.b)
return classification
data_dict = {-1:np.array([[1,7],
[2,8],
[3,8],]),
1:np.array([[5,1],
[6,-1],
[7,3],])}