[Stay Sharp]SVM Python實(shí)現(xiàn)

svm代碼實(shí)現(xiàn)

# -*- coding: utf-8 -*-
"""
-------------------------------------------------
   File Name:     svm
   Description :   
   Author :        Tingur
   date:          2018/11/27
   Ref:  https://github.com/Madhu009/Deep-math-machine-learning.ai/blob/master/SVM-FromScratch.ipynb
-------------------------------------------------
"""

import numpy as np
import matplotlib.pyplot as plt
import math

from sklearn.datasets.samples_generator import make_blobs

# step 1: generate data
(X, y) = make_blobs(n_samples=50,
                    n_features=2,
                    centers=2,
                    cluster_std=1.05,
                    random_state=40)
# print(X.shape)
# print(X) #[[  7.12731332  -4.4394424 ] [  6.68873898  -2.44840134]
# print(y) # 1 1 0 1 0 0 1 0 1 0 1 1 0 ...

X1 = np.c_[np.ones((X.shape[0])), X]
# print(X1)

# display data
# plt.scatter(X1[:,1], X1[:,2],marker='o', c=y)
# plt.axis([-5,10,-12,-1])
# plt.show()

# step 2: cluster the data
# for svm, we set the data cluster value to -1 and 1
positive_data = list()
negative_data = list()
for i, v in enumerate(y):
    if v == 0:
        negative_data.append(X[i])
    else:
        positive_data.append(X[i])

data_dict = {1: np.array(positive_data), -1: np.array(negative_data)}
print(data_dict)

# step 3: svm training

w = []  # weights 2 dimesional vector
b = []  # bias
max_feature_value = float('-inf')
min_feature_value = float('+inf')

for yi in data_dict:
    if np.amax(data_dict[yi]) > max_feature_value:
        max_feature_value = np.amax(data_dict[yi])

    if np.amin(data_dict[yi]) < min_feature_value:
        min_feature_value = np.amin(data_dict[yi])

print(max_feature_value, min_feature_value)
learning_rates = [max_feature_value * 0.1,
                  max_feature_value * 0.01,
                  max_feature_value * 0.001]


def svm_training(data_dict):
    i = 1
    global w
    global b

    length_w_vector = {}
    transforms = [[1, 1], [-1, 1], [-1, -1], [1, -1]]
    b_step_size = 2
    b_multiple = 5
    w_optimum = max_feature_value * 0.5

    for rate in learning_rates:
        w = np.array([w_optimum, w_optimum])
        optimized = False

        while not optimized:
            for b in np.arange(-1 * (max_feature_value * b_step_size), max_feature_value * b_step_size,
                               rate * b_multiple):
                for transformation in transforms:
                    w_t = w * transformation
                    correctly_classified = True

                    for yi in data_dict:
                        for xi in data_dict[yi]:
                            if yi * (np.dot(w_t, xi) + b) < 1:
                                correctly_classified = False

                    if correctly_classified:
                        length_w_vector[np.linalg.norm(w_t)] = [w_t, b]
            if w[0] < 0:
                optimized = True
            else:
                w = w - rate

        norms = sorted([n for n in length_w_vector])

        minimum_w_length = length_w_vector[norms[0]]
        w = minimum_w_length[0]
        b = minimum_w_length[1]

        w_optimum = w[0] + rate * 2

svm_training(data_dict)

print("w: ", w)
print("b: ", b)

# step 4: plot the svm result
colors = {1:'r',-1:'b'}
fig = plt.figure()
ax = fig.add_subplot(1,1,1)

