2020-05-14

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)化時,我們會選擇字典中鍵最小的wb值擅编。

最后爆阶,我們會設置我們的轉換。我們已經解釋了我們的意圖沙咏,來確保我們檢查了每個可能的向量版本辨图。

下面,我們需要一些匹配數據的起始點肢藐。為此故河,我們打算首先引用我們的訓練數據,來選取一些合適的起始值吆豹。

        # 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],])}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末仁烹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子咧虎,更是在濱河造成了極大的恐慌卓缰,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砰诵,死亡現(xiàn)場離奇詭異征唬,居然都是意外死亡,警方通過查閱死者的電腦和手機茁彭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門总寒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人理肺,你說我怎么就攤上這事摄闸∩屏” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵年枕,是天一觀的道長炫欺。 經常有香客問我,道長熏兄,這世上最難降的妖魔是什么品洛? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮霍弹,結果婚禮上毫别,老公的妹妹穿的比我還像新娘。我一直安慰自己典格,他們只是感情好岛宦,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著耍缴,像睡著了一般砾肺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上防嗡,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天变汪,我揣著相機與錄音,去河邊找鬼蚁趁。 笑死裙盾,一個胖子當著我的面吹牛,可吹牛的內容都是我干的他嫡。 我是一名探鬼主播番官,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼钢属!你這毒婦竟也來了徘熔?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤淆党,失蹤者是張志新(化名)和其女友劉穎酷师,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體染乌,經...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡山孔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了荷憋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片台颠。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖台谊,靈堂內的尸體忽然破棺而出蓉媳,到底是詐尸還是另有隱情譬挚,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布酪呻,位于F島的核電站减宣,受9級特大地震影響,放射性物質發(fā)生泄漏玩荠。R本人自食惡果不足惜漆腌,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望阶冈。 院中可真熱鬧闷尿,春花似錦、人聲如沸女坑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匆骗。三九已至劳景,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碉就,已是汗流浹背盟广。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瓮钥,地道東北人筋量。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像碉熄,于是被迫代替她去往敵國和親桨武。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355