欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

吳恩達(dá)機(jī)器學(xué)習(xí)練習(xí):SVM支持向量機(jī)

 更新時(shí)間:2021年04月15日 17:02:46   作者:Cowry5  
這篇文章主要為我們帶來了吳恩達(dá)機(jī)器學(xué)習(xí)的一個(gè)練習(xí):SVM支持向量機(jī),通過本次練習(xí)相信你能對(duì)機(jī)器學(xué)習(xí)深入更進(jìn)一步,需要的朋友可以參考下

1 Support Vector Machines

1.1 Example Dataset 1

%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sb
from scipy.io import loadmat
from sklearn import svm

大多數(shù)SVM的庫會(huì)自動(dòng)幫你添加額外的特征X₀已經(jīng)θ₀,所以無需手動(dòng)添加

mat = loadmat('./data/ex6data1.mat')
print(mat.keys())
# dict_keys(['__header__', '__version__', '__globals__', 'X', 'y'])
X = mat['X']
y = mat['y']
def plotData(X, y):
    plt.figure(figsize=(8,5))
    plt.scatter(X[:,0], X[:,1], c=y.flatten(), cmap='rainbow')
    plt.xlabel('X1')
    plt.ylabel('X2')
    plt.legend() 
plotData(X, y)

output_5_1.png

def plotBoundary(clf, X):
    '''plot decision bondary'''
    x_min, x_max = X[:,0].min()*1.2, X[:,0].max()*1.1
    y_min, y_max = X[:,1].min()*1.1,X[:,1].max()*1.1
    xx, yy = np.meshgrid(np.linspace(x_min, x_max, 500),
                         np.linspace(y_min, y_max, 500))
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    plt.contour(xx, yy, Z)
models = [svm.SVC(C, kernel='linear') for C in [1, 100]]
clfs = [model.fit(X, y.ravel()) for model in models]
title = ['SVM Decision Boundary with C = {} (Example Dataset 1'.format(C) for C in [1, 100]]
for model,title in zip(clfs,title):
    plt.figure(figsize=(8,5))
    plotData(X, y)
    plotBoundary(model, X)
    plt.title(title)

output_9_2.png

output_9_4.png

可以從上圖看到,當(dāng)C比較小時(shí)模型對(duì)誤分類的懲罰增大,比較嚴(yán)格,誤分類少,間隔比較狹窄。

當(dāng)C比較大時(shí)模型對(duì)誤分類的懲罰增大,比較寬松,允許一定的誤分類存在,間隔較大。

1.2 SVM with Gaussian Kernels

這部分,使用SVM做非線性分類。我們將使用高斯核函數(shù)。

為了用SVM找出一個(gè)非線性的決策邊界,我們首先要實(shí)現(xiàn)高斯核函數(shù)。我可以把高斯核函數(shù)想象成一個(gè)相似度函數(shù),用來測(cè)量一對(duì)樣本的距離,(x ⁽ ʲ ⁾,y ⁽ ⁱ ⁾)

image.png

這里我們用sklearn自帶的svm中的核函數(shù)即可。

1.2.1 Gaussian Kernel

def gaussKernel(x1, x2, sigma):
    return np.exp(- ((x1 - x2) ** 2).sum() / (2 * sigma ** 2))
gaussKernel(np.array([1, 2, 1]),np.array([0, 4, -1]), 2.)  # 0.32465246735834974

1.2.2 Example Dataset 2

mat = loadmat('./data/ex6data2.mat')
X2 = mat['X']
y2 = mat['y']
plotData(X2, y2)

output_16_1.png

sigma = 0.1
gamma = np.power(sigma,-2.)/2
clf = svm.SVC(C=1, kernel='rbf', gamma=gamma)
modle = clf.fit(X2, y2.flatten())
plotData(X2, y2)
plotBoundary(modle, X2)

output_17_1.png

1.2.3 Example Dataset 3

mat3 = loadmat('data/ex6data3.mat')
X3, y3 = mat3['X'], mat3['y']
Xval, yval = mat3['Xval'], mat3['yval']
plotData(X3, y3)

output_19_1.png

