导航:首页 > 源码编译 > svm算法matlab实现

svm算法matlab实现

发布时间:2022-05-26 02:04:36

❶ 有谁下过Matlab的SVM-KM中的m-svm代码吗新手求助

向量机类型应是最经典简单的svm,核函数可以是多项式,高斯,小波等核函数,向量机求解用的是二次规划算法,也就是QP算法(quadratic programming algorithm )

❷ 求一完整的SVM分类器的程序,matlab编写的。感激不尽。。。。

这个是非线性svm的:
1.命令函数部分:

clear;%清屏
clc;
X =load('data.txt');
n = length(X);%总样本数量
y = X(:,4);%类别标志
X = X(:,1:3);
TOL = 0.0001;%精度要求
C = 1;%参数,对损失函数的权重
b = 0;%初始设置截距b
Wold = 0;%未更新a时的W(a)
Wnew = 0;%更新a后的W(a)
for i = 1 : 50%设置类别标志为1或者-1
y(i) = -1;
end
a = zeros(n,1);%参数a
for i = 1 : n%随机初始化a,a属于[0,C]
a(i) = 0.2;
end

%为简化计算,减少重复计算进行的计算
K = ones(n,n);
for i = 1 :n%求出K矩阵,便于之后的计算
for j = 1 : n
K(i,j) = k(X(i,:),X(j,:));
end
end
sum = zeros(n,1);%中间变量,便于之后的计算,sum(k)=sigma a(i)*y(i)*K(k,i);
for k = 1 : n
for i = 1 : n
sum(k) = sum(k) + a(i) * y(i) * K(i,k);
end
end

while 1%迭代过程

%启发式选点
n1 = 1;%初始化,n1,n2代表选择的2个点
n2 = 2;
%n1按照第一个违反KKT条件的点选择
while n1 <= n
if y(n1) * (sum(n1) + b) == 1 && a(n1) >= C && a(n1) <= 0
break;
end
if y(n1) * (sum(n1) + b) > 1 && a(n1) ~= 0
break;
end
if y(n1) * (sum(n1) + b) < 1 && a(n1) ~=C
break;
end
n1 = n1 + 1;
end
%n2按照最大化|E1-E2|的原则选取
E1 = 0;
E2 = 0;
maxDiff = 0;%假设的最大误差
E1 = sum(n1) + b - y(n1);%n1的误差
for i = 1 : n
tempSum = sum(i) + b - y(i);
if abs(E1 - tempSum)> maxDiff
maxDiff = abs(E1 - tempSum);
n2 = i;
E2 = tempSum;
end
end

%以下进行更新
a1old = a(n1);
a2old = a(n2);
KK = K(n1,n1) + K(n2,n2) - 2*K(n1,n2);
a2new = a2old + y(n2) *(E1 - E2) / KK;%计算新的a2
%a2必须满足约束条件
S = y(n1) * y(n2);
if S == -1
U = max(0,a2old - a1old);
V = min(C,C - a1old + a2old);
else
U = max(0,a1old + a2old - C);
V = min(C,a1old + a2old);
end
if a2new > V
a2new = V;
end
if a2new < U
a2new = U;
end
a1new = a1old + S * (a2old - a2new);%计算新的a1
a(n1) = a1new;%更新a
a(n2) = a2new;

%更新部分值
sum = zeros(n,1);
for k = 1 : n
for i = 1 : n
sum(k) = sum(k) + a(i) * y(i) * K(i,k);
end
end
Wold = Wnew;
Wnew = 0;%更新a后的W(a)
tempSum = 0;%临时变量
for i = 1 : n
for j = 1 : n
tempSum= tempSum + y(i )*y(j)*a(i)*a(j)*K(i,j);
end
Wnew= Wnew+ a(i);
end
Wnew= Wnew - 0.5 * tempSum;
%以下更新b:通过找到某一个支持向量来计算
support = 1;%支持向量坐标初始化
while abs(a(support))< 1e-4 && support <= n
support = support + 1;
end
b = 1 / y(support) - sum(support);
%判断停止条件
if abs(Wnew/ Wold - 1 ) <= TOL
break;
end
end
%输出结果:包括原分类,辨别函数计算结果,svm分类结果
for i = 1 : n
fprintf('第%d点:原标号 ',i);
if i <= 50
fprintf('-1');
else
fprintf(' 1');
end
fprintf(' 判别函数值%f 分类结果',sum(i) + b);
if abs(sum(i) + b - 1) < 0.5
fprintf('1\n');
else if abs(sum(i) + b + 1) < 0.5
fprintf('-1\n');
else
fprintf('归类错误\n');
end
end
end

