matlab - 如何从具有高斯噪声的输出中找到变换矩阵?
问题描述
对于下面给定的输入和输出,矩阵A
可以通过伪逆或mrdivision
在 MATLAB 中找到。同样,我现在想知道,如何确定A
我的输出信号Y
矩阵是否包含加性零均值、不相关、高斯噪声?
x1 = [1 1 1]';
x2 = [0 1 1]';
x3 = [0 0 1]';
x4 = [1 0 1]';
y1 = [1 2 0]';
y2 = [-1 0 3]';
y3 = [3 1 1]';
y4 = [5 3 -2]';
X = [x1 x2 x3 x4];
Y = [y1 y2 y3 y4];
A = Y/X
另外,我对未知噪声输出进行了建模,如下所示:
y1_n = y1 + sqrt(var(y1))*randn(size(y1));
y2_n = y2 + sqrt(var(y2))*randn(size(y2));
y3_n = y3 + sqrt(var(y3))*randn(size(y3));
y4_n = y4 + sqrt(var(y4))*randn(size(y4));
Y = [y1_n y2_n y3_n y4_n];
解决方案
该语句A = Y/X
求解线性方程组A*X = Y
。如果系统是超定的,就像你的情况一样,给出的解决方案是最小二乘解决方案。因此,如果您对 有加性、零均值、不相关、高斯噪声Y
,那么A = Y/X
将为您提供最佳的、无偏的估计A
。
请注意,您添加到Y
矩阵中的噪声非常大,因此估计值A
与理想值相差甚远。如果添加较少的噪声,估计值会更接近:
x1 = [1 1 1]';
x2 = [0 1 1]';
x3 = [0 0 1]';
x4 = [1 0 1]';
X = [x1 x2 x3 x4];
y1 = [1 2 0]';
y2 = [-1 0 3]';
y3 = [3 1 1]';
y4 = [5 3 -2]';
Y = [y1 y2 y3 y4];
for n = [1,0.1,0.01,0]
Y_n = Y + n*randn(size(Y));
A = Y_n/X;
fprintf('n = %f, A = \n',n)
disp(A)
end
输出:
n = 1.000000, A =
2.9728 -5.5407 2.8011
2.6563 -1.3166 0.6596
-3.3366 1.1349 1.5342
n = 0.100000, A =
2.0011 -4.0256 2.9402
1.9223 -1.0029 1.0921
-3.1383 1.9874 1.0913
n = 0.010000, A =
1.9903 -3.9912 2.9987
1.9941 -1.0001 1.0108
-3.0015 2.0001 1.0032
n = 0.000000, A =
2.0000 -4.0000 3.0000
2.0000 -1.0000 1.0000
-3.0000 2.0000 1.0000
当然,如果您通过添加更多向量来制作X
更大Y
的数据,您也将获得更好的估计,并且能够补偿更多嘈杂的数据。
推荐阅读
- angular - Angular Workpace - 必须在同一工作区中构建其他项目才能构建项目
- ibm-cloud - 我在 IBM 云中找不到我正在寻找的服务,但我知道它在那里
- r - ggplot2 的 geom_text 拒绝闪避
- clojure - Clojure:无法启动 cider repl
- react-native - getExpoPushTokenAsync 不适用于独立应用程序
- git - 如何显示我的 git 存储库的所有版本
- css - 在 React 中使用关键帧制作动画
- python - 如何通过迭代集合中的元素来删除集合中的特定元素?
- deep-learning - 模型总损失大于模型输出损失的总和
- python - 寻找与正则表达式中的特定单词尽可能接近的电子邮件