Cvalues = (0.01, 0.03, 0.1, 0.3, 1., 3., 10., 30.)
sigmavalues = Cvalues
best_pair, best_score = (0, 0), 0
for C in Cvalues:
    for sigma in sigmavalues:
        gamma = np.power(sigma,-2.)/2
        model = svm.SVC(C=C,kernel='rbf',gamma=gamma)
        model.fit(X3, y3.flatten())
        this_score = model.score(Xval, yval)
        if this_score > best_score:
            best_score = this_score
            best_pair = (C, sigma)
print('best_pair={}, best_score={}'.format(best_pair, best_score))
# best_pair=(1.0, 0.1), best_score=0.965
model = svm.SVC(C=1., kernel='rbf', gamma = np.power(.1, -2.)/2)
model.fit(X3, y3.flatten())
plotData(X3, y3)
plotBoundary(model, X3)

output_21_1.png

# 這我的一個(gè)練習(xí)畫圖的,和作業(yè)無關(guān),給個(gè)畫圖的參考。
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
# we create 40 separable points
np.random.seed(0)
X = np.array([[3,3],[4,3],[1,1]])
Y = np.array([1,1,-1])
# fit the model
clf = svm.SVC(kernel='linear')
clf.fit(X, Y)
# get the separating hyperplane
w = clf.coef_[0]
a = -w[0] / w[1]
xx = np.linspace(-5, 5)
yy = a * xx - (clf.intercept_[0]) / w[1]
# plot the parallels to the separating hyperplane that pass through the
# support vectors
b = clf.support_vectors_[0]
yy_down = a * xx + (b[1] - a * b[0])
b = clf.support_vectors_[-1]
yy_up = a * xx + (b[1] - a * b[0])
# plot the line, the points, and the nearest vectors to the plane
plt.figure(figsize=(8,5))
plt.plot(xx, yy, 'k-')
plt.plot(xx, yy_down, 'k--')
plt.plot(xx, yy_up, 'k--')
# 圈出支持向量
plt.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1],
            s=150, facecolors='none', edgecolors='k', linewidths=1.5)
plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.rainbow)
plt.axis('tight')
plt.show()
print(clf.decision_function(X))

output_22_0.png

[ 1. 1.5 -1. ]

2 Spam Classification

2.1 Preprocessing Emails

這部分用SVM建立一個(gè)垃圾郵件分類器。你需要將每個(gè)email變成一個(gè)n維的特征向量,這個(gè)分類器將判斷給定一個(gè)郵件x是垃圾郵件(y=1)或不是垃圾郵件(y=0)。

take a look at examples from the dataset

with open('data/emailSample1.txt', 'r') as f:
    email = f.read()
    print(email)
> Anyone knows how much it costs to host a web portal ?
>
Well, it depends on how many visitors you're expecting.
This can be anywhere from less than 10 bucks a month to a couple of $100. 
You should checkout http://www.rackspace.com/ or perhaps Amazon EC2 
if youre running something big..
To unsubscribe yourself from this mailing list, send an email to:
groupname-unsubscribe@egroups.com

可以看到,郵件內(nèi)容包含 a URL, an email address(at the end), numbers, and dollar amounts. 很多郵件都會(huì)包含這些元素,但是每封郵件的具體內(nèi)容可能會(huì)不一樣。因此,處理郵件經(jīng)常采用的方法是標(biāo)準(zhǔn)化這些數(shù)據(jù),把所有URL當(dāng)作一樣,所有數(shù)字看作一樣。

例如,我們用唯一的一個(gè)字符串‘httpaddr'來替換所有的URL,來表示郵件包含URL,而不要求具體的URL內(nèi)容。這通常會(huì)提高垃圾郵件分類器的性能,因?yàn)槔]件發(fā)送者通常會(huì)隨機(jī)化URL,因此在新的垃圾郵件中再次看到任何特定URL的幾率非常小。

