实验代码获取 github repo
山东大学机器学习课程资源索引


实验目的

实验内容

这里并不是通过 KTT 条件转化,而是对偶问题和原问题为强对偶关系,可以通过 KTT 条件进行化简。

令 x = α = [ α 1 , α 2 , . . . , α n ] T x=\alpha=[\alpha_1,\alpha_2,...,\alpha_n]^T x=α=[α1​,α2​,...,αn​]T,则有

∑ i , j = 1 m α i y ( i ) y ( j ) < x ( i ) , x ( j ) > α j \sum^m_{i,j=1}\alpha_iy^{(i)}y^{(j)}<x^{(i)},x^{(j)}>\alpha_j ∑i,j=1m​αi​y(i)y(j)<x(i),x(j)>αj​

= ∑ i = 1 m ∑ j = 1 m α i y ( i ) y ( j ) < x ( i ) , x ( j ) > α j =\sum^m_{i=1}\sum^m_{j=1}\alpha_iy^{(i)}y^{(j)}<x^{(i)},x^{(j)}>\alpha_j =∑i=1m​∑j=1m​αi​y(i)y(j)<x(i),x(j)>αj​

= ∑ i = 1 m α i ∑ j = 1 m y ( i ) y ( j ) < x ( i ) , x ( j ) > α j =\sum^m_{i=1}\alpha_i\sum^m_{j=1}y^{(i)}y^{(j)}<x^{(i)},x^{(j)}>\alpha_j =∑i=1m​αi​∑j=1m​y(i)y(j)<x(i),x(j)>αj​

令矩阵 H H H满足 H i j = y ( i ) y ( j ) < x ( i ) , x ( j ) > H_{ij}=y^{(i)}y^{(j)}<x^{(i)},x^{(j)}> Hij​=y(i)y(j)<x(i),x(j)>,则进一步

= ∑ i = 1 m α i ∑ j = 1 m H i j α j =\sum^m_{i=1}\alpha_i\sum^m_{j=1}H_{ij}\alpha_j =∑i=1m​αi​∑j=1m​Hij​αj​

= ∑ i = 1 m α i H i α =\sum^m_{i=1}\alpha_iH_{i}\alpha =∑i=1m​αi​Hi​α

= α T H α = x T H x =\alpha^TH\alpha=x^THx =αTHα=xTHx

其实,基于同样的技巧, H H H 矩阵可以写成 H = Y T X X T Y = ( Y . ∗ X ) ( Y . ∗ X ) T H=Y^TXX^TY=(Y.*X)(Y.*X)^T H=YTXXTY=(Y.∗X)(Y.∗X)T.

其中, ( X X T ) i j = x ( i ) ( x ( j ) ) T = < x ( i ) , x ( j ) > (XX^T)_{ij}=x^{(i)}(x^{(j)})^T=<x^{(i)},x^{(j)}> (XXT)ij​=x(i)(x(j))T=<x(i),x(j)>,这里 x ( i ) x^{(i)} x(i) 是行向量。

code 中将较小的 a l p h a alpha alpha 默认为0,因为求解器用的是迭代方法,返回数值解,可能收敛到一个很小但不为0的值;
其他 a l p h a alpha alpha 对应的是 support vector,代入公式计算 ω ∗ \omega^* ω∗ 和 b ∗ b^* b∗.