2.名为f的功能函数部分:
function y = k(x1,x2)
y = exp(-0.5*norm(x1 - x2).^2);
end

3.数据:
0.8871 -0.3491 8.3376 0
1.2519 1.2083 6.5041 0
-1.1925 1.9338 1.8790 0
-0.1277 2.4371 2.6971 0
1.9697 3.0906 6.0391 0
0.7603 0.8241 1.5323 0
1.6382 3.5516 4.4694 0
1.3438 -0.4539 5.9366 0
-1.3361 -2.0201 1.6393 0
-0.3886 3.3041 8.0450 0
-0.6780 6.0196 -0.4084 0
0.3552 -0.1051 1.2458 0
1.6560 4.0786 0.8521 0
0.8117 3.5451 6.8925 0
1.4773 -1.9340 3.9256 0
-0.0732 -0.9526 0.4609 0
0.1521 4.3711 2.2600 0
1.4820 0.7493 0.3475 0
0.6140 4. 8.3776 0
0.5721 3.3460 3.7853 0
0.5269 4.1452 4.3900 0
1.7879 -0.5390 2.5516 0
0.9885 5.7625 0.1832 0
-0.3318 2.4373 -0.6884 0
1.3578 5.4709 3.4302 0
2.7210 -1.1268 4.7719 0
0.5039 -0.1025 2.3650 0
1.1107 1.6885 3.7650 0
0.7862 1.3587 7.3203 0
1.0444 -1.5841 3.6349 0
1.7795 1.7276 4.9847 0
0.6710 1.4724 -0.5504 0
0.2303 0.2720 -1.6028 0
1.7089 -1.7399 4.8882 0
1.0059 0.5557 5.1188 0
2.3050 0.8545 2.8294 0
1.9555 0.9898 0.3501 0
1.7141 1.5413 3.8739 0
2.2749 5.3280 4.9604 0
1.6171 0.5270 3.3826 0
3.6681 -1.8409 4.8934 0
1.1964 1.8781 1.4146 0
0.7788 2.1048 0.0380 0
0.7916 5.0906 3.8513 0
1.0807 1.8849 5.9766 0
0.6340 2.6030 3.6940 0
1.9069 -0.0609 7.4208 0
1.6599 4.9409 8.1108 0
1.3763 0.8899 3.9069 0
0.8485 1.4688 6.7393 0
3.6792 6.1092 4.9051 1
4.3812 7.2148 6.1211 1
4.3971 3.4139 7.7974 1
5.0716 7.7253 10.5373 1
5.3078 8.8138 6.1682 1
4.1448 5.5156 2.8731 1
5.3609 6.0458 4.0815 1
4.7452 6.6352 1.3689 1
6.0274 6.5397 -1.9120 1
5.3174 3.0134 6.7935 1
7.2459 3.6970 3.1246 1
6.1007 8.1087 5.5568 1
5.9924 6.9238 5.7938 1
6.0263 5.3333 7.5185 1
3.6470 8.0915 6.4713 1
3.6543 7.2264 7.5783 1
5.0114 6.5335 3.5229 1
4.4348 7.4379 -0.0292 1
3.6087 3.7351 3.0172 1
3.5374 5.5354 7.6578 1
6.0048 2.0691 10.4513 1
3.1423 4.0003 5.4994 1
3.4012 7.1536 8.3510 1
5.5471 5.1372 -1.5090 1
6.5089 5.4911 8.0468 1
5.4583 6.7674 5.9353 1
4.1727 2.9798 3.6027 1
5.1672 8.4136 4.8621 1
4.8808 3.5514 1.9953 1
5.4938 4.1998 3.2440 1
5.4542 5.8803 4.4269 1
4.8743 3.9641 8.1417 1
5.9762 6.7711 2.3816 1
6.6945 7.2858 1.8942 1
4.7301 5.7652 1.6608 1
4.7084 5.3623 3.2596 1
6.0408 3.3138 7.7876 1
4.6024 8.3517 0.2193 1
4.7054 6.6633 -0.3492 1
4.7139 5.6362 6.2330 1
4.0850 10.7118 3.3541 1
6.1088 6.1635 4.2292 1
4.9836 5.4042 6.7422 1
6.1387 6.1949 2.5614 1
6.0700 7.0373 3.3256 1
5.6881 5.1363 9.9254 1
7.2058 2.3570 4.7361 1
4.2972 7.3245 4.7928 1
4.7794 8.1235 3.1827 1
3.9282 6.4092 -0.6339 1

