我有一个名为101x82
的{{1}}大小矩阵。使用这个变量矩阵,我计算了另外两个变量:
1)A
,B
标量和
2)1x1
,C
矩阵。
我将50x6
和1)
与其模拟变量2)
和3)
进行比较,其值已修复:
3)4)
,D
标量和
4)1x1
,E
矩阵。
现在,我想扰乱/更改50x6
矩阵的值,以便:
A
〜1)
,即3)
几乎等于B
,
D
〜2)
,即4)
几乎等于C
请注意,在扰乱E
时,A
和B
会发生变化,但不会发生C
和D
。
任何想法如何做到这一点?谢谢!
答案 0 :(得分:1)
我无法运行你的代码,因为它要求加载数据(我没有),而且如何计算B或C并不是很明显。
幸运的是,我可以回答你的问题。您正在描述优化问题,解决方案是使用fminsearch(或其他类似的东西)。
您要做的是定义一个返回带有两个元素的向量的函数:
y1 = (B - D)^weight1;
y2 = norm((C - E), weight2);
重量是你允许变化的强度(重量= 2通常就足够了) 你的函数变量是A。
答案 1 :(得分:0)
根据我的理解,你有一些功能。
fb(A)= B
fc(A)= C
你知道上面列出的函数吗?你知道从A到这些函数的映射吗? 如果你想尝试优化,以便B接近D,你需要选择:
基本上,现在我们把问题归结为最小化:
成本= || fb(A) - fd(A)|| ^ 2
您当然可以做的一件事是根据A的各个元素计算此成本函数的梯度,然后使用具有适当“时间步长”的前向欧拉方法执行最小化步骤。这可能不会很快,但是如果时间步长足够小且功能足够好,它至少会让你达到局部最小值。
计算此
的渐变grad_A(cost)= 2 * || fb(A)-fd(A)|| *(grad_A(fb)(A)-grad_A(fd)(A))
其中grad_A表示相对于A的梯度,而grad_A(fb)(A)表示相对于在A处评估的函数fb的A的梯度等。
计算grad_A(fb)(A)取决于fb的形式,但这里有一些页面有“矩阵演算”的身份和解释。
Matrix calculus identities Matrix calculus explanation
然后你只需通过前进欧拉更新在A上执行梯度下降:
A_next = A_prev - timestep * grad_A(cost)