code

    % 构建目标函数H = zeros(m);for i = 1 : mfor j = 1 : mH(i, j) = y(i) * y (j) * x(i, :) * x(j, :)';endend% H = (y .* x) * (y .* x)';% H = (H + H') / 2;f = (-1) * ones(m, 1);% 构建约束Aeq = y';beq = 0;lb = zeros(m, 1);ub = zeros(m, 1);ub(:) = C;% 利用quadprog求解器求解对偶问题% quadprog(H,f,A,b,Aeq,beq,lb,ub)[alpha, fval] = quadprog(H, f, [], [], Aeq, beq, lb, ub);% 求support vectoralpha(find(alpha < 1e-8)) = 0;sv = find(alpha > 0 & alpha < C);w = 0;  % omegafor i = 1 : length(sv)w = w + alpha(sv(i)) * y(sv(i)) * x (sv(i), :)';endnum = y - x * w;b = sum(num(sv)) / length(sv);

在 linear-separable 数据集上验证


正则项参数C变化,带来优化目标的“倾斜”,但是 margin 和 C 很难发掘出精确的代数关系(经过一个非线性问题的求解),只能说明它们的相关性。

做手写数字识别(仅有0和1):

由于训练集太大,采用不重复采样:

m = length(x);
% 使用全部训练集,H矩阵大小为12665*12665,运算巨大,耗时较久
% 因此采样部分训练集,大小为tr_size
rp = randperm(m);
tr_size = 1000;
samp = rp(1 : tr_size);
x = x(samp, :); y = y(samp);
m = length(x);

核方法

预处理 kernal matrix,之后将 < x ( i ) , x ( j ) > <x^{(i)},x^{(j)}> <x(i),x(j)> 替换为 k m a t ( i , j ) kmat(i,j) kmat(i,j).

% 获取基于核函数Radial Basis Function计算的关系矩阵kmat
function kmat = get_kernel_mat(x, gamma)kmat = [];for i = 1 : length(x)for j = 1 : length(x)kmat(i, j) = exp(-gamma * norm(x(i, :) - x(j, :)) ^ 2);endend
end

之后,决策函数不直接计算,也无法计算,因为 mapping 函数具有无穷维度,实际上通过 k m a t kmat kmat 可以绕过直接计算 mapping ,如下图,实际就是代换 ω ∗ \omega^* ω∗,可以得到 ϕ T ( x ( i ) ) ϕ ( x ( j ) ) \phi^T(x^{(i)})\phi(x^{(j)}) ϕT(x(i))ϕ(x(j)).

Mark the usage of contour func:
Here since vals only have two values 1 and -1,contour lines also become the boundaries.

    % Make classification predictions over a grid of valuesxplot = linspace(min(x(:, 1)), max(x(:, 1)), 100)';yplot = linspace(min(x(:, 2)), max(x(:, 2)), 100)';[X, Y] = meshgrid(xplot, yplot);vals = zeros(size(X));% For each point in this grid, you need to compute its decision% value. Store the decision values in vals.% ...hold onplot(x(pos, 1), x(pos, 2), '.r');plot(x(neg, 1), x(neg, 2), '.b');xlabel('x_1'); ylabel('x_2');str = strcat('\gamma=', num2str(gamma(t)));title(str);% Plot the SVM boundarycolormap bone;contour(X, Y, vals, [0 0], 'LineWidth', 2);

【ML实验5】SVM(手写数字识别、核方法)相关推荐

  1. python手写数字识别教学_python实现基于SVM手写数字识别功能

    本文实例为大家分享了SVM手写数字识别功能的具体代码,供大家参考,具体内容如下 1.SVM手写数字识别 识别步骤: (1)样本图像的准备. (2)图像尺寸标准化:将图像大小都标准化为8*8大小. (3 ...

  2. 实验四:手写数字识别的神经网络算法设计与实现

    一.实验目的 通过学习BP神经网络技术,对手写数字进行识别,基于结构的识别法及模板匹配法来提高识别率. 二.实验器材 PC机     matlab软件 三.实验内容 按照BP神经网络设计方法选用两层B ...

  3. svm手写数字识别_KNN 算法实战篇如何识别手写数字

    上篇文章介绍了KNN 算法的原理,今天来介绍如何使用KNN 算法识别手写数字? 1,手写数字数据集 手写数字数据集是一个用于图像处理的数据集,这些数据描绘了 [0, 9] 的数字,我们可以用KNN 算 ...

  4. svm手写数字识别python_SVM算法识别手写体数字

    sklearn内部集成了一些手写体数字图片数据集,现在我们使用这些数据,用SVM支持向量机算法进行训练识别的练习.笔者习惯用pycharm,今天手痒,用一下Spyder编辑,顺便对比一下哪一个好用.废 ...

  5. 【深度学习】手写数字识别Tensorflow2实验报告

    实验一:手写数字识别 一.实验目的 利用深度学习实现手写数字识别,当输入一张手写图片后,能够准确的识别出该图片中数字是几.输出内容是0.1.2.3.4.5.6.7.8.9的其中一个. 二.实验原理 ( ...

  6. 基于深度学习的手写数字识别算法Python实现

    摘 要 深度学习是传统机器学习下的一个分支,得益于近些年来计算机硬件计算能力质的飞跃,使得深度学习成为了当下热门之一.手写数字识别更是深度学习入门的经典案例,学习和理解其背后的原理对于深度学习的理解有 ...

  7. Java软件研发工程师转行之深度学习(Deep Learning)进阶:手写数字识别+人脸识别+图像中物体分类+视频分类+图像与文字特征+猫狗分类

    本文适合于对机器学习和数据挖掘有所了解,想深入研究深度学习的读者 1.对概率基本概率有所了解 2.具有微积分和线性代数的基本知识 3.有一定的编程基础(Python) Java软件研发工程师转行之深度 ...

  8. 聚类(K-means)实现手写数字识别

    其他实现手写数字识别的方法: 1.KNN实现手写数字识别 2. 卷积神经网络(CNN)实现手写数字识别 3. 全连接神经网络实现手写数字识别 4. 聚类(K-means)实现手写数字识别-2 实验数据 ...

  9. 基于最小错误率的贝叶斯决策实现手写数字识别

    基于最小错误率的贝叶斯决策实现手写数字识别 1.实验目的 2.实验方法及步骤 (1)平台搭建 (2)特征描述 (3)建立最小错误率贝叶斯决策分类器 (4)实现手写数字识别 3.实验结果 4.实验结果讨 ...

  10. 【图像识别】基于卷积神经网络CNN手写数字识别matlab代码

    1 简介 针对传统手写数字的随机性,无规律性等问题,为了提高手写数字识别的检测准确性,本文在研究手写数字区域特点的基础上,提出了一种新的手写数字识别检测方法.首先,对采集的手写数字图像进行预处理,由于 ...

最新文章

  1. linux之lsusb命令和cd -命令使用总结
  2. go read text file into string array
  3. 【刷题】HDU 4966 GGS-DDU
  4. Spring与Web整合
  5. php while 语录,PHP While 循环
  6. uniapp ---- 添加分页
  7. C++STL之next_permutation()函数使用
  8. python机器学习案例系列教程——层次聚类(文档聚类)
  9. pyspark 学习笔记——pyspark安装
  10. excel在线_如何设计有趣又实用的在线课程
  11. 计算机考试有python吗_计算机二级考试有python吗
  12. oppoa5降级教程_OPPO A5官方出厂rom系统刷机包下载_卡刷升级包降级回退包
  13. 爬虫中proxies小分享
  14. 制作带边框的圆形头像
  15. matlab的梯形公式推导公式,用MATLAB作数值积分例.计算1)矩形公式和梯形公式将(0,4)-Read.ppt...
  16. 从零开始学前端第十七讲--微信小程序开发入门
  17. PicPick截图神器使用体验
  18. HDU 2096 小明A+B
  19. 字节跳动,跳到哪了?
  20. 日系赛璐璐鼻子上色教程,干货满满!

热门文章

  1. 如何通过浏览器启动bat文件
  2. CCPD数据集 不限速 夸克云盘下载 车牌数据集 40G
  3. ClusterONE算法详解及优化
  4. java的Debug的使用
  5. 蓝牙耳机哪个品牌音质好?300到400的蓝牙耳机推荐
  6. VBA列数字与字母互换
  7. iOS内存管理之Swapped Memory
  8. matlab中的exist()函数
  9. 教你怎么用SOLIDWORKS选出好西瓜!
  10. ipmi nf5280m5 浪潮_浪潮NF5280M5服务器介绍