我們可以做如下處理:

  1. Lower-casing: 把整封郵件轉(zhuǎn)化為小寫。
  2. Stripping HTML: 移除所有HTML標(biāo)簽,只保留內(nèi)容。
  3. Normalizing URLs: 將所有的URL替換為字符串 “httpaddr”.
  4. Normalizing Email Addresses: 所有的地址替換為 “emailaddr”
  5. Normalizing Dollars: 所有dollar符號(hào)($)替換為“dollar”.
  6. Normalizing Numbers: 所有數(shù)字替換為“number”
  7. Word Stemming(詞干提取): 將所有單詞還原為詞源。例如,“discount”, “discounts”, “discounted” and “discounting”都替換為“discount”。
  8. Removal of non-words: 移除所有非文字類型,所有的空格(tabs, newlines, spaces)調(diào)整為一個(gè)空格.
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from scipy.io import loadmat
from sklearn import svm
import re #regular expression for e-mail processing
# 這是一個(gè)可用的英文分詞算法(Porter stemmer)
from stemming.porter2 import stem
# 這個(gè)英文算法似乎更符合作業(yè)里面所用的代碼,與上面效果差不多
import nltk, nltk.stem.porter
def processEmail(email):
    """做除了Word Stemming和Removal of non-words的所有處理"""
    email = email.lower()
    email = re.sub('<[^<>]>', ' ', email)  # 匹配<開頭,然后所有不是< ,> 的內(nèi)容,知道>結(jié)尾,相當(dāng)于匹配<...>
    email = re.sub('(http|https)://[^\s]*', 'httpaddr', email )  # 匹配//后面不是空白字符的內(nèi)容,遇到空白字符則停止
    email = re.sub('[^\s]+@[^\s]+', 'emailaddr', email)
    email = re.sub('[\$]+', 'dollar', email)
    email = re.sub('[\d]+', 'number', email) 
    return email

接下來就是提取詞干,以及去除非字符內(nèi)容。

def email2TokenList(email):
    """預(yù)處理數(shù)據(jù),返回一個(gè)干凈的單詞列表"""
    # I'll use the NLTK stemmer because it more accurately duplicates the
    # performance of the OCTAVE implementation in the assignment
    stemmer = nltk.stem.porter.PorterStemmer()
    email = preProcess(email)
    # 將郵件分割為單個(gè)單詞,re.split() 可以設(shè)置多種分隔符
    tokens = re.split('[ \@\$\/\#\.\-\:\&\*\+\=\[\]\?\!\(\)\{\}\,\'\"\>\_\<\;\%]', email)
    # 遍歷每個(gè)分割出來的內(nèi)容
    tokenlist = []
    for token in tokens:
        # 刪除任何非字母數(shù)字的字符
        token = re.sub('[^a-zA-Z0-9]', '', token);
        # Use the Porter stemmer to 提取詞根
        stemmed = stemmer.stem(token)
        # 去除空字符串‘',里面不含任何字符
        if not len(token): continue
        tokenlist.append(stemmed)
    return tokenlist  

2.1.1 Vocabulary List(詞匯表)

在對(duì)郵件進(jìn)行預(yù)處理之后,我們有一個(gè)處理后的單詞列表。下一步是選擇我們想在分類器中使用哪些詞,我們需要去除哪些詞。

我們有一個(gè)詞匯表vocab.txt,里面存儲(chǔ)了在實(shí)際中經(jīng)常使用的單詞,共1899個(gè)。

我們要算出處理后的email中含有多少vocab.txt中的單詞,并返回在vocab.txt中的index,這就我們想要的訓(xùn)練單詞的索引。

def email2VocabIndices(email, vocab):
    """提取存在單詞的索引"""
    token = email2TokenList(email)
    index = [i for i in range(len(vocab)) if vocab[i] in token ]
    return index

2.2 Extracting Features from Emails

def email2FeatureVector(email):
    """
    將email轉(zhuǎn)化為詞向量,n是vocab的長(zhǎng)度。存在單詞的相應(yīng)位置的值置為1,其余為0
    """
    df = pd.read_table('data/vocab.txt',names=['words'])
    vocab = df.as_matrix()  # return array
    vector = np.zeros(len(vocab))  # init vector
    vocab_indices = email2VocabIndices(email, vocab)  # 返回含有單詞的索引
    # 將有單詞的索引置為1
    for i in vocab_indices:
        vector[i] = 1
    return vector
vector = email2FeatureVector(email)
print('length of vector = {}\nnum of non-zero = {}'.format(len(vector), int(vector.sum())))
length of vector = 1899
num of non-zero = 45

2.3 Training SVM for Spam Classification

讀取已經(jīng)訓(xùn)提取好的特征向量以及相應(yīng)的標(biāo)簽。分訓(xùn)練集和測(cè)試集。

# Training set
mat1 = loadmat('data/spamTrain.mat')
X, y = mat1['X'], mat1['y']
# Test set
mat2 = scipy.io.loadmat('data/spamTest.mat')
Xtest, ytest = mat2['Xtest'], mat2['ytest']
clf = svm.SVC(C=0.1, kernel='linear')
clf.fit(X, y)

