-
支持向量机算法
2015-03-08 20:13:44支持向量机算法实现,简单易懂,实现多分类 -
支持向量机算法_支持向量机算法学习笔记(二)
2020-12-16 02:57:20上节的支持向量机分类:若存在异常点,用上节的支持向量机算法进行分类:由上述分类结果可知,若存在异常点,用上节的支持向量机进行分类,泛化性能较差。解决方法是给目标函数添加一个松弛变量,i表示样本编号。...上节的支持向量机分类:
若存在异常点,用上节的支持向量机算法进行分类:
由上述分类结果可知,若存在异常点,用上节的支持向量机进行分类,泛化性能较差。
解决方法是给目标函数添加一个松弛变量
,i表示样本编号。
目标函数:
约束条件:
其中惩罚参数C>0,C越大表示对误分类的惩罚越大。
最小化目标函数可以参考第一节,用拉格朗日函数将有约束的目标函数转换为无约束的目标函数,即:
其中
要优化的目标函数:
可转换为对偶问题:
令其偏导数等于0:
得:
利用上式得到的结果,代入目标函数,消除参数w和b,得:
最大化
,约束条件为:
利用SMO算法求解
。
后面的计算与支持向量机(一)一致,若得到
的结果,通过下式
求得模型的参数w。
1)当 0,所对应的样本
落在分割边界上,即支持向量点。根据这些样本求解对应的参数b,有:
因此:
求所有满足α条件的样本参数b的平均值,若 0
根据参数w和b,即可得最优分类超平面:
2)若α=0时,那么对应得样本已正确分类。
3)若α=C时,那么对应的样本有可能存在误分类得情况,这个需要看每个样本的松弛变量
。
我们再来看目标函数的约束条件,根据KKT条件有:
上面的等式等价于样本点到超平面的距离为:
样本点到对应类别支持向量的距离为:
i) 若0<=
<1,那么该样本点被正确分类,样本点所在位置是分类超平面与所属类别的间隔边界之间,如下图红色的样本点:
ii)
=1时,该样本点所在的位置是最优超平面,无法被正确分类,如下图红色的样本点:
iii)
>1时,该样本点所在的位置是所属另一个类的边界,如下图红色的样本点:
备注:红色样本点与黑色样本点所属相同的类。
欢迎扫码关注:
-
边界向量下的支持向量机算法
2020-05-11 12:06:41针对传统支持向量机中存在原始数据量过大导致训练速度太慢的问题,同时考虑到非支持向量对支持向量机的训练性能无影响,且影响支持向量机性能的支持向量往往位于边界的特点,提出一种提取边界向量的支持向量机算法.... -
支持向量机算法详细推导.ppt
2020-11-17 04:09:59支持向量机算法详细推导.ppt -
机器学习之支持向量机算法
2019-07-30 16:30:05支持向量机算法概述
-
支持向量机(Support Vector Machines, SVM):是一种机器学习算法。 支持向量(Support Vector)就是离分隔超平面最近的那些点。 机(Machine)就是表示一种算法,而不是表示机器。
-
当一个分类问题,数据是线性可分的,也就是用一根棍就可以将两种小球分开的时候,我们只要将棍的位置放在让小球距离棍的距离最大化的位置即可,寻找这个最大间隔的过程,就叫做最优化。但是,现实往往是很残酷的,一般的数据是线性不可分的,也就是找不到一个棍将两种小球很好的分类。这个时候,我们就需要像大侠一样,将小球拍起,用一张纸代替小棍将小球进行分类。想要让数据飞起,我们需要的东西就是核函数(kernel),用于切分小球的纸,就是超平面。
原理
1.寻求最优分类边界
正确:对大部分样本可以正确地划分类别。
泛化:最大化支持向量间距。
公平:与支持向量等距。
简单:线性,直线或平面,分割超平面。2.基于核函数的升维变换
通过名为核函数的特征变换,增加新的特征,使得低维度空间中的线性不可分问题变为高维度空间中的线性可分问题。
线性核函数:linear,不通过核函数进行维度提升,仅在原始维度空间中寻求线性分类边界。
基于线性核函数的SVM分类相关API:model = svm.SVC(kernel='linear') model.fit(train_x, train_y)
SVC, NuSVC 和 LinearSVC 能在数据集中实现多元分类.
非均衡问题
这个问题期望给予某一类或某个别样例能使用的关键词 class_weight 和 sample_weight 提高权重(importance).
SVC (而不是 NuSVC) 在 fit 方法中生成了一个关键词 class_weight. 它是形如 {class_label : value} 的字典, value 是浮点数大于 0 的值, 把类 class_label 的参数 C 设置为 C * value.
SVC, NuSVC, SVR, NuSVR 和 OneClassSVM 在 fit 方法中通过关键词 sample_weight 为单一样例实现权重weights.与 class_weight 相似, 这些把第i个样例的参数 C 换成 C * sample_weight[i].
案例:对数据进行分类。
import numpy as np import sklearn.model_selection as ms import sklearn.svm as svm import sklearn.metrics as sm import matplotlib.pyplot as mp x, y = [], [] data = np.loadtxt('../data/multiple2.txt', delimiter=',', dtype='f8') x = data[:, :-1] y = data[:, -1] train_x, test_x, train_y, test_y = \ ms.train_test_split(x, y, test_size=0.25, random_state=5) # 基于线性核函数的支持向量机分类器 model = svm.SVC(kernel='linear') model.fit(train_x, train_y) n = 500 l, r = x[:, 0].min() - 1, x[:, 0].max() + 1 b, t = x[:, 1].min() - 1, x[:, 1].max() + 1 grid_x = np.meshgrid(np.linspace(l, r, n), np.linspace(b, t, n)) flat_x = np.column_stack((grid_x[0].ravel(), grid_x[1].ravel())) flat_y = model.predict(flat_x) grid_y = flat_y.reshape(grid_x[0].shape) pred_test_y = model.predict(test_x) cr = sm.classification_report(test_y, pred_test_y) print(cr) mp.figure('SVM Linear Classification', facecolor='lightgray') mp.title('SVM Linear Classification', fontsize=20) mp.xlabel('x', fontsize=14) mp.ylabel('y', fontsize=14) mp.tick_params(labelsize=10) mp.pcolormesh(grid_x[0], grid_x[1], grid_y, cmap='gray') mp.scatter(test_x[:, 0], test_x[:, 1], c=test_y, cmap='brg', s=80) mp.show()
优势
- 在高维空间中非常高效.即使在数据维度比样本数量大的情况下仍然有效.
- 在决策函数(称为支持向量)中使用训练集的子集,因此它也是高效利用内存的.
- 通用性: 不同的核函数与特定的决策函数一一对应.常见的 kernel 已经提供,也可以指定定制的内核.
缺点
- 如果特征数量比样本数量大得多,在选择核函数时要避免过拟合,而且正则化项是非常重要的.
- 支持向量机不直接提供概率估计,这些都是使用昂贵的五次交叉验算计算的.
在 scikit-learn 中,支持向量机提供 dense(numpy.ndarray ,可以通过 numpy.asarray 进行转换) 和 sparse (任何 scipy.sparse) 样例向量作为输出.然而,要使用支持向量机来对 sparse 数据作预测,它必须已经拟合这样的数据.使用 C 代码的 numpy.ndarray (dense) 或者带有 dtype=float64 的 scipy.sparse.csr_matrix (sparse) 来优化性能.
svc
- SVC用于分类:支持向量分类,基于libsvm实现的,数据拟合的时间复杂度是数据样本的二次方,这使得他很难扩展到10000个数据集,当输入是多类别时(SVM最初是处理二分类问题的),通过一对一的方案解决,当然也有别的解决办法。
SVC参数说明如下:
C:惩罚项,float类型,可选参数,默认为1.0,C越大,即对分错样本的惩罚程度越大,因此在训练样本中准确率越高,但是泛化能力降低,也就是对测试数据的分类准确率降低。相反,减小C的话,容许训练样本中有一些误分类错误样本,泛化能力强。对于训练样本带有噪声的情况,一般采用后者,把训练样本集中错误分类的样本作为噪声。
kernel:核函数类型,str类型,默认为’rbf’。可选参数为:
- ‘linear’:线性核函数
- ‘poly’:多项式核函数
- ‘rbf’:径像核函数/高斯核
- ‘sigmod’:sigmod核函数
- ‘precomputed’:核矩阵。precomputed表示自己提前计算好核函数矩阵,这时候算法内部就不再用核函数去计算核矩阵,而是直接用你给的核矩阵,核矩阵需要为n*n的。
degree:多项式核函数的阶数,int类型,可选参数,默认为3。这个参数只对多项式核函数有用,是指多项式核函数的阶数n,如果给的核函数参数是其他核函数,则会自动忽略该参数。
gamma:核函数系数,float类型,可选参数,默认为auto。只对’rbf’ ,’poly’ ,’sigmod’有效。如果gamma为auto,代表其值为样本特征数的倒数,即1/n_features。
coef0:核函数中的独立项,float类型,可选参数,默认为0.0。只有对’poly’ 和,’sigmod’核函数有用,是指其中的参数c。probability:是否启用概率估计,bool类型,可选参数,默认为False,这必须在调用fit()之前启用,并且会fit()方法速度变慢。
shrinking:是否采用启发式收缩方式,bool类型,可选参数,默认为True。
tol:svm停止训练的误差精度,float类型,可选参数,默认为1e^-3。
cache_size:内存大小,float类型,可选参数,默认为200。指定训练所需要的内存,以MB为单位,默认为200MB。
class_weight:类别权重,dict类型或str类型,可选参数,默认为None。给每个类别分别设置不同的惩罚参数C,如果没有给,则会给所有类别都给C=1,即前面参数指出的参数C。如果给定参数’balance’,则使用y的值自动调整与输入数据中的类频率成反比的权重。
verbose:是否启用详细输出,bool类型,默认为False,此设置利用libsvm中的每个进程运行时设置,如果启用,可能无法在多线程上下文中正常工作。一般情况都设为False,不用管它。
max_iter:最大迭代次数,int类型,默认为-1,表示不限制。
decision_function_shape:决策函数类型,可选参数’ovo’和’ovr’,默认为’ovr’。’ovo’表示one vs one,’ovr’表示one vs rest。
random_state:数据洗牌时的种子值,int类型,可选参数,默认为None。伪随机数发生器的种子,在混洗数据时用于概率估计。
NuSVC
NuSVC(Nu-Support Vector Classification.):核支持向量分类,和SVC类似,也是基于libsvm实现的,但不同的是通过一个参数空值支持向量的个数。
LinearSVC
LinearSVC(Linear Support Vector Classification):线性支持向量分类,类似于SVC,但是其使用的核函数是”linear“上边介绍的两种是按照brf(径向基函数计算的,其实现也不是基于LIBSVM,所以它具有更大的灵活性在选择处罚和损失函数时,而且可以适应更大的数据集,他支持密集和稀疏的输入是通过一对一的方式解决的。
example
# ===============================样本不平衡、多分类的情况======================== import numpy as np import matplotlib.pyplot as plt from sklearn import svm # 创建不均衡样本 rng = np.random.RandomState(0) n_samples_1 = 1000 n_samples_2 = 100 n_samples_3 = 100 X = np.r_[1.5 * rng.randn(n_samples_1, 2), 0.5 * rng.randn(n_samples_2, 2) + [2, 2],0.5 * rng.randn(n_samples_3, 2) + [-3, 3]] # 三类样本点中心为(1.5,1.5)、(2,2)、(-3,3) y = [0] * (n_samples_1) + [1] * (n_samples_2)+ [2] * (n_samples_3) # 前面的1000个为类别0,后面的100个为类别1,最后100个类别为2 # 创建模型获取分离超平面 clf = svm.SVC(decision_function_shape='ovo',kernel='linear', C=1.0) # decision_function_shape='ovo'为使用1对1多分类处理。会创建n(n-1)/2个二分类。ovr为一对所有的处理方式 clf.fit(X, y) # 多分类的情况下,获取其中二分类器的个数。 dec = clf.decision_function([[1.5,1.5]]) # decision_function()的功能:计算样本点到分割超平面的函数距离。 包含几个2分类器,就有几个函数距离。 print('二分类器个数:',dec.shape[1]) # 绘制,第一个二分类器的分割超平面 w = clf.coef_[0] a = -w[0] / w[1] # a可以理解为斜率 xx = np.linspace(-5, 5) yy = a * xx - clf.intercept_[0] / w[1] # 二维坐标下的直线方程 # 使用类权重,获取分割超平面 wclf = svm.SVC(kernel='linear', class_weight={1: 10}) wclf.fit(X, y) # 绘制 分割分割超平面 ww = wclf.coef_[0] wa = -ww[0] / ww[1] wyy = wa * xx - wclf.intercept_[0] / ww[1] # 带权重的直线 # 绘制第一个二分类器的分割超平面和样本点 h0 = plt.plot(xx, yy, 'k-', label='no weights') h1 = plt.plot(xx, wyy, 'k--', label='with weights') plt.scatter(X[:, 0], X[:, 1], c=y) plt.legend() plt.show()
使用诀窍
-
避免数据复制: 对于 SVC, SVR, NuSVC 和 NuSVR, 如果数据是通过某些方法而不是用 C 有序的连续双精度,那它先会调用底层的 C 命令再复制。 您可以通过检查它的 flags 属性,来确定给定的 numpy 数组是不是 C 连续的。
-
对于 LinearSVC (和 LogisticRegression) 的任何输入,都会以 numpy 数组形式,被复制和转换为 用 liblinear 内部稀疏数据去表达(双精度浮点型 float 和非零部分的 int32 索引)。 如果您想要一个适合大规模的线性分类器,又不打算复制一个密集的 C-contiguous 双精度 numpy 数组作为输入, 那我们建议您去使用 SGDClassifier 类作为替代。目标函数可以配置为和 LinearSVC 模型差不多相同的。
-
内核的缓存大小: 在大规模问题上,对于 SVC, SVR, nuSVC 和 NuSVR, 内核缓存的大小会特别影响到运行时间。如果您有足够可用的 RAM,不妨把它的 缓存大小 设得比默认的 200(MB) 要高,例如为 500(MB) 或者 1000(MB)。
-
惩罚系数C的设置:在合理的情况下, C 的默认选择为 1 。如果您有很多混杂的观察数据, 您应该要去调小它。 C 越小,就能更好地去正规化估计。
-
支持向量机算法本身不是用来扩大不变性,所以 我们强烈建议您去扩大数据量. 举个例子,对于输入向量 X, 规整它的每个数值范围为 [0, 1] 或 [-1, +1] ,或者标准化它的为均值为0方差为1的数据分布。请注意, 相同的缩放标准必须要应用到所有的测试向量,从而获得有意义的结果。 请参考章节 预处理数据 ,那里会提供到更多关于缩放和规整。
-
在 NuSVC/OneClassSVM/NuSVR 内的参数 nu , 近似是训练误差和支持向量的比值。
-
在 SVC, ,如果分类器的数据不均衡(就是说,很多正例很少负例),设置 class_weight=’balanced’ 与/或尝试不同的惩罚系数 C 。
-
在拟合模型时,底层 LinearSVC 操作使用了随机数生成器去选择特征。 所以不要感到意外,对于相同的数据输入,也会略有不同的输出结果。如果这个发生了, 尝试用更小的 tol 参数。
-
使用由 LinearSVC(loss=’l2’, penalty=’l1’, dual=False) 提供的 L1 惩罚去产生稀疏解,也就是说,特征权重的子集不同于零,这样做有助于决策函数。 随着增加 C 会产生一个更复杂的模型(要做更多的特征选择)。可以使用 l1_min_c 去计算 C 的数值,去产生一个”null” 模型(所有的权重等于零)。
-
-
遗传算法优化支持向量机算法
2015-05-30 15:01:44遗传算法优化支持向量机算法,从而更好的提高识别率和预测率 -
java实现SVM支持向量机算法
2017-04-22 23:07:24通过java语言实现SVM支持向量机算法 -
最小二乘支持向量机算法及工具
2020-09-27 21:15:26最小二乘支持向量机算法用于分类和回归分析,文件里包括程序运行所需工具LSSVMlabv1_8_R2009b_R2011a,MATLAB版本比这个高的都可以运行。 -
大样本的线性可分支持向量机算法
2020-03-12 03:34:33大样本的线性可分支持向量机算法,乔于,易正俊,支持向量机(Support Vector Machine,SVM)适合于解决高维小样本的分类问题。但在大数据背景下,支持向量机对于海量样本的学习算法收敛� -
基于分解技术的并行支持向量机算法
2019-12-29 01:29:12基于分解技术的并行支持向量机算法,李明强,韩丛英,支持向量机是以统计学习理论为基础的新型的机器学习方法,近年来已经成为机器学习领域一个新的研究热点。由于传统的优化算法在处 -
一种新的最小二乘支持向量机算法
2018-04-15 03:58:27最小二乘支持向量机 一种新的最小二乘支持向量机算法 -
支持向量机算法的研究及其应用
2015-01-06 22:35:37本文仔细研究了支持向量机理论,并针对目前一些支持向量机算法存在的缺陷,分析了产生的原因,提出了两种新的支持向量机算法。针对支持向量机算法难以处理大规模数据的问题,提出了两种新的支持向量机分类方法。并就... -
SVM支持向量机算法
2017-07-31 20:48:17说明支持向量机的回归算法是用于解决回归问题的支持向量机算法,它是支持向量机在回归估计问题中的扩展与应用。 如果我们把支持向量机针对分类问题中得到的结论推广到回归实函数中,就变成了支持向量机回归,通常...说明
支持向量机的回归算法是用于解决回归问题的支持向量机算法,它是支持向量机在回归估计问题中的扩展与应用。
如果我们把支持向量机针对分类问题中得到的结论推广到回归实函数中,就变成了支持向量机回归,通常用于时间序列预测、非线性建模与预测、优化控制。例证
LS-SVM算法,最小二乘支持向量机回归
#准备基础数据 vdata=iris[,1:4] colnames(vdata)=c("x1","x2","x3","y") #标准化x1~x3 vdata[,1:3]=scale(vdata[,1:3]) n=nrow(vdata) x=as.matrix(vdata[,1:3]) y=as.matrix(vdata[,4]) y=rbind(0,y) I=t(t(rep(1,n))) #设置参数sigma sigma=1 omiga=matrix(rep(0,n*n),ncol=n) for(i in 1:n) { xi=x[i,] deltaX=(x-matrix(rep(xi,n),byrow=T,ncol=3))^2 omiga[i,]=exp(-rowSums(deltaX)/(sigma^2)) } #设置平衡参数gama gama=10 #构建矩阵A A=(omiga+(1/gama)*diag(n)) A=cbind(I,A) A=rbind(c(0,t(I)),A) #求b和alpha参数 b_alpha=solve(A)%*%y b=b_alpha[1] alpha=b_alpha[-1] #基于vdata进行预测 ypred=NULL for(i in 1:n) { xi=x[i,] deltaX=(x-matrix(rep(xi,n),byrow=T,ncol=3))^2 ypred=c(ypred,drop(exp(-rowSums(deltaX)/(sigma^2))%*%t(t(alpha)))+b) } #查看数据前几行 head(data.frame(y=vdata$y,ypred)) ## y ypred ## 1 0.2 0.2485166 ## 2 0.2 0.2029999 ## 3 0.2 0.1689355 ## 4 0.2 0.1588311 ## 5 0.2 0.2458173 ## 6 0.4 0.3122185 #误差平方和 sum((vdata[,4]-ypred)^2) ## [1] 2.867035
R语言实现
观察数据
data("iris") attach(iris) library(lattice) xyplot(Petal.Length ~ Petal.Width,data = iris,groups = Species,auto.key = list(corner = c(1,0)))
第一种实现方式
函数svm()在建立支持向量机分类模型时有两种形式。第一种是根据既定公式建立模型
svm(formula,data = NULL,subset,na.action = na.omit,scale = TRUE)formula代表函数模型的形式,data代表的是模型中包括的有变量的一组可选格式数据
na.action用于指定当样本数据中存在无效的空数据时系统应该进行的处理。默认值
na.omit表明程序会忽略那些数据缺失的样本。另外一个可选的赋值是na.fail,它指示系统在遇到空数据时给出一条错误信息
参数scale为一个逻辑向量,指定特征数据是否需要标准化(均值0,方差1).索引向量subset用来指定那些将被用来
训练模型的采样数据只区分setosa与versicolor.去掉virginica
library(e1071) subdata = iris[iris$Species != "virginica",] subdata$Species = factor(subdata$Species) model1 = svm(Species ~ Petal.Length + Petal.Width,data = subdata) plot(model1,subdata,Petal.Length ~ Petal.Width)
第二种实现方式
使用全部特征量 model2 = svm(Species ~ .,data = iris) summary(model2)
Call:
svm(formula = Species ~ ., data = iris)
Parameters:
SVM-Type: C-classification
SVM-Kernel: radial
cost: 1
gamma: 0.25Number of Support Vectors: 51
SVM-Type项目说明本模型的类别为C分类器,SVM-Kernel说明本模型使用的核函数中的参数gamma取值为0.25
cost说明本模型确定的约束违反成本为1
第一类为8个支持向量,第二类为22个支持向量,第三为51个支持向量第三种实现方式
svm()函数的方式则是根据所给的数据建立模型,这种方式要复杂一些,但是允许我们以一种更加灵活的方式建立模型
svm(x,y = NULL,scale = TRUE,type = NULL,kernel = "radaial",degree = 3, gamma = if(is.vector(x))1 else 1/ncol(x),coef0 = 0,cost = 1,nu = 0.5,subset,na.action = na.omit)
x可以是一个数据矩阵,也可以是一个数据向量,同时也可以是一个稀疏矩阵。y是对x数据的结果标签,它既可以是字符
向量,也可以是数值向量。x与y共同指定将要用来建模的训练数据与模型基本形式。
type用于指定建立模型的类别。
kernal是指建立模型的过程中使用的核函数
对于选定的核函数,degree参数是指核函数多项式内积函数中的参数,其默认值为3,gamma参数给出了核函数中除线性
内积函数以外的所有函数参数,默认为1。coef0参数是指核函数中多项式内积函数与sigmoid内积函数的参数。library(e1071) x = iris[,-5] #除第五列以外数据作为特征变量 y = iris[,5] #提取第5列数据做为结果变量 model3 = svm(x,y,kernel = "radial",gamma = if(is.vector(x)) 1 else 1/ncol(x)) str(model3) pred = predict(model3,x) table(pred,y)
-
支持向量机算法预处理的一种新方法.pdf
2020-08-14 20:33:31摘要 支持向量机算法是常用的机器学习算法之一被广泛地应用于数据处理中的回 归问题本文在支持向量回归机的基础上对目前出现的一些问题进行了分析并 提出了一种新的数据预处理的方法随着大数据时代的到来虽然海量的... -
LIBSVMlib支持向量机算法
2011-12-11 20:11:44lib支持向量机算法,列出了C support and V support SVM classification -
一种新的最小二乘支持向量机算法.pdf
2018-09-06 16:05:35最小二乘支持向量机 一种新的最小二乘支持向量机算法