吴恩达机器学习笔记|吴恩达机器学习课后作业——支持向量机

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)# 自动选择最优参数并计算精确度

【吴恩达机器学习笔记|吴恩达机器学习课后作业——支持向量机】结果展示:
吴恩达机器学习笔记|吴恩达机器学习课后作业——支持向量机
文章图片

    推荐阅读