2.4 Top Predictors for Spam

predTrain = clf.score(X, y)
predTest = clf.score(Xtest, ytest)
predTrain, predTest
(0.99825, 0.989)

到此這篇關(guān)于機(jī)器學(xué)習(xí)SVM支持向量機(jī)的練習(xí)文章就介紹到這了,更多相關(guān)機(jī)器學(xué)習(xí)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!

相關(guān)文章

  • python程序變成軟件的實(shí)操方法

    python程序變成軟件的實(shí)操方法

    在本篇文章里小編給大家整理的是關(guān)于python程序變成軟件的相關(guān)方法和具體操作流程,有需要的朋友們可以參考下。
    2019-06-06
  • 基于python pygame實(shí)現(xiàn)的兔子吃月餅小游戲

    基于python pygame實(shí)現(xiàn)的兔子吃月餅小游戲

    pygame是用來開發(fā)游戲的一套基于SDL的模板,它可以是python創(chuàng)建完全界面化的游戲和多媒體程序,而且它基本上可以在任何系統(tǒng)上運(yùn)行,這篇文章主要給大家介紹了基于python pygame實(shí)現(xiàn)的兔子吃月餅小游戲的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • Python 類與元類的深度挖掘 I【經(jīng)驗(yàn)】

    Python 類與元類的深度挖掘 I【經(jīng)驗(yàn)】

    super() 方法解決了類->實(shí)例實(shí)踐過程中關(guān)于命名空間的一些問題,而關(guān)于生成對(duì)象的流程,我們知道初始化實(shí)例是通過類的 __init__() 方法完成的,在此之前可能涉及到一些其它的準(zhǔn)備工作,包括接下來提到的 mro() 方法以及關(guān)鍵的元類->類的過程
    2016-05-05
  • 詳解python腳本自動(dòng)生成需要文件實(shí)例代碼

    詳解python腳本自動(dòng)生成需要文件實(shí)例代碼

    這篇文章主要介紹了詳解python腳本自動(dòng)生成需要文件實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • 詳解Python self 參數(shù)

    詳解Python self 參數(shù)

    這篇文章主要介紹了Python self 參數(shù)詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Python編寫nmap掃描工具

    Python編寫nmap掃描工具

    NMAP是一款開源的網(wǎng)絡(luò)探測(cè)和安全審核的工具,今天我們用python的模擬實(shí)現(xiàn)一個(gè)簡(jiǎn)單版本的端口掃描工具,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • pyinstaller生成的exe文件啟動(dòng)時(shí)間漫長(zhǎng)的原因

    pyinstaller生成的exe文件啟動(dòng)時(shí)間漫長(zhǎng)的原因

    本文主要介紹了pyinstaller生成的exe文件啟動(dòng)時(shí)間漫長(zhǎng)的原因,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • Python二進(jìn)制數(shù)據(jù)結(jié)構(gòu)Struct的具體使用

    Python二進(jìn)制數(shù)據(jù)結(jié)構(gòu)Struct的具體使用

    在C/C++語言中,struct被稱為結(jié)構(gòu)體。而在Python中,struct是一個(gè)專門的庫,用于處理字節(jié)串與原生Python數(shù)據(jù)結(jié)構(gòu)類型之間的轉(zhuǎn)換。本文就詳細(xì)介紹struct的使用方式
    2021-06-06
  • 關(guān)于如何使用python的gradio庫

    關(guān)于如何使用python的gradio庫

    這篇文章主要介紹了關(guān)于如何使用python的gradio庫,Gradio是一個(gè)功能豐富的Python庫,可以讓您輕松創(chuàng)建和共享自己的交互式機(jī)器學(xué)習(xí)和深度學(xué)習(xí)模型,需要的朋友可以參考下
    2023-04-04
  • Python使用pandas模塊實(shí)現(xiàn)表之間的關(guān)聯(lián)

    Python使用pandas模塊實(shí)現(xiàn)表之間的關(guān)聯(lián)

    在數(shù)據(jù)分析和處理中,表之間的關(guān)聯(lián)是非常常見的操作,本文為大家介紹了pandas中實(shí)現(xiàn)表之間的關(guān)聯(lián)有四種方式,感興趣的小伙伴可以了解一下
    2023-07-07

最新評(píng)論