所有的数据来源:链接:https://pan.baidu.com/s/1vTaw1n77xPPfKk23KEKARA
提取码:5gl2

1 Support Vector Machines

1.1 Prepare datasets

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'''
1.Prepare datasets
'''
mat = loadmat('data/ex6data1.mat')
print(mat.keys())
# dict_keys(['__header__', '__version__', '__globals__', 'X', 'y'])
X = mat['X']
y = mat['y']
'''大多数SVM的库会自动帮你添加额外的特征x0,所以无需手动添加。'''
def plotData(X, y):plt.figure(figsize=(8, 6))plt.scatter(X[:, 0], X[:, 1], c=y.flatten(), cmap='rainbow')# c=list,设置cmap,根据label不一样,设置不一样的颜色# c:色彩或颜色序列   camp:colormap(颜色表)plt.xlabel('x1')plt.ylabel('x2')# plt.legend()# plt.grid(True)# # plt.show()pass# plotData(X, y)

接下来取一段范围,这段范围是根据已有数据的大小进行细微扩大,并且将其分成500段,通过meshgrid获得网格线,最终利用等高线图画出分界线

1.2 Decision Boundary

def plotBoundary(clf, X):'''Plot Decision Boundary'''x_min, x_max = X[:, 0].min() * 1.2, X[:, 0].max() * 1.1y_min, y_max = X[:, 1].min() * 1.1, X[:, 1].max() * 1.1# np.linspace(x_min, x_max, 500).shape---->(500, )  500是样本数# xx.shape, yy.shape ---->(500, 500) (500, 500)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()])# model.predict:模型预测 (250000, )# ravel()将多维数组转换为一维数组 xx.ravel().shape ----> (250000,1)# np.c 中的c是column(列)的缩写,就是按列叠加两个矩阵,就是把两个矩阵左右组合,要求行数相等。# np.c_[xx.ravel(), yy.ravel()].shape ----> (250000,2) 就是说建立了250000个样本Z = Z.reshape(xx.shape)plt.contour(xx, yy, Z)# 等高线得作用就是画出分隔得线pass

通过调用sklearn中支持向量机的代码,来进行模型的拟合

models = [svm.SVC(C, kernel='linear') for C in [1, 100]]
# 支持向量机模型 (kernel:核函数选项,这里是线性核函数 , C:权重,这里取1和100)
# 线性核函数画的决策边界就是直线
clfs = [model.fit(X, y.ravel()) for model in models]    # model.fit:拟合出模型
score = [model.score(X, y) for model in models]        # [0.9803921568627451, 1.0]
# title = ['SVM Decision Boundary with C = {}(Example Dataset 1)'.format(C) for C in [1, 100]]
def plot():title = ['SVM Decision Boundary with C = {}(Example Dataset 1)'.format(C) for C in [1, 100]]for model, title in zip(clfs, title):# zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。plt.figure(figsize=(8, 5))plotData(X, y)plotBoundary(model, X)  # 用拟合好的模型(预测那些250000个样本),绘制决策边界plt.title(title)passpass
# plt.show()

A large C parameter tells the SVM to try to classify all the examples correctly.

C plays a rolesimilar to λ, where λ is the regularization parameter that we were using previously for logistic regression.

可以理解对误差的惩罚,惩罚大,则曲线分类精准。

1.2 SVM with Gaussian Kernels

当用SVM作非线性分类时,我们一般使用Gaussian Kernels。
Kgaussian (x(i),x(j))=exp⁡(−∥x(i)−x(j)∥22σ2)=exp⁡(−∑k=1(xk(i)−xk(j))22σ2)K_{\text {gaussian }}\left(x^{(i)}, x^{(j)}\right)=\exp \left(-\frac{\left\|x^{(i)}-x^{(j)}\right\|^{2}}{2 \sigma^{2}}\right)=\exp \left(-\frac{\sum_{k=1}\left(x_{k}^{(i)}-x_{k}^{(j)}\right)^{2}}{2 \sigma^{2}}\right) Kgaussian ​(x(i),x(j))=exp(−2σ2∥∥​x(i)−x(j)∥∥​2​)=exp⎝⎜⎛​−2σ2∑k=1​(xk(i)​−xk(j)​)2​⎠⎟⎞​
本文中使用其自带的即可。

