我有一个类型为c = Ax + By
的方程,其中c
、x
和y
是维度为50,000 X 1的向量,A
和B
是维度为50,000 X 50,000的矩阵。
Matlab 中有什么方法可以找到矩阵A
和B
当已知c
、x
和y
时?
我有大约 100,000 个c
、x
和y
样本。 A
和B
对所有人都是一样的。
设X
是你得到的所有 100,000 个x
的集合(这样X
的第 i
列等于第 x_i
个向量)。
以同样的方式,我们可以将Y
和C
分别定义为 y
s 和 c
s 的 2D 集合。
您希望解决的是A
和B
,以便
C = AX + BY
你有 2 * 50,000^2 个未知数(A
和 B
的所有条目)和numel(C)
方程。
因此,如果您拥有的数据向量数量为 100,000,则您只有一个解决方案(最多线性相关样本)。如果您有超过 100,000 个样本,您可以寻求最小二乘解决方案。
重写:
C = [A B] * [X ; Y] ==> [X' Y'] * [A';B'] = C'
所以,我想
[A' ; B'] = pinv( [X' Y'] ) * C'
在 matlab 中:
ABt = pinv( [X' Y'] ) * C';
A = ABt(1:50000,:)';
B = ABt(50001:end,:)';
如果我错了,请纠正我...
编辑:
这里似乎对维度大惊小怪。所以,我会尽量把它说清楚。
型号:有两个(未知)矩阵A
和B
,每个矩阵的大小为 50,000x50,000(总共 5e9 未知)。
观测值是向量的三元组:(x
、y
、c
)每个这样的向量有50,000个元素(每个样本总共有150,000个观测点)。 基础模型假设是观察值是由此模型中的c = Ax + By
生成的。
任务:给定n
观测值(即向量{(x_i
,y_i
,c_i
)}_i=1..n
n
的三元组),任务是发现A
和B
。
现在,每个样本(x_i
、y_i
、c_i
)在未知A
和B
中诱导出50,000个形式为c_i = Ax_i + By_i
的方程。如果样本n
数大于 100,000,则存在超过 50,000 * 100,000 (> 5e9) 方程,并且系统过度约束。
为了以矩阵形式编写系统,我建议将所有观察结果堆叠到矩阵中:
- 大小为 50,000 x
n
的矩阵X
及其第i
列等于观察到的x_i
- 大小为 50,000 x
n
的矩阵Y
及其第i
列等于观察到的y_i
- 大小为 50,000 x
n
的矩阵C
及其第i
列等于观察到的c_i
使用这些矩阵,我们可以将模型编写为:
C = A*X + B*Y
我希望这能澄清一些问题。
感谢您@Dan和@woodchips的关注和启发性评论。
编辑 (2):
将以下代码提交到八度。在这个例子中,我只使用 2 个维度,而不是 50,000 个维度,而不是n=100,000
观察结果,我选择了n=100
:
n = 100;
A = rand(2,2);
B = rand(2,2);
X = rand(2,n);
Y = rand(2,n);
C = A*X + B*Y + .001*randn(size(X)); % adding noise to observations
ABt = pinv( [ X' Y'] ) * C';
检查真实模型(A
和B
)和恢复ABt
之间的差异:
ABt - [A' ; B']
收益 率
ans =
5.8457e-05 3.0483e-04
1.1023e-04 6.1842e-05
-1.2277e-04 -3.2866e-04
-3.1930e-05 -5.2149e-05
这足够接近于零。(请记住,观察结果是嘈杂的,解决方案是最小二乘的)。