❸ matlab中使用libsvm如何实现参数寻优

可以利用libsvm工具箱中自带的k折交叉验证方法进行参数的寻优。


k折交叉验证的基本思想如下:

k个子集,每个子集均做一次测试集,其余的作为训练集。交叉验证重复k次,每次选择一个子集作为测试集,并将k次的平均交叉验证识别正确率作为结果。


libsvm工具箱中交叉验证的使用方法如下:

predict=trian(data_label,data_train,cmd);
%train_label表示训练输出样本数据;
%data_train表示训练输入样本数据;
%cmd就是训练参数的设置,如设置为cmd='-v5'就表示进行5折交叉验证(该设置中省略了其他参数的设置,即保存默认设置)。

❹ 请问MIMLBOOST & MIMLSVM算法的matlab代码如何使用

bags格式是元胞数组,target是n*1的矩阵,自己划分训练集测试集代入就行了

❺ 请问在matlab中如何实现支持向量机(SVM)算法

matlab自带svmtrain,进去看help,照着例子做就懂了

❻ matlab如何svm实现图像分类输出像素点

matlab如何svm实现图像分类输出像素点,这里分享下操作方法。

设备:华硕笔记本

系统:win10

软件:matlab2012

1、首先双击桌面matlab图标,打开matlab软件。

❼ 人工智能要做实验了,题目是数字识别,用matlab实现svm算法,就是支持向量机

使用Matlab中的LIBSVM工具箱。

❽ 跪求用MATLAB编写的svm源程序,可以实现支持向量机用于特征分类或提取

用LIBSVM工具箱,它是由台湾大学林智仁(Chih-Jen Lin)等开发和设计的,它是一个简单、易于使用并且快速有效的SVM软件工具包,可以解决C-支持向量分类(C-SVC)、v-支持向量分类(v-SVC)、分布估计(one-class SVM)、e-支持向量回归(e-SVR)和v-支持向量回归(v-SVR)问题。
软件下载网址:http://www.csie.ntu.e.tw/~cjlin/libsvm/index.html#matlab
页面上有MATLAB版的,只要在matlab中安装一下就可以用了!

❾ 支持向量机基本原理 matlab程序及其应用

支持向量机
1 简介
支持向量机基本上是最好的有监督学习算法了。最开始接触SVM是去年暑假的时候,老师要求交《统计学习理论》的报告,那时去网上下了一份入门教程,里面讲的很通俗,当时只是大致了解了一些相关概念。这次斯坦福提供的学习材料,让我重新学习了一些SVM知识。我看很多正统的讲法都是从VC 维理论和结构风险最小原理出发,然后引出SVM什么的,还有些资料上来就讲分类超平面什么的。这份材料从前几节讲的logistic回归出发,引出了SVM,既揭示了模型间的联系,也让人觉得过渡更自然。
2 重新审视logistic回归
Logistic回归目的是从特征学习出一个0/1分类模型,而这个模型是将特性的线性组合作为自变量,由于自变量的取值范围是负无穷到正无穷。因此,使用logistic函数(或称作sigmoid函数)将自变量映射到(0,1)上,映射后的值被认为是属于y=1的概率。
形式化表示就是
假设函数

其中x是n维特征向量,函数g就是logistic函数。
的图像是

可以看到,将无穷映射到了(0,1)。
而假设函数就是特征属于y=1的概率。

当我们要判别一个新来的特征属于哪个类时,只需求 ,若大于0.5就是y=1的类,反之属于y=0类。
再审视一下 ,发现 只和 有关, >0,那么 ,g(z)只不过是用来映射,真实的类别决定权还在 。还有当 时, =1,反之 =0。如果我们只从 出发,希望模型达到的目标无非就是让训练数据中y=1的特征 ,而是y=0的特征 。Logistic回归就是要学习得到 ,使得正例的特征远大于0,负例的特征远小于0,强调在全部训练实例上达到这个目标。
图形化表示如下:

中间那条线是 ,logistic回顾强调所有点尽可能地远离中间那条线。学习出的结果也就中间那条线。考虑上面3个点A、B和C。从图中我们可以确定A是×类别的,然而C我们是不太确定的,B还算能够确定。这样我们可以得出结论,我们更应该关心靠近中间分割线的点,让他们尽可能地远离中间线,而不是在所有点上达到最优。因为那样的话,要使得一部分点靠近中间线来换取另外一部分点更加远离中间线。我想这就是支持向量机的思路和logistic回归的不同点,一个考虑局部(不关心已经确定远离的点),一个考虑全局(已经远离的点可能通过调整中间线使其能够更加远离)。这是我的个人直观理解。
3 形式化表示
我们这次使用的结果标签是y=-1,y=1,替换在logistic回归中使用的y=0和y=1。同时将 替换成w和b。以前的 ,其中认为 。现在我们替换 为b,后面替换 为 (即 )。这样,我们让 ,进一步 。也就是说除了y由y=0变为y=-1,只是标记不同外,与logistic回归的形式化表示没区别。再明确下假设函数

上一节提到过我们只需考虑 的正负问题,而不用关心g(z),因此我们这里将g(z)做一个简化,将其简单映射到y=-1和y=1上。映射关系如下:

4 函数间隔(functional margin)和几何间隔(geometric margin)
给定一个训练样本 ,x是特征,y是结果标签。i表示第i个样本。我们定义函数间隔如下:

可想而知,当 时,在我们的g(z)定义中, , 的值实际上就是 。反之亦然。为了使函数间隔最大(更大的信心确定该例是正例还是反例),当 时, 应该是个大正数,反之是个大负数。因此函数间隔代表了我们认为特征是正例还是反例的确信度。
继续考虑w和b,如果同时加大w和b,比如在 前面乘个系数比如2,那么所有点的函数间隔都会增大二倍,这个对求解问题来说不应该有影响,因为我们要求解的是 ,同时扩大w和b对结果是无影响的。这样,我们为了限制w和b,可能需要加入归一化条件,毕竟求解的目标是确定唯一一个w和b,而不是多组线性相关的向量。这个归一化一会再考虑。
刚刚我们定义的函数间隔是针对某一个样本的,现在我们定义全局样本上的函数间隔

说白了就是在训练样本上分类正例和负例确信度最小那个函数间隔。
接下来定义几何间隔,先看图

假设我们有了B点所在的 分割面。任何其他一点,比如A到该面的距离以 表示,假设B就是A在分割面上的投影。我们知道向量BA的方向是 (分割面的梯度),单位向量是 。A点是 ,所以B点是x= (利用初中的几何知识),带入 得,

进一步得到

实际上就是点到平面距离。
再换种更加优雅的写法:

当 时,不就是函数间隔吗?是的,前面提到的函数间隔归一化结果就是几何间隔。他们为什么会一样呢?因为函数间隔是我们定义的,在定义的时候就有几何间隔的色彩。同样,同时扩大w和b,w扩大几倍, 就扩大几倍,结果无影响。同样定义全局的几何间隔
5 最优间隔分类器(optimal margin classifier)
回想前面我们提到我们的目标是寻找一个超平面,使得离超平面比较近的点能有更大的间距。也就是我们不考虑所有的点都必须远离超平面,我们关心求得的超平面能够让所有点中离它最近的点具有最大间距。形象的说,我们将上面的图看作是一张纸,我们要找一条折线,按照这条折线折叠后,离折线最近的点的间距比其他折线都要大。形式化表示为:

这里用 =1规约w,使得 是几何间隔。
到此,我们已经将模型定义出来了。如果求得了w和b,那么来一个特征x,我们就能够分类了,称为最优间隔分类器。接下的问题就是如何求解w和b的问题了。
由于 不是凸函数,我们想先处理转化一下,考虑几何间隔和函数间隔的关系, ,我们改写一下上面的式子:

这时候其实我们求的最大值仍然是几何间隔,只不过此时的w不受 的约束了。然而这个时候目标函数仍然不是凸函数,没法直接代入优化软件里计算。我们还要改写。前面说到同时扩大w和b对结果没有影响,但我们最后要求的仍然是w和b的确定值,不是他们的一组倍数值,因此,我们需要对 做一些限制,以保证我们解是唯一的。这里为了简便我们取 。这样的意义是将全局的函数间隔定义为1,也即是将离超平面最近的点的距离定义为 。由于求 的最大值相当于求 的最小值,因此改写后结果为:

这下好了,只有线性约束了,而且是个典型的二次规划问题(目标函数是自变量的二次函数)。代入优化软件可解。
到这里发现,这个讲义虽然没有像其他讲义一样先画好图,画好分类超平面,在图上标示出间隔那么直观,但每一步推导有理有据,依靠思路的流畅性来推导出目标函数和约束。
接下来介绍的是手工求解的方法了,一种更优的求解方法。
6 拉格朗日对偶(Lagrange ality)
先抛开上面的二次规划问题,先来看看存在等式约束的极值问题求法,比如下面的最优化问题:

目标函数是f(w),下面是等式约束。通常解法是引入拉格朗日算子,这里使用 来表示算子,得到拉格朗日公式为

L是等式约束的个数。
然后分别对w和 求偏导,使得偏导数等于0,然后解出w和 。至于为什么引入拉格朗日算子可以求出极值,原因是f(w)的dw变化方向受其他不等式的约束,dw的变化方向与f(w)的梯度垂直时才能获得极值,而且在极值处,f(w)的梯度与其他等式梯度的线性组合平行,因此他们之间存在线性关系。(参考《最优化与KKT条件》)
然后我们探讨有不等式约束的极值问题求法,问题如下:

我们定义一般化的拉格朗日公式

这里的 和 都是拉格朗日算子。如果按这个公式求解,会出现问题,因为我们求解的是最小值,而这里的 已经不是0了,我们可以将 调整成很大的正值,来使最后的函数结果是负无穷。因此我们需要排除这种情况,我们定义下面的函数:

这里的P代表primal。假设 或者 ,那么我们总是可以调整 和 来使得 有最大值为正无穷。而只有g和h满足约束时, 为f(w)。这个函数的精妙之处在于 ,而且求极大值。
因此我们可以写作

这样我们原来要求的min f(w)可以转换成求 了。

我们使用 来表示 。如果直接求解,首先面对的是两个参数,而 也是不等式约束,然后再在w上求最小值。这个过程不容易做,那么怎么办呢?
我们先考虑另外一个问题
D的意思是对偶, 将问题转化为先求拉格朗日关于w的最小值,将 和 看作是固定值。之后在 求最大值的话:

这个问题是原问题的对偶问题,相对于原问题只是更换了min和max的顺序,而一般更换顺序的结果是Max Min(X) <= MinMax(X)。然而在这里两者相等。用 来表示对偶问题如下:

下面解释在什么条件下两者会等价。假设f和g都是凸函数,h是仿射的(affine, )。并且存在w使得对于所有的i, 。在这种假设下,一定存在 使得 是原问题的解, 是对偶问题的解。还有 另外, 满足库恩-塔克条件(Karush-Kuhn-Tucker, KKT condition),该条件如下:

所以如果 满足了库恩-塔克条件,那么他们就是原问题和对偶问题的解。让我们再次审视公式(5),这个条件称作是KKT al complementarity条件。这个条件隐含了如果 ,那么 。也就是说, 时,w处于可行域的边界上,这时才是起作用的约束。而其他位于可行域内部( 的)点都是不起作用的约束,其 。这个KKT双重补足条件会用来解释支持向量和SMO的收敛测试。
这部分内容思路比较凌乱,还需要先研究下《非线性规划》中的约束极值问题,再回头看看。KKT的总体思想是将极值会在可行域边界上取得,也就是不等式为0或等式约束里取得,而最优下降方向一般是这些等式的线性组合,其中每个元素要么是不等式为0的约束,要么是等式约束。对于在可行域边界内的点,对最优解不起作用,因此前面的系数为0。
7 最优间隔分类器(optimal margin classifier)
重新回到SVM的优化问题:

我们将约束条件改写为:

从KKT条件得知只有函数间隔是1(离超平面最近的点)的线性约束式前面的系数 ,也就是说这些约束式 ,对于其他的不在线上的点( ),极值不会在他们所在的范围内取得,因此前面的系数 .注意每一个约束式实际就是一个训练样本。
看下面的图:

