Pytorch實(shí)現(xiàn)SVM二分類

很簡(jiǎn)單的一個(gè)模型弟疆,參照github上的代碼做的,分類效果并不是很好

from __future__ import print_function
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt
import torch.optim as optim

import time
%matplotlib inline
from IPython import display

input_size = 2
output_size = 1
learning_rate = 0.00001
def load_data(filename):
    with open(filename, 'r') as f:
        data=[]
        line=f.readline()
        for line in f:
            line=line.strip().split()
            x1=float(line[0])
            x2=float(line[1])
            t=int(line[2])
            data.append([x1,x2,t])
        return np.array(data)

train_file = 'data/train_linear.txt'
test_file = 'data/test_linear.txt'
data_train = load_data(train_file)  # 數(shù)據(jù)格式[x1, x2, t]
data_test = load_data(test_file)
print(type(data_train))
print(data_train.shape)
print(data_test.shape)

<class 'numpy.ndarray'>
(200, 3)
(200, 3)
class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.linear = nn.Linear(input_size, output_size) # One in and one out

    def forward(self, x):
        y_pred = self.linear(x)
        return y_pred

x_train=data_train[:,:2]
y_train=data_train[:,2:3]
X = torch.FloatTensor(x_train)
Y = torch.FloatTensor(y_train)

X = (X - X.mean()) / X.std()
Y[np.where(Y == 0)] = -1

N = len(Y)
model=Model()
optimizer = optim.SGD(model.parameters(), lr=0.01)
model.train()
for epoch in range(50):
    perm = torch.randperm(N)
    sum_loss = 0
    for i in range(0, N):
        x = X[perm[i : i + 1]]
        y = Y[perm[i : i + 1]]

        optimizer.zero_grad()
        output = model(x)

        loss = torch.mean(torch.clamp(1 - output.t() * y, min=0))  # hinge loss
        loss += 0.01 * torch.mean(model.linear.weight ** 2)  # l2 penalty
        loss.backward()
        optimizer.step()

        sum_loss += loss.data.cpu().numpy()

    print("Epoch:{:4d}\tloss:{}".format(epoch, sum_loss / N))
Epoch:   0  loss:0.3788770362269133
Epoch:   1  loss:0.18692774163559078
Epoch:   2  loss:0.16527784419246017
Epoch:   3  loss:0.1560688596777618
Epoch:   4  loss:0.15181147237773984
Epoch:   5  loss:0.14811894194222985
Epoch:   6  loss:0.14536839919630437
Epoch:   7  loss:0.14435229473747313
Epoch:   8  loss:0.14317100788466633
Epoch:   9  loss:0.14245451985858382
Epoch:  10  loss:0.14157551057636739
Epoch:  11  loss:0.14109212066046894
Epoch:  12  loss:0.1407695705164224
Epoch:  13  loss:0.1400472893193364
Epoch:  14  loss:0.13964955242350696
Epoch:  15  loss:0.1392783078365028
Epoch:  16  loss:0.138907381426543
Epoch:  17  loss:0.1387982941698283
Epoch:  18  loss:0.13861130747012795
Epoch:  19  loss:0.13863415602594614
Epoch:  20  loss:0.13828472116030752
Epoch:  21  loss:0.13822870085015893
Epoch:  22  loss:0.13854863058775663
Epoch:  23  loss:0.1381820786278695
Epoch:  24  loss:0.13801106195896864
Epoch:  25  loss:0.13826215670444073
Epoch:  26  loss:0.13842669501900673
Epoch:  27  loss:0.13817614743486048
Epoch:  28  loss:0.1382398795802146
Epoch:  29  loss:0.13823835723102093
Epoch:  30  loss:0.1382795405294746
Epoch:  31  loss:0.1377215893007815
Epoch:  32  loss:0.13821476998738944
Epoch:  33  loss:0.13820640606805681
Epoch:  34  loss:0.13815249134786428
Epoch:  35  loss:0.13808728583157062
Epoch:  36  loss:0.1381826154794544
Epoch:  37  loss:0.138189296182245
Epoch:  38  loss:0.13807438237592579
Epoch:  39  loss:0.13820569985546172
Epoch:  40  loss:0.13821616280823945
Epoch:  41  loss:0.13809766220860184
Epoch:  42  loss:0.13808201501145959
Epoch:  43  loss:0.138220365839079
Epoch:  44  loss:0.13818617248907686
Epoch:  45  loss:0.13783584020100534
Epoch:  46  loss:0.13833872705698014
Epoch:  47  loss:0.13807488267309964
Epoch:  48  loss:0.13824151220731437
Epoch:  49  loss:0.13813724058680235
W = model.linear.weight[0].data.cpu().numpy()
b = model.linear.bias[0].data.cpu().numpy()
print(W,b)
delta = 0.01
x = np.arange(X[:, 0].min(), X[:, 0].max(), delta)
y = np.arange(X[:, 1].min(), X[:, 1].max(), delta)
x, y = np.meshgrid(x, y)
xy = list(map(np.ravel, [x, y]))
print(xy)
z = (W.dot(xy) + b).reshape(x.shape)
z[np.where(z > 1.)] = 4
z[np.where((z > 0.) & (z <= 1.))] = 3
z[np.where((z > -1.) & (z <= 0.))] = 2
z[np.where(z <= -1.)] = 1

