1.写在前面 吴恩达机器学习的课后作业及数据可以在coursera平台上进行下载,只要注册一下就可以添加课程了。所以这里就不写题目和数据了,有需要的小伙伴自行去下载就可以了。
作业及数据下载网址:吴恩达机器学习课程
2.数据集一 数据集一中,我们主要是通过修改参数C来观察结果的变化。
下面附上代码,有详细的注释,这里就不一一解释了。
# author:FLC
# time:2021/6/30import numpy as np
import scipy.io as scio
import matplotlib.pyplot as plt
from sklearn.svm import SVC# 用于导入数据的函数
def input_data():
# 导入训练集的路径
data_file = 'machine-learning-ex6\\machine-learning-ex6\\ex6\\ex6data1.mat'
# 导入训练集
data = https://www.it610.com/article/scio.loadmat(data_file)
X = data['X']
y = data['y']
return X, y# 用于可视化数据和绘制决策边界的函数
def plot_data_and_decision_bounday(X, y):
# 绘制训练集数据的散点图
fig, ax = plt.subplots(1, 1)
for i in range(0, X.shape[0]):
if y[i][0] == 1:
ax.scatter(X[i][0], X[i][1], color='r', marker='+')
else:
ax.scatter(X[i][0], X[i][1], color='b', marker='o')
ax.set_xticks(np.arange(0, 5, 0.5))
ax.set_yticks(np.arange(1.5, 5.5, 0.5))# SVM分类器的训练
svc = SVC(C=100, kernel='linear')# 构建一个线性分类器,其中C=100
svc.fit(X, y.flatten())# 使用(X,y)来进行训练,注意这里的y要转换成一维向量
x_min, x_max = -0.5, 4.5# 定义x最小最大
y_min, y_max = 1.5, 5# 定义y最小最大
xx, yy = np.meshgrid(np.linspace(x_min, x_max, 500),# 生成网格
np.linspace(y_min, y_max, 500))z = svc.predict(np.c_[xx.flatten(), yy.flatten()])# 通过训练好的分类器进行预测
zz = z.reshape(xx.shape)# 重构一下维度
ax.contour(xx, yy, zz)# 绘制等高线图
plt.show()X, y = input_data()# 导入数据
plot_data_and_decision_bounday(X, y)# 绘制决策边界
结果展示:
C=1
文章图片
C=100
文章图片
2.数据集二 数据集二中,我们主要是通过修改参数gamma来观察结果的变化。
下面附上代码,有详细的注释,这里就不一一解释了。
# author:FLC
# time:2021/6/30import numpy as np
import pandas as pd
import scipy.io as scio
import matplotlib.pyplot as plt
from sklearn.svm import SVC
from scipy.optimize import minimize# 用于导入数据的函数
def input_data():
# 导入训练集的路径
data_file = 'machine-learning-ex6\\machine-learning-ex6\\ex6\\ex6data2.mat'
# 导入训练集
data = https://www.it610.com/article/scio.loadmat(data_file)
X = data['X']
y = data['y']
return X, y# 用于可视化数据和绘制决策边界的函数
def plot_data_and_decision_bounday(X, y):
# 绘制训练集数据的散点图
fig, ax = plt.subplots(1, 1)
for i in range(0, X.shape[0]):
if y[i][0] == 1:
ax.scatter(X[i][0], X[i][1], color='r', marker='+')
else:
ax.scatter(X[i][0], X[i][1], color='b', marker='o')
ax.set_xticks(np.arange(0, 1.1, 0.1))
ax.set_yticks(np.arange(0.4, 1.1, 0.1))# SVM分类器的训练
# 构建一个线性分类器,这里尝试修改gamma,gamma=1/(2*σ)平方,因此gamma越大,σ越小,偏差越小,方差越大
svc = SVC(C=100, kernel='rbf', gamma=100)
svc.fit(X, y.flatten())# 使用(X,y)来进行训练,注意这里的y要转换成一维向量
x_min, x_max = -0, 1.1# 定义x最小最大
y_min, y_max = 0.4, 1.1# 定义y最小最大
xx, yy = np.meshgrid(np.linspace(x_min, x_max, 500),
np.linspace(y_min, y_max, 500))z = svc.predict(np.c_[xx.flatten(), yy.flatten()])# 生成网格
zz = z.reshape(xx.shape)# 重构一下维度
ax.contour(xx, yy, zz)# 绘制等高线图
plt.show()X, y = input_data()# 导入数据
plot_data_and_decision_bounday(X, y)# 绘制决策边界
结果展示:
gamma=1
文章图片
gamma=100
文章图片
3.数据集三 数据集三中,我们主要是要实现自动选择C和gamma
下面附上代码,有详细的注释,这里就不一一解释了。
# author:FLC
# time:2021/6/30import numpy as np
import pandas as pd
import scipy.io as scio
import matplotlib.pyplot as plt
from sklearn.svm import SVC
from scipy.optimize import minimize# 用于导入数据的函数
def input_data():
# 导入训练集的路径
data_file = 'machine-learning-ex6\\machine-learning-ex6\\ex6\\ex6data3.mat'
# 导入训练集
data = https://www.it610.com/article/scio.loadmat(data_file)
X = data['X']
y = data['y']
# 导入交叉验证集
X_val = data['Xval']
y_val = data['yval']
return X, y, X_val, y_val# 用于自动选择参数的函数
def auto_select_para(X, y, X_val, y_val):
para_array = [0.01, 0.03, 0.1, 0.3, 1, 3, 10, 30]# 定义参数数组
accuary = 0# 定义精确度
opt_gamma = 0# 定义最优gamma,gamma=1/(2*σ)平方,因此gamma越大,σ越小,偏差越小,方差越大
opt_C = 0# 定义最优C
for p_gamma in para_array:# 遍历gamma
for p_C in para_array:# 遍历C
svc = SVC(C=p_C, kernel='rbf', gamma=p_gamma)# 构建一个线性分类器
svc.fit(X, y.flatten())# 进行训练
if svc.score(X_val, y_val) > accuary:# 比较交叉验证集精确度
accuary = svc.score(X_val, y_val)
opt_gamma = p_gamma# 进行替换
opt_C = p_C# 进行替换
print(accuary)# 打印精确度
print(opt_C)# 打印最佳C
print(opt_gamma)# 打印最佳gamma
return opt_gamma, opt_C# 用于可视化数据和绘制决策边界的函数
def plot_data_and_decision_bounday(X, y, opt_gamma, opt_C):
# 绘制训练集数据的散点图
fig, ax = plt.subplots(1, 1)
for i in range(0, X.shape[0]):
if y[i][0] == 1:
ax.scatter(X[i][0], X[i][1], color='r', marker='+')
else:
ax.scatter(X[i][0], X[i][1], color='b', marker='o')
ax.set_xticks(np.arange(-0.6, 0.4, 0.1))
ax.set_yticks(np.arange(-0.8, 0.7, 0.2))# SVM分类器的训练
svc = SVC(C=opt_C, kernel='rbf', gamma=opt_gamma)# 构建一个线性分类器,参数采用最优值
svc.fit(X, y.flatten())# 使用(X,y)来进行训练,注意这里的y要转换成一维向量
x_min, x_max = -0.6, 0.4# 定义x最小最大
y_min, y_max = -0.8, 0.7# 定义y最小最大
xx, yy = np.meshgrid(np.linspace(x_min, x_max, 500),# 生成网格
np.linspace(y_min, y_max, 500))z = svc.predict(np.c_[xx.flatten(), yy.flatten()])# 通过训练好的分类器进行预测
zz = z.reshape(xx.shape)# 重构一下维度
ax.contour(xx, yy, zz)# 绘制等高线图
plt.show()X, y, X_val, y_val = input_data()# 导入数据
opt_gamma, opt_C = auto_select_para(X, y, X_val, y_val)# 自动选择最优参数
plot_data_and_decision_bounday(X, y, opt_gamma, opt_C)# 绘制决策边界
结果展示:
文章图片
3.邮件分类数据集 邮件分类数据集中,因为这里主要是学习SVM的使用,就不进一步探讨如何实现具体的向量化操作,只给出如何使用SVM
下面附上代码,有详细的注释,这里就不一一解释了。
# author:FLC
# time:2021/6/30import scipy.io as scio
from sklearn.svm import SVC# 用于导入数据的函数
def input_data():
# 导入训练集的路径
data_file1 = 'machine-learning-ex6\\machine-learning-ex6\\ex6\\spamTrain.mat'
data_file2 = 'machine-learning-ex6\\machine-learning-ex6\\ex6\\spamTest.mat'
data1 = scio.loadmat(data_file1)
data2 = scio.loadmat(data_file2)
# 导入训练集
X = data1['X']
y = data1['y']
# 导入测试集
X_test = data2['Xtest']
y_test = data2['ytest']
return X, y, X_test, y_test# 自动选择参数
def auto_select_para(X, y, X_val, y_val):
para_array = [0.01, 0.03, 0.1, 0.3, 1, 3, 10, 30]# 定义参数数组
accuary = 0# 定义精确度
opt_gamma = 0# 定义最优gamma,gamma=1/(2*σ)平方,因此gamma越大,σ越小,偏差越小,方差越大
opt_C = 0# 定义最优C
for p_gamma in para_array:# 遍历gamma
for p_C in para_array:# 遍历C
svc = SVC(C=p_C, kernel='linear', gamma=p_gamma)# 构建一个线性分类器
svc.fit(X, y.flatten())# 进行训练
if svc.score(X_val, y_val) > accuary:# 比较交叉验证集精确度
accuary = svc.score(X_val, y_val)
opt_gamma = p_gamma# 进行替换
opt_C = p_C# 进行替换
print('accuary',accuary*100)# 打印精确度X, y, X_test, y_test = input_data()# 导入数据
auto_select_para(X, y, X_test, y_test)# 自动选择最优参数并计算精确度
【吴恩达机器学习笔记|吴恩达机器学习课后作业——支持向量机】结果展示:
文章图片
推荐阅读
- #|【机器学习-样例】聚类模型
- 吴恩达机器学习笔记|吴恩达机器学习课后作业——KMeans和PCA
- 机器学习|吴恩达机器学习课后作业——多元分类
- 机器学习算法入门|机器学习算法入门梳理——逻辑回归的分类预测详解
- 机器学习|机器学习碎碎念之逻辑回归
- PyQt5 实现状态栏(statusBar)显示和隐藏功能
- python|基于Python实现损失函数的参数估计
- 算法|基于Python实现k-means算法和混合高斯模型
- 人脸及表情分类|微表情识别的图片预处理(python版)