实线是最大间隔超平面,假设×号的是正例,圆圈的是负例。在虚线上的点就是函数间隔是1的点,那么他们前面的系数 ,其他点都是 。这三个点称作支持向量。构造拉格朗日函数如下:

注意到这里只有 没有 是因为原问题中没有等式约束,只有不等式约束。
下面我们按照对偶问题的求解步骤来一步步进行,

首先求解 的最小值,对于固定的 , 的最小值只与w和b有关。对w和b分别求偏导数。

并得到

将上式带回到拉格朗日函数中得到,此时得到的是该函数的最小值(目标函数是凸函数)
代入后,化简过程如下:

最后得到

由于最后一项是0,因此简化为

这里我们将向量内积 表示为
此时的拉格朗日函数只包含了变量 。然而我们求出了 才能得到w和b。
接着是极大化的过程 ,

前面提到过对偶问题和原问题满足的几个条件,首先由于目标函数和线性约束都是凸函数,而且这里不存在等式约束h。存在w使得对于所有的i, 。因此,一定存在 使得 是原问题的解, 是对偶问题的解。在这里,求 就是求 了。
如果求出了 ,根据 即可求出w(也是 ,原问题的解)。然后

即可求出b。即离超平面最近的正的函数间隔要等于离超平面最近的负的函数间隔。
关于上面的对偶问题如何求解,将留给下一篇中的SMO算法来阐明。
这里考虑另外一个问题,由于前面求解中得到

我们通篇考虑问题的出发点是 ,根据求解得到的 ,我们代入前式得到

也就是说,以前新来的要分类的样本首先根据w和b做一次线性运算,然后看求的结果是大于0还是小于0,来判断正例还是负例。现在有了 ,我们不需要求出w,只需将新来的样本和训练数据中的所有样本做内积和即可。那有人会说,与前面所有的样本都做运算是不是太耗时了?其实不然,我们从KKT条件中得到,只有支持向量的 ,其他情况 。因此,我们只需求新来的样本和支持向量的内积,然后运算即可。这种写法为下面要提到的核函数(kernel)做了很好的铺垫。这是上篇,先写这么多了。
7 核函数(Kernels)
考虑我们最初在“线性回归”中提出的问题,特征是房子的面积x,这里的x是实数,结果y是房子的价格。假设我们从样本点的分布中看到x和y符合3次曲线,那么我们希望使用x的三次多项式来逼近这些样本点。那么首先需要将特征x扩展到三维 ,然后寻找特征和结果之间的模型。我们将这种特征变换称作特征映射(feature mapping)。映射函数称作 ,在这个例子中

我们希望将得到的特征映射后的特征应用于SVM分类,而不是最初的特征。这样,我们需要将前面 公式中的内积从 ,映射到 。
至于为什么需要映射后的特征而不是最初的特征来参与计算,上面提到的(为了更好地拟合)是其中一个原因,另外的一个重要原因是样例可能存在线性不可分的情况,而将特征映射到高维空间后,往往就可分了。(在《数据挖掘导论》Pang-Ning Tan等人着的《支持向量机》那一章有个很好的例子说明)
将核函数形式化定义,如果原始特征内积是 ,映射后为 ,那么定义核函数(Kernel)为

到这里,我们可以得出结论,如果要实现该节开头的效果,只需先计算 ,然后计算 即可,然而这种计算方式是非常低效的。比如最初的特征是n维的,我们将其映射到 维,然后再计算,这样需要 的时间。那么我们能不能想办法减少计算时间呢?
先看一个例子,假设x和z都是n维的,

展开后,得

这个时候发现我们可以只计算原始特征x和z内积的平方(时间复杂度是O(n)),就等价与计算映射后特征的内积。也就是说我们不需要花 时间了。
现在看一下映射函数(n=3时),根据上面的公式,得到

也就是说核函数 只能在选择这样的 作为映射函数时才能够等价于映射后特征的内积。
再看一个核函数

对应的映射函数(n=3时)是

更一般地,核函数 对应的映射后特征维度为 。(这个我一直没有理解)。
由于计算的是内积,我们可以想到IR中的余弦相似度,如果x和z向量夹角越小,那么核函数值越大,反之,越小。因此,核函数值是 和 的相似度。
再看另外一个核函数

