機(jī)器學(xué)習(xí)--SVM算法實(shí)現(xiàn)

一. 使用sklearn中的數(shù)據(jù)集做案例

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
# 使用seaborn繪制默認(rèn)值
import seaborn as sns; sns.set()

#隨機(jī)來點(diǎn)數(shù)據(jù)
from sklearn.datasets.samples_generator import make_blobs
X, y = make_blobs(n_samples=50, centers=2,
                  random_state=0, cluster_std=0.60)
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='autumn')

隨便的畫幾條分割線翠桦,看看哪個(gè)好滓侍?

xfit = np.linspace(-1, 3.5)
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='autumn')
plt.plot([0.6], [2.1], 'x', color='red', markeredgewidth=2, markersize=10)

for m, b in [(1, 0.65), (0.5, 1.6), (-0.2, 2.9)]:
    plt.plot(xfit, m * xfit + b, '-k')

plt.xlim(-1, 3.5);

再進(jìn)一步觀察決策邊界的面積, 畫出陰影

xfit = np.linspace(-1, 3.5)
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='autumn')

for m, b, d in [(1, 0.65, 0.33), (0.5, 1.6, 0.55), (-0.2, 2.9, 0.2)]:
    yfit = m * xfit + b
    plt.plot(xfit, yfit, '-k')
    plt.fill_between(xfit, yfit - d, yfit + d, edgecolor='none',
                     color='#AAAAAA', alpha=0.4)

plt.xlim(-1, 3.5);

二. 訓(xùn)練SVM

from sklearn.svm import SVC # "Support vector classifier"
model = SVC(kernel='linear')
model.fit(X, y)
#繪圖函數(shù)
def plot_svc_decision_function(model, ax=None, plot_support=True):
    """繪制二維SVC的決策函數(shù)"""
    if ax is None:
        ax = plt.gca()
    xlim = ax.get_xlim()
    ylim = ax.get_ylim()
    
    # 創(chuàng)建網(wǎng)格來評(píng)估模型
    x = np.linspace(xlim[0], xlim[1], 30)
    y = np.linspace(ylim[0], ylim[1], 30)
    Y, X = np.meshgrid(y, x)
    xy = np.vstack([X.ravel(), Y.ravel()]).T
    P = model.decision_function(xy).reshape(X.shape)
    
    # 繪制決策邊界和小區(qū)域
    ax.contour(X, Y, P, colors='k',
               levels=[-1, 0, 1], alpha=0.5,
               linestyles=['--', '-', '--'])
    
    # 繪制支持向量
    if plot_support:
        ax.scatter(model.support_vectors_[:, 0],
                   model.support_vectors_[:, 1],
                   s=300, linewidth=1, facecolors='none');
    ax.set_xlim(xlim)
    ax.set_ylim(ylim)

plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='autumn')
plot_svc_decision_function(model)
  • 這條線就是我們希望得到的決策邊界啦

  • 觀察發(fā)現(xiàn)有3個(gè)點(diǎn)做了特殊的標(biāo)記蹋盆,它們恰好都是邊界上的點(diǎn)

  • 它們就是我們的support vectors(支持向量)

  • 在Scikit-Learn中, 它們存儲(chǔ)在這個(gè)位置 support_vectors_(一個(gè)屬性)

model.support_vectors_
  • 觀察可以發(fā)現(xiàn),只需要支持向量我們就可以把模型構(gòu)建出來

三. 接下來我們嘗試一下,用不同多的數(shù)據(jù)點(diǎn)弧呐,看看效果會(huì)不會(huì)發(fā)生變化,分別使用60個(gè)和120個(gè)數(shù)據(jù)點(diǎn)

def plot_svm(N=10, ax=None):
    X, y = make_blobs(n_samples=200, centers=2,
                      random_state=0, cluster_std=0.60)
    X = X[:N]
    y = y[:N]
    model = SVC(kernel='linear', C=1E10)
    model.fit(X, y)
    
    ax = ax or plt.gca()
    ax.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='autumn')
    ax.set_xlim(-1, 4)
    ax.set_ylim(-1, 6)
    plot_svc_decision_function(model, ax)

fig, ax = plt.subplots(1, 2, figsize=(16, 6))
fig.subplots_adjust(left=0.0625, right=0.95, wspace=0.1)
for axi, N in zip(ax, [60, 120]):
    plot_svm(N, axi)
    axi.set_title('N = {0}'.format(N))


觀察發(fā)現(xiàn)管引,只要支持向量沒變士败,其他的數(shù)據(jù)怎么加無所謂!

四. 引入核函數(shù)的SVM

首先我們先用線性的核來看一下在下面這樣比較難的數(shù)據(jù)集上還能分了嗎褥伴?

from sklearn.datasets.samples_generator import make_circles
X, y = make_circles(100, factor=.1, noise=.1)

clf = SVC(kernel='linear').fit(X, y)

plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='autumn')
plot_svc_decision_function(clf, plot_support=False)


顯然不行, 那接下來試試高維的核變換
我們可以先用一個(gè)三維圖來表示這個(gè)額外的數(shù)據(jù)維度:

#加入了新的維度r
from mpl_toolkits import mplot3d
r = np.exp(-(X ** 2).sum(1))
def plot_3D(elev=30, azim=30, X=X, y=y):
    ax = plt.subplot(projection='3d')
    ax.scatter3D(X[:, 0], X[:, 1], r, c=y, s=50, cmap='autumn')
    ax.view_init(elev=elev, azim=azim)
    ax.set_xlabel('x')
    ax.set_ylabel('y')
    ax.set_zlabel('r')