def gaussKernel(x1, x2, sigma):return np.exp(-(x1 - x2) ** 2).sum() / (2 * sigma ** 2)a = gaussKernel(np.array([1, 2, 1]), np.array([0, 4, -1]), 2.)  # 0.32465246735834974
# print(a)
1.2.1 Gaussian Kernel-Example Dataset2
mat = loadmat('data/ex6data2.mat')
x2 = mat['X']
y2 = mat['y']
plotData(x2, y2)
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ktLdbJ8u-1622612399587)(C:/Users/DELL/AppData/Roaming/Typora/typora-user-images/image-20210601172524887.png)]

sigma = 0.1
gamma = np.power(sigma, -2)/2
'''
高斯核函数中的gamma越大,相当高斯函数中的σ越小,此时的分布曲线也就会越高越瘦。
高斯核函数中的gamma越小,相当高斯函数中的σ越大,此时的分布曲线也就越矮越胖,smoothly,higher bias, lower variance
'''
clf = svm.SVC(C=1, kernel='rbf', gamma=gamma)
model = clf.fit(x2, y2.flatten())       # kernel='rbf'表示支持向量机使用高斯核函数
# https://blog.csdn.net/guanyuqiu/article/details/85109441
# plotData(x2, y2)
# plotBoundary(model, x2)
# plt.show()

1.2.2 Gaussian Kernel-Example Dataset3
'''
Example Dataset3
'''
mat3 = loadmat('data/ex6data3.mat')
x3, y3 = mat3['X'], mat3['y']
Xval, yval = mat3['Xval'], mat3['yval']
plotData(x3, y3)
# plt.show()
Cvalues = (0.01, 0.03, 0.1, 0.3, 1., 3., 10., 30.)  # 权重C的候选值
sigmavalues = Cvalues   # 核函数参数的候选值
best_pair, best_score = (0, 0), 0        # 最佳的(C,sigma)权值 ,决定系数(R2)
# 寻找最佳的权值(C,sigma)
for C in Cvalues:for sigma in sigmavalues:gamma = np.power(sigma, -2.) / 2model = svm.SVC(C=C, kernel='rbf', gamma=gamma)     # 使用核函数的支持向量机model.fit(x3, y3.flatten())      # 拟合出模型this_score = model.score(Xval, yval)        # 利用交叉验证集来选择最合适的权重'''model.score函数的返回值是决定系数,也称R2。可以测度回归直线对样本数据的拟合程度,决定系数的取值在0到1之间,决定系数越高,模型的拟合效果越好,即模型解释因变量的能力越强。'''# 选择拟合得最好得权重值if this_score > best_score:best_score = this_scorebest_pair = (C, sigma)passpass
print('最优(C, sigma)权值:', best_pair, '决定系数:', best_score)
# 最优(C, sigma)权值: (1.0, 0.1) 决定系数: 0.965
model = svm.SVC(1, kernel='rbf', gamma=np.power(0.1, -2.) / 2)
# 用确定好的权重再重新声明一次支持向量机
model.fit(x3, y3.flatten())
plotData(x3, y3)
plotBoundary(model, x3)
# plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zODc0dOu-1622612399590)(C:/Users/DELL/AppData/Roaming/Typora/typora-user-images/image-20210601224239696.png)]

SVM中的score的作用:

2 Spam Classfication

邮件分类这一块就偷一下懒拉,给大家看看代码

