吴恩达机器学习作业6 :Support Vector Machines

一、python中支持向量机(SVM)的用法

在官网的识别手写数字的实例中:

classifier = svm.SVC(gamma=0.001)

X_train, X_test, y_train, y_test = train_test_split(
    data, digits.target, test_size=0.5, shuffle=False)

classifier.fit(X_train, y_train)

predicted = classifier.predict(X_test)

1.首先构建一个分类器classifier。svm.SVC:分类的方式是支持向量机器(SVM)中的 Support Vector Classification(SVC)支持向量分类。也就是说这里的svm用来做分类处理而不是回归(预测一个连续值)。gamma的值与后面用高斯核函数时的sigma值是有关系的:gamma = 1 / (sigma)^2

2.train_test_split 函数用来将数据集分成训练集和测试集,test_size=0.5 表示按五五开的比列划分,shuffle=False表示在划分之前不将数据随机重组。

3.classifier.predict(X_test) 表示预测测试集X_test中的结果。

在使用之前调用的包:

from sklearn.svm import SVC
from sklearn import svm

二、python实现

1.数据可视化、使用SVM做分类处理

path = r'ex6data1.mat'
data1 = scio.loadmat(path)

X = data1['X']
y = data1['y']

#数据可视化data1
plot_data(X, y)

#svm线性模型
clf = svm.SVC(C=1, kernel='linear')
clf.fit(X, y.flatten())
visualize_boundary(X, y, clf, 0, 5, 1.5, 5)

#高斯核
x1 = [1, 2, 1]
x2 = [0, 4, -1]
sigma = 2
sim = guassian_kernel(x1, x2, sigma)

原始数据:
在这里插入图片描述
上面用到的界限划分函数 visualize_boundary :

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from plotData import plot_data

def visualize_boundary(x, y, clf, xmin, xmax, ymin, ymax):

    #散点图
    plot_data(x, y)

    #分界线
    xx, yy = np.meshgrid(np.arange(xmin, xmax, .02), np.arange(ymin, ymax, .02))
    z = clf.predict(np.c_[xx.flatten(), yy.flatten()])
    z = z.reshape(xx.shape)
    plt.contour(xx, yy, z, levels=[0])
    plt.show()

设置惩罚参数C,C越大越使划分强行考虑到所有的点:

C = 100,强制让所有的分类正确。
在这里插入图片描述
C = 1,异常点的分类是不正确的,但是划分符合实际情况。
在这里插入图片描述

2 .非线性边界的划分

1.数据可视化(例子一)

path = r'ex6data2.mat'
data2 = scio.loadmat(path)

X = data2['X']
y = data2['y']

plot_data(X, y)
plt.show()

#svm高斯模型
clf = svm.SVC(C=100, kernel='rbf')
clf.fit(X, y.flatten())
visualize_boundary(X, y, clf, 0, 1, 0.4, 1)

原始数据:
在这里插入图片描述
高斯核处理非线性分类后:
在这里插入图片描述

2.数据可视化(例子二)

path = r'ex6data3.mat'
data3 = scio.loadmat(path)

X = data3['X']
y = data3['y']

Xval = data3['Xval']
yval = data3['yval']


plot_data(X, y)
plt.show()

#svm高斯模型
clf = svm.SVC(C=100, kernel='rbf')
clf.fit(X, y.flatten())
visualize_boundary(X, y, clf, -0.6, 0.3, -0.8, 0.6)

划分结果(C = 100)
在这里插入图片描述
选择最佳C,sigma

C, sigma, corr = choice_best_para(X, y, Xval, yval)

选择函数:

import numpy as np
from predict import predict
from sklearn import svm


def choice_best_para(x, y, xval, yval):

    C = [0.01, 0.03, 0.1, 0.3, 1, 3, 10, 30, 100]
    sigma = [0.01, 0.03, 0.1, 0.3, 1, 3, 10, 30, 100]

    C_best = 0
    sigma_best = 0
    corr_rate_best = 0

    for i in range(9):
        for j in range(9):

            clf = svm.SVC(C=C[i], kernel='rbf', gamma=1/(np.power(sigma[j], 2)*2))
            clf.fit(x, y.flatten())
            y_pred = clf.predict(xval)

            corr_rate = predict(y_pred, yval)

            if corr_rate > corr_rate_best:

                corr_rate_best = corr_rate
                C_best = C[i]
                sigma_best = sigma[j]

    return C_best, sigma_best, corr_rate_best

predict 函数:

import numpy as np


def predict(y_pred, yval):

    yval = yval.flatten()
    corr_rate = np.mean(np.where(y_pred == yval, 1, 0))

    return corr_rate

结果:
在这里插入图片描述

三、垃圾邮件的识别

预处理函数暂时写不出来,有时间再补上。。。。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值