plot_3D(elev=45, azim=45, X=X, y=y)
#加入徑向基函數(shù)
clf = SVC(kernel='rbf', C=1E6)
clf.fit(X, y)
#再看結(jié)果
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='autumn')
plot_svc_decision_function(clf)
plt.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1],
            s=300, lw=1, facecolors='none');


使用這種核支持向量機(jī)谅将,我們學(xué)習(xí)一個(gè)合適的非線性決策邊界。這種核變換策略在機(jī)器學(xué)習(xí)中經(jīng)常被使用重慢!

五. 調(diào)節(jié)SVM參數(shù): Soft Margin問題

調(diào)節(jié)C參數(shù)

  • 當(dāng)C趨近于無窮大時(shí):意味著分類嚴(yán)格不能有錯(cuò)誤
  • 當(dāng)C趨近于很小的時(shí):意味著可以有更大的錯(cuò)誤容忍
X, y = make_blobs(n_samples=100, centers=2,
                  random_state=0, cluster_std=0.8)
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='autumn');
X, y = make_blobs(n_samples=100, centers=2,
                  random_state=0, cluster_std=0.8)

fig, ax = plt.subplots(1, 2, figsize=(16, 6))
fig.subplots_adjust(left=0.0625, right=0.95, wspace=0.1)

for axi, C in zip(ax, [10.0, 0.1]):
    model = SVC(kernel='linear', C=C).fit(X, y)
    axi.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='autumn')
    plot_svc_decision_function(model, axi)
    axi.scatter(model.support_vectors_[:, 0],
                model.support_vectors_[:, 1],
                s=300, lw=1, facecolors='none');
    axi.set_title('C = {0:.1f}'.format(C), size=14)
調(diào)節(jié)C參數(shù)對(duì)比
X, y = make_blobs(n_samples=100, centers=2,
                  random_state=0, cluster_std=1.1)

fig, ax = plt.subplots(1, 2, figsize=(16, 6))
fig.subplots_adjust(left=0.0625, right=0.95, wspace=0.1)

for axi, gamma in zip(ax, [10.0, 0.1]):
    model = SVC(kernel='rbf', gamma=gamma).fit(X, y)
    axi.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='autumn')
    plot_svc_decision_function(model, axi)
    axi.scatter(model.support_vectors_[:, 0],
                model.support_vectors_[:, 1],
                s=300, lw=1, facecolors='none');
    axi.set_title('gamma = {0:.1f}'.format(gamma), size=14)
調(diào)節(jié)gamma參數(shù)對(duì)比
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末饥臂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子似踱,更是在濱河造成了極大的恐慌隅熙,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件核芽,死亡現(xiàn)場(chǎng)離奇詭異囚戚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)轧简,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門驰坊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人哮独,你說我怎么就攤上這事拳芙。” “怎么了皮璧?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵舟扎,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我恶导,道長(zhǎng)浆竭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任惨寿,我火速辦了婚禮邦泄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘裂垦。我一直安慰自己顺囊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布蕉拢。 她就那樣靜靜地躺著特碳,像睡著了一般诚亚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上午乓,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天站宗,我揣著相機(jī)與錄音,去河邊找鬼益愈。 笑死梢灭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蒸其。 我是一名探鬼主播敏释,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼摸袁!你這毒婦竟也來了钥顽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤靠汁,失蹤者是張志新(化名)和其女友劉穎蜂大,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體膀曾,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡县爬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了添谊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片财喳。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖斩狱,靈堂內(nèi)的尸體忽然破棺而出耳高,到底是詐尸還是另有隱情,我是刑警寧澤所踊,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布泌枪,位于F島的核電站,受9級(jí)特大地震影響秕岛,放射性物質(zhì)發(fā)生泄漏碌燕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一继薛、第九天 我趴在偏房一處隱蔽的房頂上張望修壕。 院中可真熱鬧,春花似錦遏考、人聲如沸慈鸠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)青团。三九已至譬巫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間督笆,已是汗流浹背芦昔。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胖腾,地道東北人烟零。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓瘪松,卻偏偏與公主長(zhǎng)得像咸作,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子宵睦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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

  • 本文是scikit-learn 支持向量機(jī)的翻譯记罚,原文地址:http://scikit-learn.org/sta...
    學(xué)以致用123閱讀 3,002評(píng)論 0 4
  • 首頁(yè) 資訊 文章 資源 小組 相親 登錄 注冊(cè) 首頁(yè) 最新文章 IT 職場(chǎng) 前端 后端 移動(dòng)端 數(shù)據(jù)庫(kù) 運(yùn)維 其他...
    Helen_Cat閱讀 3,887評(píng)論 1 10
  • 當(dāng)今社會(huì),許多人都把理想和偶像相聯(lián)系壳嚎。提到偶像桐智,大多人的偶像會(huì)是那些位高權(quán)重的領(lǐng)袖們,腰纏萬貫的老板們烟馅,才華橫溢的...
    薛一bj閱讀 1,338評(píng)論 0 4
  • 你有沒有遇見過特別作的女人说庭?當(dāng)時(shí)你是什么感覺? 我上大學(xué)那會(huì)郑趁,遇見一個(gè)特別做作的女同學(xué)刊驴,有次上自習(xí)遇見她,大家都在...
    亦如是閱讀 550評(píng)論 0 0
  • 我是小白,今天是我日更的第五篇文章梭纹,也不知道能否順利分娩問世躲惰。 毫不夸張的說,僅在簡(jiǎn)書連續(xù)發(fā)表了四篇文章变抽,卻像與簡(jiǎn)...
    一樹繁花lijing閱讀 532評(píng)論 11 5