【机器学习】吴恩达作业6.0,python实现SVM支持向量机

6.0支持向量机
使用支持向量机(SVM)处理各种两维的样本数据集,了解支持向量机如何工作,以及如何使用带高斯核函数的SVM。

SVM(鲁棒性,大间距分类器)
支持向量机(support vector machines, SVM)是一种 二分类模型,它的基本模型是定义在特征空间上的 间隔最大的 线性分类器 ,间隔最大使它有别于感知机;SVM还包括 核技巧 ,这使它成为实质上的非线性分类器。 SVM的的学习策略就是间隔最大化,可形式化为一个求解凸二次规划的问题,也等价于正则化的合页损失函数的最小化问题。 SVM的的学习算法就是求解凸二次规划的最优化算法。

假设函数

【机器学习】吴恩达作业6.0,python实现SVM支持向量机,【机器学习】吴恩达作业6.0,python实现SVM支持向量机 = 1

【机器学习】吴恩达作业6.0,python实现SVM支持向量机,【机器学习】吴恩达作业6.0,python实现SVM支持向量机 = 0

【机器学习】吴恩达作业6.0,python实现SVM支持向量机

带正则化的损失函数

【机器学习】吴恩达作业6.0,python实现SVM支持向量机

核函数 :

【机器学习】吴恩达作业6.0,python实现SVM支持向量机, x far from 【机器学习】吴恩达作业6.0,python实现SVM支持向量机,【机器学习】吴恩达作业6.0,python实现SVM支持向量机

Predict 1,if

【机器学习】吴恩达作业6.0,python实现SVM支持向量机

给新特征x,计算x与标记点的距离之和,标记点在给的特征向量里选择

【机器学习】吴恩达作业6.0,python实现SVM支持向量机

【机器学习】吴恩达作业6.0,python实现SVM支持向量机

【机器学习】吴恩达作业6.0,python实现SVM支持向量机

SVM与核函数

给定特征向量,计算核函数,

【机器学习】吴恩达作业6.0,python实现SVM支持向量机, x far from 【机器学习】吴恩达作业6.0,python实现SVM支持向量机,【机器学习】吴恩达作业6.0,python实现SVM支持向量机,得到【机器学习】吴恩达作业6.0,python实现SVM支持向量机,判断y = 1

【机器学习】吴恩达作业6.0,python实现SVM支持向量机

参数

C =

【机器学习】吴恩达作业6.0,python实现SVM支持向量机

C值大,低偏差,高方差,C值小,高偏差,低方差

【机器学习】吴恩达作业6.0,python实现SVM支持向量机

【机器学习】吴恩达作业6.0,python实现SVM支持向量机大,特征变化较缓,高偏差,低方差。

【机器学习】吴恩达作业6.0,python实现SVM支持向量机小,特征变化较快,低偏差,高方差

【机器学习】吴恩达作业6.0,python实现SVM支持向量机

选择

当特征数量多、训练集数量较少时,一般选用逻辑回归或者不带核函数的SVM(线性核函数)
当特征数量少、训练集数量适中时,一般选用带高斯核函数的SVM
当特征数量少、训练集数量很大时,一般选用逻辑回归或者不带核函数的SVM(如果用高斯核函数可能过慢)
对于大部分情况神经网络表现都很好,但是训练慢。
且SVM是凸优化问题,因此总会找到一个全局最小值,不用担心局部极小的情况。
逻辑回归与SVM比较:逻辑回归对异常值敏感,SVM对异常值不敏感(抗噪能力强)——支持向量机改变非支持向量样本并不会引起决策面的变化;但是逻辑回归中改变任何样本都会引起决策面的变化

【机器学习】吴恩达作业6.0,python实现SVM支持向量机

python

1 Scikit-learn(sklearn)是机器学习中常用的第三方模块,对常用的机器学习方法进行了封装,包括回归(Regression)、降维(Dimensionality Reduction)、分类(Classfication)、聚类(Clustering)等方法。里面包含了SVM的程序,直接调用调节参数即可。
2 svm.SVC( ) 可以选择C值,以及核函数,调用之后先fit,再predict,predict时输入为一个二维数组,因此在画等高线的时候需要先把网格展开成二维数组进行predict再重新组成网格画图。在选择核函数时可以自己定义,例如:svm.SVC(kernel=my_kernel),内置核函数默认为rbf高斯核,其中包含一个gamma关键词,gamma默认为1/n_features。

1 线性可分SVM

1.1 导入数据可视化

import numpy as np
import matplotlib.pyplot as plt
import scipy.io as sio

