起本篇题目还是比较纠结的,原因是我本意打算寻找这样一个算法:在测量数据有比较大离群点时如何估计原始模型。

上一篇曲面拟合是假设测量数据基本符合均匀分布,没有特别大的离群点的情况下,我们使用最小二乘得到了不错的拟合结果。

但是当我加入比如10个大的离群点时,该方法得到的模型就很难看了。所以我就在网上搜了一下,有没有能够剔除离群点的方法。

结果找到了如下名词:加权最小二乘、迭代最小二乘、抗差最小二乘、稳健最小二乘。

他们细节的区别我就不过分研究了,不过这些最小二乘似乎表达的是一个意思:

构造权重函数,给不同测量值不同的权重,偏差大的值权重小,偏差小的权重大,采用迭代最小二乘的方式最优化目标函数。

下面是matlab中robustfit函数权重函数,可以参考一下:

权重函数(Weight Function 等式(Equation 默认调节常数(Default Tuning Constant
'andrews' w = (abs(r)<pi) .* sin(r) ./ r 1.339
'bisquare' (default) w = (abs(r)<1) .* (1 - r.^2).^2 4.685
'cauchy' w = 1 ./ (1 + r.^2) 2.385
'fair' w = 1 ./ (1 + abs(r)) 1.400
'huber' w = 1 ./ max(1, abs(r)) 1.345
'logistic' w = tanh(r) ./ r 1.205
'ols' 传统最小二乘估计 (无权重函数)
'talwar' w = 1 * (abs(r)<1) 2.795
'welsch' w = exp(-(r.^2)) 2.985

代码如下:

clear all;
close all;
clc; a=;b=;c=-;d=;e=;f=; %系数
n=:0.2:;
x=repmat(n,,);
y=repmat(n',1,96);
z=a*x.^+b*y.^+c*x.*y+d*x+e*y +f; %原始模型
surf(x,y,z) N=;
ind=int8(rand(N,)*+); X=x(sub2ind(size(x),ind(:,),ind(:,)));
Y=y(sub2ind(size(y),ind(:,),ind(:,)));
Z=z(sub2ind(size(z),ind(:,),ind(:,)))+rand(N,)*; %生成待拟合点,加个噪声 Z(:)=Z(:)+; %加入离群点 hold on;
plot3(X,Y,Z,'o'); XX=[X.^ Y.^ X.*Y X Y ones(,)];
YY=Z; C=inv(XX'*XX)*XX'*YY; %最小二乘
z=C()*x.^+C()*y.^+C()*x.*y+C()*x+C()*y +C(); %拟合结果
Cm=C;
mesh(x,y,z) z=C()*X.^+C()*Y.^+C()*X.*Y+C()*X+C()*Y +C();
C0=C;
while
r = z-Z;
w = tanh(r)./r; %权重函数
W=diag(w); C=inv(XX'*W*XX)*XX'*W*YY; %加权最小二乘
z=C()*X.^+C()*Y.^+C()*X.*Y+C()*X+C()*Y +C(); %拟合结果 if norm(C-C0)<1e-10
break;
end
C0=C;
end z=C()*x.^+C()*y.^+C()*x.*y+C()*x+C()*y +C(); %拟合结果
mesh(x,y,z)

结果如下:

图中一共三个曲面,最下层是原模型,最上层是普通最小二乘拟合模型,中间层是加权最小二乘拟合模型。

可以看出,加权最小二乘效果要好一些。

参考:

https://www.cnblogs.com/xiongyunqi/p/3737323.html

https://blog.csdn.net/baidu_35570545/article/details/55212241

matlab练习程序(加权最小二乘)的更多相关文章

  1. matlab练习程序(最小二乘多项式拟合)

    最近在分析一些数据,就是数据拟合的一些事情,用到了matlab的polyfit函数,效果不错. 因此想了解一下这个多项式具体是如何拟合出来的,所以就搜了相关资料. 这个文档介绍的还不错,我估计任何一本 ...

  2. matlab练习程序(局部加权线性回归)

    通常我们使用的最小二乘都需要预先设定一个模型,然后通过最小二乘方法解出模型的系数. 而大多数情况是我们是不知道这个模型的,比如这篇博客中z=ax^2+by^2+cxy+dx+ey+f 这样的模型. 局 ...

  3. (转)matlab练习程序(HOG方向梯度直方图)

    matlab练习程序(HOG方向梯度直方图)http://www.cnblogs.com/tiandsp/archive/2013/05/24/3097503.html HOG(Histogram o ...

  4. matlab练习程序(SUSAN检测)

    matlab练习程序(SUSAN检测) SUSAN算子既可以检测角点也可以检测边缘,不过角点似乎比不过harris,边缘似乎比不过Canny.不过思想还是有点意思的. 主要思想就是:首先做一个和原图像 ...

  5. matlab练习程序(曲面拟合)

    这里用到的还是最小二乘方法,和上一次这篇文章原理差不多. 就是首先构造最小二乘函数,然后对每一个系数计算偏导,构造矩阵乘法形式,最后解方程组. 比如有一个二次曲面:z=ax^2+by^2+cxy+dx ...

  6. matlab示例程序--Motion-Based Multiple Object Tracking--卡尔曼多目标跟踪程序--解读

    静止背景下的卡尔曼多目标跟踪 最近学习了一下多目标跟踪,看了看MathWorks的关于Motion-Based Multiple Object Tracking的Documention. 官网链接:h ...

  7. IRLS(迭代加权最小二乘)

    IRLS用于解决这种目标函数的优化问题(实际上是用2范数来近似替代p范数,特殊的如1范数). 可将其等价变形为加权的线性最小二乘问题: 其中W(t)可看成对角矩阵,每步的w可用下面的序列代替 如果 p ...

  8. matlab练习程序(透视投影,把lena贴到billboard上)

    本练习程序是受到了这个老外博文的启发,感觉挺有意思,就尝试了一下.他用的是opencv,我这里用的是matlab. 过去写过透视投影,当时是用来做倾斜校正的,这次同样用到了透视投影,不过更有意思,是将 ...

  9. matlab练习程序(多圆交点)

    最近总是对计算几何方面的程序比较感兴趣. 多圆求交点,要先对圆两两求交点. 有交点的圆分为相切圆和相交圆. 相切圆求法: 1.根据两圆心求直线 2.求公共弦直线方程 3.求两直线交点即两圆切点. 相交 ...

随机推荐

  1. 微信小程序 获得用户输入内容

    在微信小程序里,如何获得用户输入的内容?? js: document.getElementById("Content").value jq:$("#Content&quo ...

  2. Django--缓存设置

    Django缓存机制 一. 缓存介绍 缓存是将一些常用的数据保存内存或者memcache中,在一定的时间内有人来访问这些数据时,则不再去执行数据库及渲染等操作,而是直接从内存或memcache的缓存中 ...

  3. stack源码

    stack概述 stack是一种先进后出的数据结构,它只有一个出口,允许新增元素.移除元素.取得最顶端元素,但每次只能处理顶端元素,也就是说,stack不允许遍历行为. stack定义 以某种既有容器 ...

  4. 部署 YApi 接口管理服务

    安装 Node curl -sL https://rpm.nodesource.com/setup_8.x | bash - yum install -y nodejs 安装 MongoDB vi / ...

  5. Vagrant Ansible Playbook 安装一群虚拟机

    https://docs.ansible.com/ https://favoorr.github.io/2017/01/06/vagrant-virtualbox-vagrantfile-config ...

  6. 用canvas画一个等腰三角形

    上图是代码,注意,宽高只有在canvas标签内部设置宽高,绘制的路径显示才是正常的:效果如下:

  7. [转]Memcache的使用和协议分析详解

    Memcache是什么 Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力. 它可以应 ...

  8. bash内置命令mapfile:读取文件内容到数组

    bash提供了两个内置命令:readarray和mapfile,它们是同义词.它们的作用是从标准输入读取一行行的数据,然后每一行都赋值给一个数组的各元素.显然,在shell编程中更常用的是从文件.从管 ...

  9. 分布式系统监视zabbix讲解五之web监控--技术流ken

    Web 监控 概况 你可以使用 Zabbix 检查几个网站可用性方面. 如果要使用 Web 检测功能,必须在 编译Zabbix 的时候加入 cURL(libcurl) 的支持. 要使用 Web 监控, ...

  10. js_jquery_创建cookie有效期问题_时区问题

    用jquery设置Cookie过期的两种方式: $.cookie('名', '值', { expires: 过期时间(DateTime), path: "/", domain: w ...