import numpy as np
import matplotlib.pyplot as plt
from scipy.io import loadmat
from sklearn import svm
import pandas as pd
import re  # regular expression for e-mail processing# 这是一个可用的英文分词算法(Porter stemmer)
from stemming.porter2 import stem# 这个英文算法似乎更符合作业里面所用的代码,与上面效果差不多
import nltk, nltk.stem.porterwith open('data/emailSample1.txt', 'r') as f:email = f.read()pass
print(email)
#   我们可以做如下处理:
#   1. Lower-casing: 把整封邮件转化为小写。
#   2. Stripping HTML: 移除所有HTML标签,只保留内容。
#   3. Normalizing URLs: 将所有的URL替换为字符串 “httpaddr”.
#   4. Normalizing Email Addresses: 所有的地址替换为 “emailaddr”
#   5. Normalizing Dollars: 所有dollar符号($)替换为“dollar”.
#   6. Normalizing Numbers: 所有数字替换为“number”
#   7. Word Stemming(词干提取): 将所有单词还原为词源。
#   例如,“discount”, “discounts”, “discounted” and “discounting”都替换为“discount”。
#   8. Removal of non-words: 移除所有非文字类型,所有的空格(tabs, newlines, spaces)调整为一个空格.def processEmail(email):'''除了Word Stemming, Removal of non-words之外所有的操作'''email = email.lower()email = re.sub('<[^<>]>', '', email)    # 匹配<开头,然后所有不是< ,> 的内容,知道>结尾,相当于匹配<...>email = re.sub('(http|https)://[^\s]*', 'httpaddr', email)  # 匹配//后面不是空白字符的内容,遇到空白字符则停止email = re.sub('[^\s]+@[^\s]+', 'emailaddr', email)email = re.sub('[\$]+', 'dollar', email)email = re.sub('[\d]+', 'number', email)return emaildef email2TokenList(email):"""预处理数据,返回一个干净的单词列表"""# I'll use the NLTK stemmer because it more accurately duplicates the# performance of the OCTAVE implementation in the assignmentstemmer = nltk.stem.porter.PorterStemmer()email = processEmail(email)# 将邮件分割为单个单词,re.split() 可以设置多种分隔符tokens = re.split('[ \@\$\/\#\.\-\:\&\*\+\=\[\]\?\!\(\)\{\}\,\'\"\>\_\<\;\%]', email)# 遍历每个分割出来的内容tokenlist = []for token in tokens:# 删除任何非字母数字的字符token = re.sub('[^a-zA-Z0-9]', '', token)# Use the Porter stemmer to 提取词根stemmed = stemmer.stem(token)# 去除空字符串‘’,里面不含任何字符if not len(token):continuetokenlist.append(stemmed)return tokenlist# 在对邮件进行预处理之后,我们有一个处理后的单词列表。
# 下一步是选择我们想在分类器中使用哪些词,我们需要去除哪些词。
# 我们有一个词汇表vocab.txt,里面存储了在实际中经常使用的单词,共1899个。
# 我们要算出处理后的email中含有多少vocab.txt中的单词,并返回在vocab.txt中的index,
# 这就我们想要的训练单词的索引。def email2VocanIndices(email, vocab):'''提取存在单词的索引'''token = email2TokenList(email)index = [i for i in range(len(vocab)) if vocab[i] in token]return indexdef email2FeatureVector(email):'''将email转化为词向量,n是vocab的长度。存在单词的相应位置的值置为1,其余为0:param email::return:'''df = pd.read_table('data/vocab.txt', names=['words'])vocab = np.array(df)    # return arrayvector = np.zeros(len(vocab))   # init vectorvocab_indices = email2VocanIndices(email, vocab)    # 返回含有单词的索引# 将有单词的索引值置为1for i in vocab_indices:vector[i] = 1passreturn vectorvector = email2FeatureVector(email)
print('length of vector = {}\nnum of non-zero = {}'.format(len(vector), int(vector.sum())))# Training set
mat1 = loadmat('data/spamTrain.mat')
X, y = mat1['X'], mat1['y']# Test set
mat2 = loadmat('data/spamTest.mat')
Xtest, ytest = mat2['Xtest'], mat2['ytest']clf = svm.SVC(C=0.1, kernel='linear')
clf.fit(X, y)predTrain = clf.score(X, y)
predTest = clf.score(Xtest, ytest)
print(predTrain, predTest)
# 0.99825

