在 MATLAB 中向量化线性方程组的解

2023-12-22

Summary:本问题涉及线性回归计算算法的改进。


我有一个 3D (dlMAT)表示在不同曝光时间拍摄的同一场景的单色照片的数组(向量IT)。从数学上讲,沿第三维的每个向量dlMAT代表需要解决的单独线性回归问题。需要估计其系数的方程的形式为:

DL = R*IT^P, where DL and IT是通过实验获得的并且R and P必须估计。

上式经过对数处理后可以转化为简单的线性模型:

log(DL) = log(R) + P*log(IT)  =>  y = a + b*x

下面介绍的是求解该方程组的最“简单”方法,其本质上涉及迭代所有“第三维向量”并拟合阶多项式1 to (IT,DL(ind1,ind2,:):

%// Define some nominal values:
R = 0.3;
IT = 600:600:3000;
P = 0.97;
%// Impose some believable spatial variations:
pMAT = 0.01*randn(3)+P;
rMAT = 0.1*randn(3)+R;
%// Generate "fake" observation data:
dlMAT = bsxfun(@times,rMAT,bsxfun(@power,permute(IT,[3,1,2]),pMAT));
%// Regression:
sol = cell(size(rMAT)); %// preallocation
for ind1 = 1:size(dlMAT,1)
  for ind2 = 1:size(dlMAT,2)
    sol{ind1,ind2} = polyfit(log(IT(:)),log(squeeze(dlMAT(ind1,ind2,:))),1);
  end
end
fittedP = cellfun(@(x)x(1),sol);      %// Estimate of pMAT
fittedR = cellfun(@(x)exp(x(2)),sol); %// Estimate of rMAT

上述做法seems它是矢量化的一个很好的候选者,因为它没有利用 MATLAB 的主要优势(即 MATrix 运算)。因此,它的扩展性不太好,并且执行时间比我想象的要长得多。


存在基于矩阵除法执行此计算的替代方法,如所示here http://www.mathworks.com/matlabcentral/answers/214656-least-square-curve-fit-for-function-y-a-x-b-1-x-c and here https://www.mathworks.com/matlabcentral/newsreader/view_thread/158963#message_body_400321,其中涉及这样的事情:

sol = [ones(size(x)),log(x)]\log(y);

也就是说,附加一个向量1s 到观察结果,然后是mldivide http://www.mathworks.com/help/matlab/ref/mldivide.html求解方程组。

我面临的主要挑战是如何使我的数据适应算法(反之亦然)。

问题#1:如何扩展基于矩阵除法的解决方案来解决上述问题(并可能取代我正在使用的循环)?

问题#2(奖励):这种基于矩阵除法的解决方案背后的原理是什么?


The secret ingredient behind the solution that includes matrix division is the Vandermonde matrix https://en.wikipedia.org/wiki/Vandermonde_matrix. The question discusses a linear problem (linear regression), and those can always be formulated as a matrix problem, which \ (mldivide) can solve in a mean-square error sense‡ https://chat.stackoverflow.com/transcript/message/27426179#27426179. Such an algorithm, solving a similar problem, is demonstrated and explained in this answer https://math.stackexchange.com/a/260896.

Below is benchmarking code that compares the original solution with two alternatives suggested in chat1 https://chat.stackoverflow.com/transcript/message/27425670#27425670, 2 https://chat.stackoverflow.com/transcript/message/27426276#27426276 :

function regressionBenchmark(numEl)
clc
if nargin<1, numEl=10; end
%// Define some nominal values:
R = 5;
IT = 600:600:3000;
P = 0.97;
%// Impose some believable spatial variations:
pMAT = 0.01*randn(numEl)+P;
rMAT = 0.1*randn(numEl)+R;
%// Generate "fake" measurement data using the relation "DL = R*IT.^P"
dlMAT = bsxfun(@times,rMAT,bsxfun(@power,permute(IT,[3,1,2]),pMAT));
%% // Method1: loops + polyval
disp('-------------------------------Method 1: loops + polyval')
tic; [fR,fP] = method1(IT,dlMAT); toc;
fprintf(1,'Regression performance:\nR: %d\nP: %d\n',norm(fR-rMAT,1),norm(fP-pMAT,1));
%% // Method2: loops + Vandermonde
disp('-------------------------------Method 2: loops + Vandermonde')
tic; [fR,fP] = method2(IT,dlMAT); toc;
fprintf(1,'Regression performance:\nR: %d\nP: %d\n',norm(fR-rMAT,1),norm(fP-pMAT,1));
%% // Method3: vectorized Vandermonde
disp('-------------------------------Method 3: vectorized Vandermonde')
tic; [fR,fP] = method3(IT,dlMAT); toc;
fprintf(1,'Regression performance:\nR: %d\nP: %d\n',norm(fR-rMAT,1),norm(fP-pMAT,1));
function [fittedR,fittedP] = method1(IT,dlMAT)
sol = cell(size(dlMAT,1),size(dlMAT,2));
for ind1 = 1:size(dlMAT,1)
  for ind2 = 1:size(dlMAT,2)
    sol{ind1,ind2} = polyfit(log(IT(:)),log(squeeze(dlMAT(ind1,ind2,:))),1);
  end
end

fittedR = cellfun(@(x)exp(x(2)),sol);
fittedP = cellfun(@(x)x(1),sol);

function [fittedR,fittedP] = method2(IT,dlMAT)
sol = cell(size(dlMAT,1),size(dlMAT,2));
for ind1 = 1:size(dlMAT,1)
  for ind2 = 1:size(dlMAT,2)
    sol{ind1,ind2} = flipud([ones(numel(IT),1) log(IT(:))]\log(squeeze(dlMAT(ind1,ind2,:)))).'; %'
  end
end

fittedR = cellfun(@(x)exp(x(2)),sol);
fittedP = cellfun(@(x)x(1),sol);

function [fittedR,fittedP] = method3(IT,dlMAT)
N = 1; %// Degree of polynomial
VM = bsxfun(@power, log(IT(:)), 0:N); %// Vandermonde matrix
result = fliplr((VM\log(reshape(dlMAT,[],size(dlMAT,3)).')).');
%// Compressed version:
%// result = fliplr(([ones(numel(IT),1) log(IT(:))]\log(reshape(dlMAT,[],size(dlMAT,3)).')).');

fittedR = exp(real(reshape(result(:,2),size(dlMAT,1),size(dlMAT,2))));
fittedP = real(reshape(result(:,1),size(dlMAT,1),size(dlMAT,2)));

方法2之所以能够向量化为方法3,本质上是因为矩阵乘法可以通过第二个矩阵的列来分隔。如果A*B产生矩阵X,那么根据定义A*B(:,n) gives X(:,n)对于任何n。移动A到右侧mldivide,这意味着划分A\X(:,n)可以一劳永逸n with A\X。这同样适用于超定系统 https://en.wikipedia.org/wiki/Overdetermined_system(线性回归问题),其中一般没有精确解,并且mldivide找到矩阵最小化均方误差 https://en.wikipedia.org/wiki/Overdetermined_system#Approximate_solutions。在这种情况下,操作也A\X(:,n)(方法2)可以一次性全部完成n with A\X(方法3)。

增加大小时改进算法的影响dlMAT如下所示:

对于以下情况500*500 (or 2.5E5) 元素,加速比Method 1 to Method 3是关于x3500!

观察也很有趣output http://www.mathworks.com/help/matlab/matlab_prog/profiling-for-improving-performance.html#f9-17206 of profile http://www.mathworks.com/help/matlab/ref/profile.html(这里以500*500的情况为例):

Method 1

Method 2

Method 3

从上面可以看出,通过重新排列元素squeeze http://www.mathworks.com/help/matlab/ref/squeeze.html and flipud http://www.mathworks.com/help/matlab/ref/flipud.html占用大约一半(!)的运行时间Method 2。还可以看出,溶液从细胞到基质的转换会损失一些时间。

由于第三个解决方案避免了所有这些陷阱,以及完全的循环(这主要意味着在每次迭代时重新评估脚本) - 毫不奇怪,它会带来相当大的加速。

Notes:

  1. “压缩”版本和“显式”版本之间几乎没有什么区别Method 3赞成“明确”的版本。因此,它没有被纳入比较。
  2. 尝试了一种解决方案,其中输入Method 3 were gpuArray-ed。这并没有提供改进的性能(甚至在某种程度上降低了性能),可能是由于错误的实现,或者与在 RAM 和 VRAM 之间来回复制矩阵相关的开销。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 MATLAB 中向量化线性方程组的解 的相关文章

  • 经理游戏:如何计算市值?

    通常 足球经理游戏中的球员都有市场价值 经理们根据这些市场价值出售他们的球员 他们想 哦 这个球员值3 000 000 所以我会尝试以3 500 000的价格把他卖掉 所有球员都具备三个基本素质 强度值 1 99 他们所能达到的最大力量 1
  • MATLAB 子图标题和轴标签

    我有以下脚本来最终绘制 4 x 2 子图 files getAllFiles preliminaries n size files cases cell 1 n m cell 1 n for i 1 1 n S load files i c
  • WCF - 在服务中抛出故障异常的开销

    我发布了一个question https stackoverflow com questions 81306 wcf faults exceptions versus messages关于使用消息与故障异常在服务之间传达业务规则 我的印象是
  • SQL 执行计划是基于架构还是数据,或者两者兼而有之?

    我希望这个问题不太明显 我已经找到了很多关于解释执行计划的好信息 但有一个问题我还没有找到答案 该计划 更具体地说是相对 CPU 成本 仅基于架构 还是数据库中当前的实际数据 我尝试对我的产品数据库中需要索引的位置进行一些分析 但正在使用我
  • Tensorflow 中使用 Adam Optimizer 时损失突然增加

    I am using a CNN for a regression task I use Tensorflow and the optimizer is Adam The network seems to converge perfectl
  • 优化 - 步进可能表现奇怪:iOS/Unity

    我正在尝试将 Unity 集成到 iOS 应用程序中 我已经遵循了这个教程http www agnosticdev com blog entry swift integrating unity and vuforia ios swift p
  • java中高效的输入流到字符串方法

    因此 我在 Java 中的 诚然非常简单 应用程序上运行探查器 令我惊讶的是 仅次于需要在时间上发出 HTTP 请求的方法的是我的方法 inputStreamToString方法 目前它的定义如下 public static String
  • Python 中 Matlab 'fscanf' 的等价物是什么?

    Matlab函数fscanf 似乎很强大 python 或numpy 中是否有相同的等效项 具体来说 我想从文件中读取矩阵 但我不想迭代每一行来读取矩阵 类似的东西 来自 matlab 用于读取 2D 1000x1000 矩阵 matrix
  • 如何使用最小生成树方法将边缘连接到图像中的节点

    我正在做我的手写图像图形匹配项目 我想在图形中表示给定的单词图像 我使用下面的算法 Algorithm input Binary image B Grid width w Grid height h Output Graph g V E w
  • 字符串文字会被编译器优化吗?

    C 编译器或 NET CLR 是否对字符串文字 常量进行了任何巧妙的内存优化 我可以发誓我听说过 字符串内化 的概念 因此在程序中的任何两位代码中 文字 这是一个字符串 实际上会指代同一个对象 大概是安全的 对于字符串来说是这样的 不可变
  • UDP接收和发送Matlab

    我目前正在努力从外部设备接收数据包 然后将数据发送到另一个设备 我有一个工作 Simulink 模型 但我不知道如何在 Matlab 中对其进行编码 Matlab 中 UDP 接收块的参数如下图所示UDP 接收参数 https i stac
  • MATLAB 图形渲染:OpenGL 与 Painters?

    当谈到使用哪个渲染器来处理 MATLAB 图形或何时它很重要时 我一无所知 但我遇到过某些示例 其中does matter plot 0 0 ko markersize 50 linewidth 8 set gcf renderer ope
  • Java 反射性能

    使用反射创建对象而不是调用类构造函数是否会导致任何显着的性能差异 是的 一点没错 通过反射查找类是 按幅度 更贵 Quoting Java关于反射的文档 http java sun com docs books tutorial refle
  • 静态时序数据的数据库解决方案

    我们拥有一个庞大且不断增长的实验数据集 该数据集取自约 30 000 名受试者 对于每个主题 都有多个数据记录 在每个记录中 收集了多个生理数据时间序列 每个时间序列约 90 秒长 并以 250Hz 采样 我应该注意到 时间序列的任何给定实
  • 在现代 x86-64 上计算 64 位整数的整数 Log10 的最快方法是什么?

    标题 我找到了大量 32 位示例 但没有找到完整的 64 位示例 使用这个帖子 https codegolf stackexchange com questions 47290 fastest way to compute order of
  • Numpy:生成二维高斯 pdf 总和作为数组

    我正在尝试生成一个 600 x 600 numpy 数组 其中包含 10 个类似高斯数组的总和 每个数组都有一个随机生成的中心 我尝试使用高斯滤波器来生成各个类似高斯的数组 然后将它们相加 但我确信有一种矢量化的方法可以解决这个问题 即使n
  • 在 Matlab 中将绘图从高斯混合变换为均匀分布

    考虑以下抽签2x1Matlab 中的向量 其概率分布是两个高斯分量的混合 P 10 3 number draws v 1 First component mu a 0 0 5 sigma a v 0 0 v Second component
  • 删除大量记录需要很长时间

    我有一个包含约 60 000 行的数据库表 在 SQL Server 2012 Express 上运行 我使用以下代码来清除旧行 Deleting CPU measurements older than oldestAllowedTime
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • Matlab 中是否有相当于 R 的 dput() 的函数?

    Matlab 中是否有相当于 R 的 dput 的函数 dput 将 R 对象的 ASCII 文本表示形式写入文件或连接 UPDATE 1 添加了递归和对单元格的支持 UPDATE 2 添加了对结构的支持 UPDATE 3 增加了对逻辑 整

随机推荐

  • 使用 1-1 函数从 id 生成代码

    有没有好的可逆 1 1 函数将一个整数映射到另一个整数 例如 给定范围 0 5 我想找到一个映射的 0 gt 3 1 gt 2 2 gt 4 3 gt 5 4 gt 1 5 gt 0 此外 映射应该看起来是随机的 您可以按升序填充数组并对其
  • 使用 Laravel 查询生成器和 LEFT JOIN 删除行

    如何在一个查询中从多个表中删除行 使用左连接 查询 DELETE deadline job FROM deadline LEFT JOIN job 所以 我尝试这样 DB table deadline job gt leftJoin job
  • 下载文件时显示“请稍候”消息或进度条

    我使用以下 WordPress 管理员通知来提示用户下载一些文件 我想在下载文件时包含一个进度条或至少包含一个 正在下载 请稍候 消息 有任何想法吗 我已经尝试了几种 jQuery 解决方案 但没有任何效果 对于 jQuery 我完全是个菜
  • 非静态字段、方法或属性需要对象引用吗?

    我知道这可能是一个非常新的问题 所以我很抱歉 我正在尝试从另一个表单 MaxScore 访问 Form1 上标签的 Text 属性 当我单击 MaxScore 上的 确定 按钮时 我想使用 max ToString 将 Form1 的 my
  • 如何直接从我的服务器将视频上传到 Youtube?

    我正在设置一个 无头 网络服务器 让人们可以制作自己的自定义延时电影 有几个人想将他们制作的延时视频上传到 YouTube 与其将视频下载到该人的笔记本电脑上 然后该人手动将其上传到 YouTube 有没有一种方法可以在我的网络服务器上编写
  • 配方/成分/测量/数量的数据库架构

    我正在创建一个食谱应用程序来帮助我妻子实现她的蛋糕爱好 这个想法是创建一个食谱数据库来保存她所有的蛋糕食谱 每个食谱都有多种成分 每种成分都有一个测量值 克 毫升 茶匙等 然后是数量 我了解如何创建 食谱 和 成分 表 以及如何将这两个表与
  • 按降序对 int 数组进行排序[重复]

    这个问题在这里已经有答案了 可能的重复 按降序对基本类型数组进行排序 https stackoverflow com questions 215271 sort arrays of primitive types in descending
  • 使用 Hangout api 进行视频通话 [已关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 你好 我有一个 Android 应用程序 我想要其中的视频聊天功能 我在互联网上搜索了很多 但找不到任何有效且简单的解决方案 然后我找
  • 如何通过切换(“慢”)使其更平滑

    我有以下代码可以工作 但在每个切换操作结束时它变得有点跳动 如果我切换段落会更流畅吗 我正在尝试获取该段落 但我不知道该怎么做 div div class toppara p Conte p div div
  • 从 Express 中间件中排除路由

    我有一个节点应用程序 就像防火墙 调度程序一样位于其他微服务前面 它使用如下所示的中间件链 app use app lookup app use timestamp validator app use request body app us
  • 如何在验证消息 Laravel 5.2 中获取数组索引

    我放入的这些数组Laravel Validator作为参数 item gt string rules item string gt Item number index is not string messages 我希望有index num
  • 如何使用 Spring Boot 注册 servlet?

    这段代码不起作用 我有一个 web xml 需要翻译成 spring boot
  • 300GB Postgis 表索引速度慢

    我正在将大约 300GB 的等高线数据加载到 postgis 表中 为了加快这个过程 我读到首先加载数据 然后创建索引是最快的 加载数据只花了大约2天的时间 但现在我已经等待索引大约30天了 它仍然没有准备好 查询是 create inde
  • 如何使用 React Native Agora 显示传入视频通话

    我想在我的 React Native 应用程序中添加实时通话功能 我正在使用agora和socket io来使其实时 并且当应用程序位于前台时它工作正常 但是当应用程序关闭时我被卡住了 因为应用程序关闭时套接字不起作用我想像来电屏幕一样显示
  • 您可以将图像分配给 border-right 吗?

    我正在 html 和 css 中制作一个导航菜单 但我希望每个导航项的右侧边框是一个图像 I tried border right url image jpg 但这没有用 我该怎么做 您可以使用背景图像 然后将背景图像放置在每个元素的右侧
  • 在java中,除了遵循if-else梯子之外,还有什么更好的选择呢?

    情况 我正在检查文件名 文件名存储在String变量称为str并根据入住条件if语句我正在设置一个名为的变量的值mailType if str contains template if str contains unsupported ma
  • Java -> Scala,集合上的性能

    在Java中 根据集合的用法 我们不使用相同的实现 即ArrayList vs LinkedList 来自 Java 背景 有人可以告诉我关于 Scala 集合和性能注意事项我应该了解什么吗 看来 Scala List 的不可变版本是某种不
  • 在 Angular 中的兄弟组件之间传递数据

    Above image depicts my Angular 2 application Main component has two child components FromComponent and ToComponent FromC
  • 通过 PubSubHubbub 推送新直播的通知

    我希望收到有关 YouTube 频道的新直播的通知 如中所述YouTube v3 推送通知 https developers google com youtube v3 guides push notifications我已经设置了一个公共
  • 在 MATLAB 中向量化线性方程组的解

    Summary 本问题涉及线性回归计算算法的改进 我有一个 3D dlMAT 表示在不同曝光时间拍摄的同一场景的单色照片的数组 向量IT 从数学上讲 沿第三维的每个向量dlMAT代表需要解决的单独线性回归问题 需要估计其系数的方程的形式为