∗∗∗点击查看:吴恩达机器学习——整套笔记+编程作业详解∗∗∗\color{#f00}{***\ 点击查看\ :吴恩达机器学习 \ —— \ 整套笔记+编程作业详解\ ***}∗∗∗ 点击查看 :吴恩达机器学习 —— 整套笔记+编程作业详解 ∗∗∗

作业及代码:https://pan.baidu.com/s/1L-Tbo3flzKplAof3fFdD1w 密码:oin0
本次作业的理论部分:吴恩达机器学习(七)支持向量机
编程环境:Jupyter Notebook

1. 线性 SVM

任务

观察惩罚项系数 C 对决策边界的影响,数据集:data/ex6data1.mat

在理论部分,我们得到SVM的代价函数为:
J(θ)=C∑i=1m[y(i)cost1(θTx(i))+(1−y(i))cost0(θTx(i))]+12∑j=1nθj2J(\theta)=C \sum_{i=1}^{m} \left[y^{(i)} cos t_{1}(\theta^{T} x^{(i)})+(1-y^{(i)}) cos t_{0}(\theta^{T} x^{(i)})\right]+\frac{1}{2} \sum_{j=1}^{n} \theta_{j}^{2} J(θ)=Ci=1∑m​[y(i)cost1​(θTx(i))+(1−y(i))cost0​(θTx(i))]+21​j=1∑n​θj2​其中C为误差项惩罚系数,C越大,容错率越低,越易过拟合。

import numpy as np
import scipy.io as sio
import matplotlib.pyplot as pltdata = sio.loadmat('./data/ex6data1.mat')
X,y = data['X'],data['y']def plot_data():plt.scatter(X[:,0],X[:,1],c = y.flatten(), cmap ='jet')plt.xlabel('x1')plt.ylabel('y1')plot_data() # 绘制原始数据


由图可知,左上角的那个数据点为异常点(误差点)。

Scikit-learn ,kernel=‘linear’

简称 sklearn,参考官方中文文档:http://sklearn.apachecn.org
提供了很多机器学习的库,本次作业主要也是用它来解决SVM的问题

  • C = 1
from sklearn.svm import SVC svc1 = SVC(C=1,kernel='linear') #实例化分类器,C为误差项惩罚系数,核函数选择线性核
svc1.fit(X,y.flatten())         #导入数据进行训练>>> svc1.score(X,y.flatten())     #分类器的准确率
> 0.9803921568627451# 绘制决策边界
def plot_boundary(model):x_min,x_max = -0.5,4.5y_min,y_max = 1.3,5xx,yy = np.meshgrid(np.linspace(x_min,x_max,500),np.linspace(y_min,y_max,500))z = model.predict(np.c_[xx.flatten(),yy.flatten()])zz = z.reshape(xx.shape)plt.contour(xx,yy,zz)plot_boundary(svc1)
plot_data()

  • C = 100
svc100 = SVC(C=100,kernel='linear')
svc100.fit(X,y.flatten())>>>svc100.score(X,y.flatten())
> 1.0#绘制决策边界
plot_boundary(svc100)
plot_data()

结论

误差项惩罚系数C越大,容错率越低,越易过拟合。


2. 非线性 SVM

任务

使用高斯核函数解决线性不可分问题,并观察 σ\sigmaσ 取值对模型复杂度的影响。数据集:data/ex6data2.mat

高斯核函数公式:
K(x1,x2)=exp⁡{−∥x1−x2∥22σ2}K\left(\boldsymbol{x}_{1}, \boldsymbol{x}_{2}\right)=\exp \left\{-\frac{\left\|\boldsymbol{x}_{1}-\boldsymbol{x}_{2}\right\|^{2}}{2 \sigma^{2}}\right\} K(x1​,x2​)=exp{−2σ2∥x1​−x2​∥2​}

data = sio.loadmat('./data/ex6data2.mat')
X,y = data['X'],data['y']def plot_data():plt.scatter(X[:,0],X[:,1],c = y.flatten(), cmap ='jet')plt.xlabel('x1')plt.ylabel('y1')plot_data() # 绘制原始数据

Scikit-learn ,kernel=‘rbf’

  • σ=1\sigma = 1σ=1 ,注意:sklearn中的σ\sigmaσ表示为gammer,高斯核表示为rbf
svc1 = SVC(C=1,kernel='rbf',gamma=1) #实例化分类器,C为误差项惩罚系数,核函数选择高斯核
svc1.fit(X,y.flatten())                 #导入数据进行训练>>> svc1.score(X,y.flatten())         #分类器的准确率
> 0.8088064889918888# 绘制决策边界
def plot_boundary(model):x_min,x_max = 0,1y_min,y_max = 0.4,1xx,yy = np.meshgrid(np.linspace(x_min,x_max,500),np.linspace(y_min,y_max,500))z = model.predict(np.c_[xx.flatten(),yy.flatten()])zz = z.reshape(xx.shape)plt.contour(xx,yy,zz)plot_boundary(svc1)
plot_data()

  • σ=50\sigma = 50σ=50
  • σ=1000\sigma = 1000σ=1000

结论

σ\sigmaσ 值越大,模型复杂度越高,同时也越易过拟合
σ\sigmaσ 值越小,模型复杂度越低,同时也越易欠拟合


3. 寻找最优参数 C 和 σ\sigmaσ

数据集:data/ex6data3.mat

mat = sio.loadmat('data/ex6data3.mat')
X, y = mat['X'], mat['y']              # 训练集
Xval, yval = mat['Xval'], mat['yval']  # 验证集def plot_data():plt.scatter(X[:,0],X[:,1],c = y.flatten(), cmap ='jet')plt.xlabel('x1')plt.ylabel('y1')plot_data() # 绘制原始数据

# C 和 σ 的候选值
Cvalues = [3, 10, 30, 100,0.01, 0.03, 0.1, 0.3,1 ]  #9
gammas =  [1 ,3, 10, 30, 100,0.01, 0.03, 0.1, 0.3]  #9# 获取最佳准确率和最优参数
best_score = 0
best_params = (0,0)for c in Cvalues:for gamma in gammas:svc = SVC(C=c,kernel='rbf',gamma=gamma)svc.fit(X,y.flatten())                    # 用训练集数据拟合模型score = svc.score(Xval,yval.flatten())  # 用验证集数据进行评分if score > best_score:best_score = scorebest_params = (c,gamma)
>>> print(best_score,best_params)
> 0.965 (3, 30)

注意:获取到的最优参数组合不只有一组,更改候选值的顺序,最佳参数组合及其对应的决策边界也会改变

svc2 = SVC(C=3,kernel='rbf',gamma=30)def plot_boundary(model):x_min,x_max = -0.6,0.4y_min,y_max = -0.7,0.6xx,yy = np.meshgrid(np.linspace(x_min,x_max,500),np.linspace(y_min,y_max,500))z = model.predict(np.c_[xx.flatten(),yy.flatten()])zz = z.reshape(xx.shape)plt.contour(xx,yy,zz)plot_boundary(svc2)
plot_data()

4. 垃圾邮件过滤问题

注意:data/spamTrain.mat是对邮件进行预处理后(自然语言处理)获得的向量

# training data
data1 = sio.loadmat('data/spamTrain.mat')
X, y = data1['X'], data1['y']# Testing data
data2 = sio.loadmat('data/spamTest.mat')
Xtest, ytest = data2['Xtest'], data2['ytest']>>> X.shape,y.shape # 样本数为4000
> ((4000, 1899), (4000, 1))>>> X # 每一行代表一个邮件样本,每个样本有1899个特征,特征为1表示在跟垃圾邮件有关的语义库中找到相关单词
> array([[0, 0, 0, ..., 0, 0, 0],[0, 0, 0, ..., 0, 0, 0],[0, 0, 0, ..., 0, 0, 0],...,[0, 0, 0, ..., 0, 0, 0],[0, 0, 1, ..., 0, 0, 0],[0, 0, 0, ..., 0, 0, 0]], dtype=uint8)>>> y # 每一行代表一个邮件样本,等于1表示为垃圾邮件
> array([[1],[1],[0],...,[1],[0],[0]], dtype=uint8)# 候选的 C值
Cvalues = [3, 10, 30, 100,0.01, 0.03, 0.1, 0.3,1 ] # 获取最佳准确率和最优参数
best_score = 0
best_param = 0for c in Cvalues:svc = SVC(C=c,kernel='linear')svc.fit(X,y.flatten())                   # 用训练集数据拟合模型score= svc.score(Xtest,ytest.flatten()) # 用验证集数据进行评分if score > best_score:best_score = scorebest_param = c
>>> print(best_score,best_param)
> 0.99 0.03# 带入最佳参数
svc = SVC(0.03,kernel='linear')
svc.fit(X,y.flatten())
score_train= svc.score(X,y.flatten())
score_test= svc.score(Xtest,ytest.flatten())>>> print(score_train,score_test)
> 0.99425 0.99

附:邮件预处理

with open('data/emailSample1.txt', 'r') as f:sampe_email = f.read()print(sampe_email)'''
预处理主要包括以下8个部分:1. 将大小写统一成小写字母;2. 移除所有HTML标签,只保留内容。3. 将所有的网址替换为字符串 “httpaddr”.4. 将所有的邮箱地址替换为 “emailaddr”5. 将所有dollar符号($)替换为“dollar”.6. 将所有数字替换为“number”7. 将所有单词还原为词源,词干提取8. 移除所有非文字类型9.去除空字符串‘’
'''import numpy as np
import matplotlib.pyplot as plt
from scipy.io import loadmat
from sklearn import svm
import nltk.stem as ns
import redef preprocessing(email):# 1. 统一成小写email = email.lower()#2. 去除html标签email = re.sub('<[^<>]>', ' ', email)#3. 将网址替换为字符串 “httpaddr”.email = re.sub('(http|https)://[^\s]*', 'httpaddr', email ) #4. 将邮箱地址替换为 “emailaddr”email = re.sub('[^\s]+@[^\s]+', 'emailaddr', email)# 5.所有dollar符号($)替换为“dollar”.email = re.sub('[\$]+', 'dollar', email) # 6.匹配数字,将数字替换为“number”email = re.sub('[0-9]+', 'number', email) # 匹配一个数字, 相当于 [0-9],+ 匹配1到多次# 7. 词干提取tokens = re.split('[ \@\$\/\#\.\-\:\&\*\+\=\[\]\?\!\(\)\{\}\,\'\"\>\_\<\;\%]', email)tokenlist=[]s = ns.SnowballStemmer('english')for token in tokens:# 8. 移除非文字类型email  = re.sub('[^a-zA-Z0-9]', '', email)stemmed = s.stem(token)# 9.去除空字符串‘’if not len(token): continuetokenlist.append(stemmed)  return tokenlistemail = preprocessing(sampe_email)def email2VocabIndices(email, vocab):"""提取存在单词的索引"""token = preprocessing(email)print(token)index = [i for i in range(len(token)) if token[i] in vocab]return index def email2FeatureVector(email):"""将email转化为词向量,n是vocab的长度。存在单词的相应位置的值置为1,其余为0"""df = pd.read_table('data/vocab.txt',names=['words'])vocab = df.values  # return arrayvector = np.zeros(len(vocab))  # init vectorvocab_indices = email2VocabIndices(email, vocab) print(vocab_indices)# 返回含有单词的索引# 将有单词的索引置为1for i in vocab_indices:vector[i] = 1return vectorimport pandas as pd
vector = email2FeatureVector(sampe_email)
>>> print('length of vector = {}\nnum of non-zero = {}'.format(len(vector), int(vector.sum())))
> ['anyon', 'know', 'how', 'much', 'it', 'cost', 'to', 'host', 'a', 'web', 'portal', '\n', '\nwell', 'it', 'depend', 'on', 'how', 'mani', 'visitor', 'you', 're', 'expect', '\nthis', 'can', 'be', 'anywher', 'from', 'less', 'than', 'number', 'buck', 'a', 'month', 'to', 'a', 'coupl', 'of', 'dollarnumb', '\nyou', 'should', 'checkout', 'httpaddr', 'or', 'perhap', 'amazon', 'ecnumb', '\nif', 'your', 'run', 'someth', 'big', '\n\nto', 'unsubscrib', 'yourself', 'from', 'this', 'mail', 'list', 'send', 'an', 'email', 'to', '\nemailaddr\n\n']
[0, 1, 2, 3, 4, 5, 6, 7, 9, 13, 14, 15, 16, 17, 19, 20, 21, 23, 24, 25, 26, 27, 28, 29, 32, 33, 35, 36, 37, 39, 41, 42, 43, 47, 48, 49, 50, 52, 53, 54, 56, 57, 58, 59, 60, 61]
length of vector = 1899
num of non-zero = 46>>> vector.shape
> (1899,)

编程作业(python)| 吴恩达 机器学习(6)支持向量机 SVM相关推荐

  1. 吴恩达机器学习7——支持向量机SVM

    吴恩达机器学习7 一.SVM直观理解 1. SVM引入逻辑回归 2. 大边界分类器SVM 3. SVM原理 二.核函数 1. 核函数原理和概念 2. SVM和核函数结合的计算步骤 三.使用SVM 一. ...

  2. Python吴恩达机器学习课后习题作业一算法(Ⅰ)(1)

    吴恩达老师的机器学习课程是机器学习入门者必看的经典之一,其课后习题也是典中典.下面将在以Python为语言工具完成课后习题. 问题一:单元线性回归 问题:根据城市人口数量,预测开小吃店的利润 下面我将 ...

  3. 吴恩达机器学习 10.支持向量机

    支持向量机 支持向量机(Support Vector Machine). (一个强大的算法广泛的应用于工业界和学术界 与逻辑回归和神经网络相比,支持向量机,或者简称SVM,在学习复杂的非线性方程时提供 ...

  4. 吴恩达机器学习手写笔记(持续更新ing)

    吴恩达机器学习笔记 文章目录 吴恩达机器学习笔记 1.Introduction 2.Linear regression with one variable 3.Linear Algebra revie ...

  5. python第六周实验_机器学习 | 吴恩达机器学习第六周编程作业(Python版)

    实验指导书    下载密码:ovyt 本篇博客主要讲解,吴恩达机器学习第六周的编程作业,作业内容主要是实现一个正则化的线性回归算法,涉及本周讲的模型选择问题,绘制学习曲线判断高偏差/高方差问题.原始实 ...

  6. 机器学习 | 吴恩达机器学习第六周编程作业(Python版)

    实验指导书    下载密码:ovyt 本篇博客主要讲解,吴恩达机器学习第六周的编程作业,作业内容主要是实现一个正则化的线性回归算法,涉及本周讲的模型选择问题,绘制学习曲线判断高偏差/高方差问题.原始实 ...

  7. github标星11600+:最全的吴恩达机器学习课程资源(完整笔记、中英文字幕视频、python作业,提供百度云镜像!)...

    吴恩达老师的机器学习课程,可以说是机器学习入门的第一课和最热门课程,我在github开源了吴恩达机器学习个人笔记,用python复现了课程作业,成为热门项目,star数达到11671+,曾经有相关报道 ...

  8. 吴恩达机器学习课后作业ex1(python实现)

    作业介绍 吴恩达老师的作业资源可以在github或者网上找到 . ex1主要是对线性回归的一些复习和梯度下降.损失函数等的具体代码实现. pdf文件是对作业的说明.文件夹则是作业数据的各种格式,pyt ...

  9. k均值算法python实现(吴恩达机器学习作业)

    k均值算法python实现(吴恩达机器学习作业) 题目要求 数据集 读取mat文件 K-means 实现 结果 问题 题目要求 采用K均值算法对样本进行聚类. 编写K均值算法源代码,对ex7data2 ...

  10. 吴恩达机器学习作业7 - K-means和PCA主成分分析(Python实现)

    吴恩达机器学习作业7 - K-means和PCA主成分分析(Python实现) Introduction 在本实验中,将实现K-means聚类算法,并将其应用于图像压缩.在第二部分实验中,将使用主成分 ...

最新文章

  1. 三星 arm9 linux,基于arm9内核三星s3c2410平台下linux四键按键驱动程序
  2. HDOJ 3642 Get The Treasury(扫描线 + 线段树 + 离散化 立方体的并)
  3. 导数,微积分,牛顿运动学制作创意地图
  4. DZ各个数据表详解(DZ论坛各表详细说明,二次开发用)
  5. MySQL重置root用户密码的方法【亲测可用】
  6. 【Python Web】flask1
  7. jsp判断disable按钮不可选_选电子琴五部曲
  8. 看完微软大神写的求平均值代码,我意识到自己还是 too young 了
  9. 手把手教你部署VSAN见证虚拟设备 (Cormac)
  10. PHP总结:几个陷阱
  11. 求一个3*3矩阵两条对角线上元素之和(每个元素只加一次) C语言
  12. VC++ Tab Control控件的使用
  13. GitHub配置SSH key
  14. Python转换音频采样率(8k到16k)
  15. 1U、2U、标准19寸机架是什么意思?这篇文章讲的很明白
  16. intelliJ IDES MySql数据库JDBC连接代码
  17. 数仓建设(离线和实时)
  18. 用Panoply对nc文件进行可视化和制图
  19. html前端小教程—各浏览器兼容视频插入方法
  20. 优秀的程序员10分钟内能搞定下面5个编程问题,你能做到吗?

热门文章

  1. you-get下载bilibili视频
  2. 文件上传和OSS上传至阿里云
  3. 环境篇-Windows下安装OpenSSL
  4. harmonyos蓝牙,鸿蒙OS 蓝牙概述
  5. html边框倾斜,弯曲的边框CSS实现
  6. 修改服务器的返回数据,使用charles 修改服务器返回数据
  7. Imbalance data——数据不平衡问题
  8. Web编程入门暨个人网站计划:Web前端开发入门
  9. springboot工程中生成二维码(Java)
  10. 群晖docker实现IPV6访问