data1 = sio.loadmat('ex6data1')
data2 = sio.loadmat('ex6data2')
data3 = sio.loadmat('ex6data3')

data1.keys()#dict_keys(['__header__', '__version__', '__globals__', 'X', 'y'])
data2.keys()#dict_keys(['__header__', '__version__', '__globals__', 'X', 'y'])
data3.keys()#dict_keys(['__header__', '__version__', '__globals__', 'X', 'y', 'yval', 'Xval'])

X1,y1 = data1['X'],data1['y'].flatten()
X2,y2 = data2['X'],data2['y'].flatten()
X3,y3 = data3['X'],data3['y'].flatten()
Xval,yval = data3['Xval'],data3['yval'].flatten()
X1.shape,y1.shape#((51, 2), (51,))
X2.shape,y2.shape#((863, 2), (863,))
X3.shape,y3.shape#((211, 2), (211,))
Xval.shape,yval.shape#((200, 2), (200,))

def plot_data(x,y):
    n = x[y == 0]
    p = x[y == 1]
    plt.scatter(p[:,0],p[:,1],c='r', marker='x', label='y=1')
    plt.scatter(n[:,0],n[:,1],c='g', marker='o', edgecolors='g', linewidths=0.5, label='y=0')
    plt.legend()
    plt.show

【机器学习】吴恩达作业6.0,python实现SVM支持向量机

1.2 用sklearn拟合并预测

from sklearn.svm import SVC
svc1 =SVC(C = 1,kernel = 'linear')#线性核函数
svc1.fit(X1,y1.flatten())

svc1.predict(X1)

svc1.score(X,y.flatten())#0.9803921568627451

1.3 决策边界

#决策边界
def plot_boundary(svc,x):
    u = np.linspace(np.min(X1[:,0]),np.max(X1[:,0]),500)
    v = np.linspace(np.min(X1[:,1]),np.max(X1[:,1]),500)
    x,y = np.meshgrid(u,v)#将x,y转化为网格(500*500)
    z = svc.predict(np.c_[x.flatten(),y.flatten()])#因为predict中是要输入一个二维的数据,因此需要展开
    z = z.reshape(x.shape) #重新转为网格
    plt.contour(x,y,z,1,colors = 'b') #画等高线
    plt.title('The Decision Boundary')
    plt.show

plt.figure(1)
plot_data(X1, y1)
plot_boundary(svc1, X1)
plt.show

【机器学习】吴恩达作业6.0,python实现SVM支持向量机

2 线性不可分SVM

可视化并训练模型

plot_data(X2,y2)
#定义高斯函数
def gaussianKernel(x1,x2,sigma):
    return np.exp( -((x1-x2).T@(x1-x2)) / (2*sigma*sigma) )

a1 = np.array([1, 2, 1])
a2 = np.array([0, 4, -1])
sigma = 2
gaussianKernel(a1, a2, sigma)

#训练模型(这里使用内置高斯核)
svc2 = SVC(C = 100,kernel = 'rbf',gamma=np.power(0.1, -2)/2)##对应sigma=0.1
svc2.fit(X2,y2)

svc2.predict([[0.4, 0.9]])
svc2.score(X2,y2.flatten())

#画图
plt.figure(2)
plot_data(X2, y2)
plot_boundary(svc2, X2)
plt.show

【机器学习】吴恩达作业6.0,python实现SVM支持向量机

3 在验证集上寻找最佳参数

plot_data(X3,y3)
plot_data(Xval, yval)

【机器学习】吴恩达作业6.0,python实现SVM支持向量机
#寻找最优参数C和gamma
gammas = [0.01,0.03,0.1,0.3,1,3,10,30,100]#9
Cvalues = [0.01,0.03,0.1,0.3,1,3,10,30,100]#9
best_score = 0
best_pramas = (0,0)
for c in Cvalues:
    for gamma in gammas:
        svc3 = SVC(c,kernel = 'rbf')
        svc3.fit(X3,y3)
        score = svc3.score(Xval,yval)
        if score > best_score:
            best_score = score
            best_pramas = (c,gamma)

print(best_score,best_pramas)#0.96 (30, 0.01)

plt.figure(3)
plot_data(X3, y3)
plot_boundary(svc3, X3)
plt.show

【机器学习】吴恩达作业6.0,python实现SVM支持向量机

Original: https://blog.csdn.net/m0_51933492/article/details/123918970
Author: —Xi—
Title: 【机器学习】吴恩达作业6.0,python实现SVM支持向量机

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/631052/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球