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

1.写在前面

吴恩达机器学习的课后作业及数据可以在coursera平台上进行下载,只要注册一下就可以添加课程了。所以这里就不写题目和数据了,有需要的小伙伴自行去下载就可以了。
作业及数据下载网址:吴恩达机器学习课程

2.数据集一

数据集一中,我们主要是通过修改参数C来观察结果的变化。

下面附上代码,有详细的注释,这里就不一一解释了。

# author:FLC
# time:2021/6/30

import 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 = 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
吴恩达机器学习课后作业——支持向量机_第1张图片
C=100
吴恩达机器学习课后作业——支持向量机_第2张图片

2.数据集二

数据集二中,我们主要是通过修改参数gamma来观察结果的变化。

下面附上代码,有详细的注释,这里就不一一解释了。

# author:FLC
# time:2021/6/30

import 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 = 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
吴恩达机器学习课后作业——支持向量机_第3张图片
gamma=100
吴恩达机器学习课后作业——支持向量机_第4张图片

3.数据集三

数据集三中,我们主要是要实现自动选择C和gamma

下面附上代码,有详细的注释,这里就不一一解释了。

# author:FLC
# time:2021/6/30

import 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 = 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)  # 绘制决策边界

结果展示:
吴恩达机器学习课后作业——支持向量机_第5张图片

3.邮件分类数据集

邮件分类数据集中,因为这里主要是学习SVM的使用,就不进一步探讨如何实现具体的向量化操作,只给出如何使用SVM

下面附上代码,有详细的注释,这里就不一一解释了。

# author:FLC
# time:2021/6/30

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

结果展示:
吴恩达机器学习课后作业——支持向量机_第6张图片

你可能感兴趣的:(吴恩达机器学习笔记,吴恩达,机器学习,python,svm,支持向量机)