def visualize(data_dict):
    # [[ax.scatter(x[0],x[1],s=100,color=colors[i]) for x in data_dict[i]] for i in data_dict]

    plt.scatter(X1[:, 1], X1[:, 2], marker='o', c=y)

    # hyperplane = x.w+b
    # v = x.w+b
    # psv = 1
    # nsv = -1
    # dec = 0
    def hyperplane_value(x, w, b, v):
        return (-w[0] * x - b + v) / w[1]

    datarange = (min_feature_value * 0.9, max_feature_value * 1.)
    hyp_x_min = datarange[0]
    hyp_x_max = datarange[1]

    # (w.x+b) = 1
    # positive support vector hyperplane
    psv1 = hyperplane_value(hyp_x_min, w, b, 1)
    psv2 = hyperplane_value(hyp_x_max, w, b, 1)
    ax.plot([hyp_x_min, hyp_x_max], [psv1, psv2], 'k')

    # (w.x+b) = -1
    # negative support vector hyperplane
    nsv1 = hyperplane_value(hyp_x_min, w, b, -1)
    nsv2 = hyperplane_value(hyp_x_max, w, b, -1)
    ax.plot([hyp_x_min, hyp_x_max], [nsv1, nsv2], 'k')

    # (w.x+b) = 0
    # positive support vector hyperplane
    db1 = hyperplane_value(hyp_x_min, w, b, 0)
    db2 = hyperplane_value(hyp_x_max, w, b, 0)
    ax.plot([hyp_x_min, hyp_x_max], [db1, db2], 'y--')

    plt.axis([-5, 10, -12, -1])
    plt.show()

visualize(data_dict)

源碼地址

Yalye Github
原始代碼地址

效果

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末猜旬,一起剝皮案震驚了整個(gè)濱河市梢为,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌佩耳,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淹辞,死亡現(xiàn)場離奇詭異渠旁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)嘉汰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來状勤,“玉大人鞋怀,你說我怎么就攤上這事〕炙眩” “怎么了密似?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長葫盼。 經(jīng)常有香客問我残腌,道長,這世上最難降的妖魔是什么剪返? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任废累,我火速辦了婚禮邓梅,結(jié)果婚禮上脱盲,老公的妹妹穿的比我還像新娘。我一直安慰自己日缨,他們只是感情好钱反,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著匣距,像睡著了一般面哥。 火紅的嫁衣襯著肌膚如雪毅待。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天尸红,我揣著相機(jī)與錄音,去河邊找鬼外里。 笑死怎爵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的盅蝗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼墩莫,長吁一口氣:“原來是場噩夢啊……” “哼逞敷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起灌侣,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤兰粉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后顶瞳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡慨菱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了闪彼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片协饲。...
    茶點(diǎn)故事閱讀 40,001評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖茉稠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情而线,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布嘹狞,位于F島的核電站,受9級特大地震影響磅网,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜涧偷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一速蕊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧规哲,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泛啸。三九已至秃症,卻和暖如春候址,著一層夾襖步出監(jiān)牢的瞬間种柑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工聚请, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人炸卑。 一個(gè)月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓煤傍,卻偏偏與公主長得像盖文,于是被迫代替她去往敵國和親患久。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1、如何定義自卑及對策 自卑情節(jié)人人都有桐玻,程度不同而已,只在如何面對自卑镊靴。我的建議是利用好自卑,一步一步奮斗并超越...
    簡一慕閱讀 226評論 0 1
  • 從加入007寫作開始狀態(tài)并不好煮落,基本延續(xù)了之前的模式踊谋,有時(shí)候狀態(tài)好蝉仇,有時(shí)候狀態(tài)差,狀態(tài)好的時(shí)候能花時(shí)間來寫點(diǎn)東西轿衔,...
    一人白閱讀 210評論 0 0
  • 唐人街探案2,是一部夾雜著動作鞭呕、搞笑、驚悚葫松、懸疑、黑白二道进宝、高科技、偵探党晋、美國元素的中國風(fēng)大片徐块。 很佩服編劇的劇情...
    剎那流轉(zhuǎn)閱讀 175評論 0 5
  • 練習(xí)步驟: 1. 觀察:發(fā)生了什么事情? 打卡活動結(jié)束快一周了胡控,我依然沒有寫活動總結(jié)。 2. 上述觀察引發(fā)的感受昼激。...
    張露deer閱讀 102評論 0 0