附完整代码:

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'''
1.Prepare datasets
'''
mat = loadmat('data/ex6data1.mat')
print(mat.keys())
# dict_keys(['__header__', '__version__', '__globals__', 'X', 'y'])
X = mat['X']
y = mat['y']
'''大多数SVM的库会自动帮你添加额外的特征x0,所以无需手动添加。'''def plotData(X, y):plt.figure(figsize=(8, 6))plt.scatter(X[:, 0], X[:, 1], c=y.flatten(), cmap='rainbow')# c=list,设置cmap,根据label不一样,设置不一样的颜色# c:色彩或颜色序列   camp:colormap(颜色表)plt.xlabel('x1')plt.ylabel('x2')# plt.legend()# plt.grid(True)# # plt.show()pass# plotData(X, y)
def plotBoundary(clf, X):'''Plot Decision Boundary'''x_min, x_max = X[:, 0].min() * 1.2, X[:, 0].max() * 1.1y_min, y_max = X[:, 1].min() * 1.1, X[:, 1].max() * 1.1# np.linspace(x_min, x_max, 500).shape---->(500, )  500是样本数# xx.shape, yy.shape ---->(500, 500) (500, 500)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()])# model.predict:模型预测 (250000, )# ravel()将多维数组转换为一维数组 xx.ravel().shape ----> (250000,1)# np.c 中的c是column(列)的缩写,就是按列叠加两个矩阵,就是把两个矩阵左右组合,要求行数相等。# np.c_[xx.ravel(), yy.ravel()].shape ----> (250000,2) 就是说建立了250000个样本Z = Z.reshape(xx.shape)plt.contour(xx, yy, Z)# 等高线得作用就是画出分隔得线passmodels = [svm.SVC(C, kernel='linear') for C in [1, 100]]
# 支持向量机模型 (kernel:核函数选项,这里是线性核函数 , C:权重,这里取1和100)
# 线性核函数画的决策边界就是直线
clfs = [model.fit(X, y.ravel()) for model in models]    # model.fit:拟合出模型
score = [model.score(X, y) for model in models]        # [0.9803921568627451, 1.0]
# title = ['SVM Decision Boundary with C = {}(Example Dataset 1)'.format(C) for C in [1, 100]]def plot():title = ['SVM Decision Boundary with C = {}(Example Dataset 1)'.format(C) for C in [1, 100]]for model, title in zip(clfs, title):# zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。plt.figure(figsize=(8, 5))plotData(X, y)plotBoundary(model, X)  # 用拟合好的模型(预测那些250000个样本),绘制决策边界plt.title(title)passpass# plt.show()'''
2.SVM with Gaussian Kernels
'''def gaussKernel(x1, x2, sigma):return np.exp(-(x1 - x2) ** 2).sum() / (2 * sigma ** 2)a = gaussKernel(np.array([1, 2, 1]), np.array([0, 4, -1]), 2.)  # 0.32465246735834974
# print(a)'''
Example Dataset 2
'''mat = loadmat('data/ex6data2.mat')
x2 = mat['X']
y2 = mat['y']
plotData(x2, y2)
plt.show()sigma = 0.1
gamma = np.power(sigma, -2)/2
'''
高斯核函数中的gamma越大,相当高斯函数中的σ越小,此时的分布曲线也就会越高越瘦。
高斯核函数中的gamma越小,相当高斯函数中的σ越大,此时的分布曲线也就越矮越胖,smoothly,higher bias, lower variance
'''
clf = svm.SVC(C=1, kernel='rbf', gamma=gamma)
model = clf.fit(x2, y2.flatten())       # kernel='rbf'表示支持向量机使用高斯核函数
# https://blog.csdn.net/guanyuqiu/article/details/85109441
# plotData(x2, y2)
# plotBoundary(model, x2)
# plt.show()'''
Example Dataset3
'''
mat3 = loadmat('data/ex6data3.mat')
x3, y3 = mat3['X'], mat3['y']
Xval, yval = mat3['Xval'], mat3['yval']
plotData(x3, y3)
# plt.show()Cvalues = (0.01, 0.03, 0.1, 0.3, 1., 3., 10., 30.)  # 权重C的候选值
sigmavalues = Cvalues   # 核函数参数的候选值
best_pair, best_score = (0, 0), 0        # 最佳的(C,sigma)权值 ,决定系数(R2)
# 寻找最佳的权值(C,sigma)
for C in Cvalues:for sigma in sigmavalues:gamma = np.power(sigma, -2.) / 2model = svm.SVC(C=C, kernel='rbf', gamma=gamma)     # 使用核函数的支持向量机model.fit(x3, y3.flatten())      # 拟合出模型this_score = model.score(Xval, yval)        # 利用交叉验证集来选择最合适的权重'''model.score函数的返回值是决定系数,也称R2。可以测度回归直线对样本数据的拟合程度,决定系数的取值在0到1之间,决定系数越高,模型的拟合效果越好,即模型解释因变量的能力越强。'''# 选择拟合得最好得权重值if this_score > best_score:best_score = this_scorebest_pair = (C, sigma)passpass
print('最优(C, sigma)权值:', best_pair, '决定系数:', best_score)
# 最优(C, sigma)权值: (1.0, 0.1) 决定系数: 0.965
model = svm.SVC(1, kernel='rbf', gamma=np.power(0.1, -2.) / 2)
# 用确定好的权重再重新声明一次支持向量机
model.fit(x3, y3.flatten())
plotData(x3, y3)
plotBoundary(model, x3)
# plt.show()

参考链接:https://blog.csdn.net/Cowry5/article/details/80465922

吴恩达机器学习python实现(6):SVM支持向量机(文末附完整代码)相关推荐

  1. 吴恩达机器学习python作业之多变量线性回归

    建议先看单变量线性回归再看多变量线性回归哦. 参考链接: (7条消息) 吴恩达|机器学习作业1.1多变量线性回归_学吧学吧终成学霸的博客-CSDN博客 数据集:一共三列,左边两列是自变量x,最右边一列 ...

  2. 吴恩达机器学习python代码练习一(线性回归)

    吴恩达机器学习练习文件下载地址: 链接:https://pan.baidu.com/s/1RvUeG10FBpV9RyFtOX1Zdw 提取码:5b4x 单变量线性回归 import numpy as ...

  3. 吴恩达|机器学习作业6.1.SVM建立垃圾邮件分类器

    6.1.SVM建立垃圾邮件分类器 1)题目: 如今,许多电子邮件服务提供垃圾邮件过滤器,能够将电子邮件精确地分类为垃圾邮件和非垃圾邮件.在本部分练习中,您将使用SVM构建自己的垃圾邮件过滤器. 您将训 ...

  4. 吴恩达机器学习python代码练习三(多类别分类)

    import numpy as np import pandas as pd import matplotlib.pyplot as plt import scipy.io as sio from s ...

  5. python下载某短视频平台音视频、评论、点赞数(详细教程,文末附完整代码

    前言 整理一下python在抖音网页版的应用 以抓取一个视频及评论为例进行讲解 获取视频 url 随便找一个视频,点击进入详情,页面中地址栏里就是该视频的 url . 手机端复制链接后,先粘到浏览器地 ...

  6. 吴恩达机器学习(二十三)支持向量机、大间距分类器

    文章目录 1.支持向量机 2.大间距分类器 1.支持向量机 2.大间距分类器   对于支持向量机的代价函数,如果C非常非常大,那么当最小化优化目标的时候,我们希望找到一项使得第一项为0: 我们可以这样 ...

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

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

  8. 吴恩达机器学习ex1-matlab版学习总结笔记-(1)单变量线性回归

    作业任务项一:5*5矩阵A 代码如下: A=eye(5); eye()是单位矩阵,除了对角线为1,其余项都为0.5为矩阵维度,即生成5*5矩阵. 作业任务项二:单变量线性回归预测 代码如下: data ...

  9. 吴恩达机器学习作业Python实现(六):SVM支持向量机

    吴恩达机器学习系列作业目录 1 Support Vector Machines 1.1 Example Dataset 1 %matplotlib inline import numpy as np ...

最新文章

  1. 微信小程序通用开发框架小程序端包含若干基础组件
  2. android 原色调渲染
  3. ATS读小文件(内存命中)
  4. 内存迟迟下不去,可能你就差一个GC.Collect
  5. c#计算长方形的周长和面积公式_Java面向对象练习题之计算圆的面积和周长
  6. MicroShift - 一个超轻量级 OpenShift 环境
  7. python 线程池的研究及实现
  8. 【RobotStudio学习笔记】(七)工件坐标
  9. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第2节 线程实现方式_10_Thread类的常用方法_设置线程名称...
  10. subsonic orm_Hanselminutes播客132-Subsonic与Rob Conery
  11. 哔哩下载姬(downkyi)v1.4.0 B站视频下载工具 哔哩哔哩视频解析
  12. 英特尔图形安装程序的linux,如何在我的系统中安装英特尔图形驱动程序?
  13. 咱们的课程里,有微信的这种菜单示例吗?---酷课堂iOS交流群问答整理(201810期)
  14. VSCode官方下载网址
  15. android 真正的全屏沉浸式实现
  16. Mysql中使用逗号隔开多张表生成的表实例
  17. 2021 第十二届 蓝桥杯 国赛决赛 Java B组 真题 详细解析
  18. 计算机维修高级工考试员题库,职业技能鉴定国家题库统一试卷高级计算机维修工知识试题...
  19. HTML+CSS+原生JS写一个简易的音乐播放器(仅播放一首歌)
  20. 求最大公约数及求多个数的最大公约数

热门文章

  1. 微信刷阅读量php源码,微信刷阅读量软件工具
  2. 学习记录1-一元线性回归模型(附上python代码)
  3. 基于Pyramidbox实现的大规模人脸检测
  4. 前端小项目 QuizApp 答题卡片
  5. Windows 下读取 Linux 系统文件 神器 Paragon ExtFS for Windows
  6. EasyPoi实现excel文件导入导出
  7. STM32MP157驱动开发——Linux 网络设备驱动
  8. 网络安全——文件包含漏洞
  9. 文件包含漏洞-知识点
  10. 加速Eclipse使其成为超快的IDE