城乡建设网站职业查询系统,盗用别的公司网站模块,质量好网站建设哪家便宜,北京网站建设策划建设公司0、前言#xff1a;
SVM应用#xff1a;主要针对小样本数据进行学习、分类和回归#xff08;预测#xff09;#xff0c;能解决神经网络不能解决的过学习问题#xff0c;有很好的泛化能力。#xff08;注意#xff1a;SVM算法的数学原理涉及知识点比较多#xff0c;所…0、前言
SVM应用主要针对小样本数据进行学习、分类和回归预测能解决神经网络不能解决的过学习问题有很好的泛化能力。注意SVM算法的数学原理涉及知识点比较多所以应用比理解更重要原理由二分类问题引出如下图问题是找到一条最宽的路劲划分两种分类且路径1/2处的直线就是最优的直线。 进而将问题由二维x轴和y轴特征数据的分类拓展到更高维度的分类问题中将问题转换为了多维问题就会涉及向量和求极值最终将支持向量的优化目标就由间隔最大化问题转化为了标准凸优化问题标准凸优化是计算机当中数学问题的描述然后就可以得到支持向量机算法。支持向量机算法 输入m条训练数据S {(x1,y1),(x2,y2),…,(xm,ym)} 前提训练数据中正负采样存在分离平面 模型假设H 关于wxb 计算w和b的最优解 输出模型H支持向量机的对偶将求解代约束的凸优化问题转化为求解它的对偶问题。然后借助拉格朗日求解对应的函数这个函数的意义对于二维特征来说就是一条可以划分二分类问题的最优直线对于三维特征来说就是一个可以划分空间中二分类问题的最优平面。如下图所示就是二维特征的SVM所求直线A 如下图就是多维特征求最优划分的平面因为在原始空间中无法用一条直线划分进而采用核技巧将问题放到高维空间进而划分数据核技巧也称核变换是解决低纬度不可分问题的一个技巧。 支持向量机当中会有一些核函数有线性核函数和高斯核函数。 1、支持向量机的分类示例
目的通过sklearn.datasets中的make_blobs生成2个类型的聚类然后用SVC模型训练数据借助模型的属性生成分类最优分界线同时生成支持向量对应的直线代码
# 导库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt# SVM分类和回归库
from sklearn.svm import SVC,SVR
# 生成二分类数据
from sklearn.datasets import make_blobs
data,target make_blobs(centers2)
plt.scatter(data[:,0],data[:,1],ctarget)
# 训练数据
# pd.DataFrame(data).head()
# data.shape,target.shape
sv SVC(C1,kernellinear)SVC当中的参数说明
1、C越大表示约分类越严格对于一些噪声就不%%sh略可能会导致分类效果差
2、kernel核函数一般选默认的rbf高斯核函数建议使用默认
此外还有linear线性核函数、poly多项式核函数等sv.fit(data,target)# 画出通过SVM训练之后的最优分界线
# w1*x1w2*x2b0
# 首先获取斜率和截距
# sv.coef_[0] # array([-0.69045562, -0.92961922])
# sv.coef_.shape # (1, 2)
w1,w2 sv.coef_[0]
b sv.intercept_[0]
# 画分界线
plt.scatter(data[:,0],data[:,1],ctarget)
x1 np.linspace(-7,-2,100)
x2 -1 * (w1*x1b)/w2
plt.plot(x1,x2,cr)
# 画支持向量
x1_s sv.support_vectors_[:,0]
x2_s sv.support_vectors_[:,1]
plt.scatter(x1_s,x2_s,s200,alpha0.3,cb)
# 画支持向量对应的直线用虚线表示
b1 -1*(w1*x1_s[1]w2*x2_s[1])
b2 -1*(w1*x1_s[2]w2*x2_s[2])
x2_1 -1 * (w1*x1b1)/w2
x2_2 -1 * (w1*x1b2)/w2
plt.plot(x1,x2_1,linestyle--,linewidth5,cr)
plt.plot(x1,x2_2,linestyle--,linewidth5,cr)
结果 2、支持向量机回归示例
目的用SVM算法中的SVR预测sin函数代码
# 导包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.svm import SVR
# 制作训练数据
x np.random.random(150)*10
y np.sin(x)# 添加噪声
y[::5] np.random.randn(30)*0.1plt.scatter(x,y)
# 制作测试数据
x_test np.linspace(0,10,100)
# 训练数据
sv_line SVR(kernellinear)
sv_line.fit(x.reshape(-1,1),y)
y_line_pred sv_line.predict(x_test.reshape(-1,1))sv_poly SVR(kernelpoly)
sv_poly.fit(x.reshape(-1,1),y)
y_poly_pred sv_poly.predict(x_test.reshape(-1,1))sv_rbf SVR(kernelrbf)
sv_rbf.fit(x.reshape(-1,1),y)
y_rbf_pred sv_rbf.predict(x_test.reshape(-1,1))
# 画图
plt.scatter(x,y)
plt.plot(x_test,y_line_pred,labelline,cr)
plt.plot(x_test,y_poly_pred,labelploy)
plt.plot(x_test,y_rbf_pred,labelrbf)
plt.legend(loclower left)结果 总结
对应二维平面不可分的数据使用高斯核函数kernel‘rbf’是是最好的选择