plt.xlim([X[:, 0].min() + delta, X[:, 0].max() - delta])
plt.ylim([X[:, 1].min() + delta, X[:, 1].max() - delta])
plt.contourf(x, y, z, alpha=0.8, cmap="Greys")
plt.scatter(x=X[:, 0], y=X[:, 1], c="black", s=10)
plt.tight_layout()
plt.show()
[ 1.7399527 -1.2409829] 1.0133485
[array([-2.75684214, -2.74684215, -2.73684216, ...,  1.66315365,
        1.67315364,  1.68315363]), array([-1.42996836, -1.42996836, -1.42996836, ...,  2.42002797,
        2.42002797,  2.42002797])]
output_5_1.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末田藐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子吱七,更是在濱河造成了極大的恐慌汽久,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件踊餐,死亡現(xiàn)場(chǎng)離奇詭異景醇,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)吝岭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門三痰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人窜管,你說我怎么就攤上這事散劫。” “怎么了幕帆?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵获搏,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我失乾,道長(zhǎng)常熙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任仗扬,我火速辦了婚禮症概,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘早芭。我一直安慰自己彼城,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布退个。 她就那樣靜靜地躺著募壕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪语盈。 梳的紋絲不亂的頭發(fā)上舱馅,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音刀荒,去河邊找鬼代嗤。 笑死棘钞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的干毅。 我是一名探鬼主播宜猜,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼硝逢!你這毒婦竟也來了姨拥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤渠鸽,失蹤者是張志新(化名)和其女友劉穎叫乌,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體徽缚,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡憨奸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了猎拨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膀藐。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡屠阻,死狀恐怖红省,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情国觉,我是刑警寧澤吧恃,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站麻诀,受9級(jí)特大地震影響痕寓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蝇闭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一呻率、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧呻引,春花似錦礼仗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至童谒,卻和暖如春单旁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背饥伊。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工象浑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蔫饰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓愉豺,卻偏偏與公主長(zhǎng)得像死嗦,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子粒氧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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

  • 雨垂直飄落拔弄起大地這架大鋼琴琴鍵聲響起驚醒沉睡的風(fēng)風(fēng)看著雨獨(dú)自享樂玩心頓起托起樹葉和花瓣凌亂了雨的節(jié)奏我在江畔漫...
    天元_ae03閱讀 2,623評(píng)論 56 64
  • 10月17日越除,周三,晴外盯。今晚國(guó)一作業(yè)寫的還行摘盆,除了因?yàn)樽植缓米屗貙懙模坏桨它c(diǎn)就完成了饱苟。我們倆一起分析了一會(huì)語文...
    國(guó)一媽媽閱讀 163評(píng)論 0 0
  • 職場(chǎng)從來不是脈脈溫情的地方孩擂,講究的是效率與產(chǎn)出,這是二度回歸職場(chǎng)才撞到的南墻箱熬。而不久前类垦,我還是那個(gè)視年長(zhǎng)的老板作父...
    春宴歸閱讀 164評(píng)論 0 0
  • 1奶茶總跟我說,偶像和粉絲最好的距離城须,就是臺(tái)上與臺(tái)下的距離蚤认。但我偏不信,我跟她說糕伐,總有一天我會(huì)見到我偶像砰琢。“行行行...
    北不應(yīng)閱讀 411評(píng)論 0 0
  • 數(shù)據(jù)集中第一人良瞧,互聯(lián)時(shí)代亦先身陪汽。金融科技能無我?虛位如今待鳳麟褥蚯!
    軒若臨風(fēng)閱讀 392評(píng)論 1 1