这时,如果x和z很相近( ),那么核函数值为1,如果x和z相差很大( ),那么核函数值约等于0。由于这个函数类似于高斯分布,因此称为高斯核函数,也叫做径向基函数(Radial Basis Function 简称RBF)。它能够把原始特征映射到无穷维。
既然高斯核函数能够比较x和z的相似度,并映射到0到1,回想logistic回归,sigmoid函数可以,因此还有sigmoid核函数等等。
下面有张图说明在低维线性不可分时,映射到高维后就可分了,使用高斯核函数。

来自Eric Xing的slides
注意,使用核函数后,怎么分类新来的样本呢?线性的时候我们使用SVM学习出w和b,新来样本x的话,我们使用 来判断,如果值大于等于1,那么是正类,小于等于是负类。在两者之间,认为无法确定。如果使用了核函数后, 就变成了 ,是否先要找到 ,然后再预测?答案肯定不是了,找 很麻烦,回想我们之前说过的

只需将 替换成 ,然后值的判断同上。

❿ 如何将hog 特征进行svm matlab

(1)准备训练样本集合;包括正样本集和负样本集;根据机器学习的基础知识我们知道,要利用机器学习算法进行样本训练,从而得到一个性能优良的分类器,训练样本应该是无限多的,而且训练样本应该覆盖实际应用过程中可能发生的各种情况。(很多朋友,用10来个正样本,10来
个负样本进行训练,之后,就进行测试,发现效果没有想象中的那么好,就开始发牢骚,抱怨。。。对于这些人,我只能抱歉的说,对于机器学习、模式识别的认
识,你还处于没有入门的阶段);实际应用过程中,训练样本不可能无限多,但无论如何,三五千个正样本,三五千个负样本,应该不是什么难事吧?(如果连这个
都做不到,建议你别搞机器学习,模式识别了;训练素材都没有,怎么让机器学习到足够的信息呢?)

(2)收集到足够的训练样本之后,你需要手动裁剪样本。例如,你想用Hog+SVM来对商业步行街的监控画面中进行行人检测,那么,你就应该用收集到的训练样本集合,手动裁剪画面中的行人(可以写个简单程序,只需要鼠标框选一下,就将框选区域保存下来)。

(3)裁剪得到训练样本之后,将所有正样本放在一个文件夹中;将所有负样本放在另一个文件夹中;并将所有训练样本缩放到同样的尺寸大小。OpenCV自带的例子在训练时,就是将样本缩放为64*128进行训练的;

(4)提取所有正样本的Hog特征;

(5)提取所有负样本的Hog特征;

(6)对所有正负样本赋予样本标签;例如,所有正样本标记为1,所有负样本标记为0;

(7)将正负样本的Hog特征,正负样本的标签,都输入到SVM中进行训练;Dalal在论文中考虑到速度问题,建议采用线性SVM进行训练。这里,不妨也采用线性SVM;

(8)SVM训练之后,将结果保存为文本文件。

(9)线性SVM进行训练之后得到的文本文件里面,有一个数组,叫做support vector,还有一个数组,叫做alpha,有一个浮点数,叫做rho;将alpha矩阵同support vector相乘,注意,alpha*supportVector,将得到一个列向量。之后,再该列向量的最后添加一个元素rho。如此,变得到了一个分类器,利用该分类器,直接替换opencv中行人检测默认的那个分类器(cv::HOGDescriptor::setSVMDetector()),就可以利用你的训练样本训练出来的分类器进行行人检测了。

阅读全文

与svm算法matlab实现相关的资料

热点内容
安卓软件怎么还原之前的版本 浏览:869
什么app可以看舌神综艺 浏览:278
vba编好的程序编译出来 浏览:91
如何清空服务器数据 浏览:33
android计划软件 浏览:383
vivo手机文件夹加密路径 浏览:131
程序员怎么找到联通卡 浏览:196
单片机实训要求 浏览:268
程序员八大黑话 浏览:946
除了天天鉴宝app还有什么 浏览:628
cs中的文件夹 浏览:792
php获取内存地址 浏览:679
看电视直播节目什么app最好 浏览:30
如何连子文件里面的文件一起解压 浏览:72
怎么用单片机识别天气 浏览:877
单片机实验室认识 浏览:142
我的世界pe112服务器地址 浏览:886
程序员转行销售 浏览:468
沈阳医疗程序员 浏览:47
戴尔服务器主机系统如何安装 浏览:958