How to code this quadratic minimization problem subject to a linear constraint?
1 次查看(过去 30 天)
显示 更早的评论
After having performed Factor Analysis (FA), I am now trying to implement the following rotation strategy (Swanson 2017 - details of rotation strategy in appenix A) to interpret the three factors structurally and economically. The strategy is in 3 steps but I will report just the first one as the other steps will follow suit:
1) Quadratic minimization problem subject to a linear constraint:
s.t.
where
is the 80x3 matrix of unrotated factors, (3x1) is the first column of λ which is the 7x3 matrix of factor loadings and is the third column of U which is a 3x3 orthogonal matrix. and are known (find data attached: fa_pre = (80x3) and lambda_1 = (1x3)). Obviously, I would like to solve it for to fully have .
Can you help me code the first minimization problem?
1 个评论
Bianca Piccirillo
2022-6-30
Hi!! I need to do the exact same computation for a project, did you solve it by any chance?
Thank you very much!
回答(1 个)
David Goodmanson
2022-7-1
Hi Armando/Bianca
Suppose lambda is a 1x3 row vector. The code below is based on the fact that the solution abc (which is the column vector [a b c]' ) must meet two conditions:
lambda*abc = 0
[0 0 1]*abc = 1 % forces c=1
There is a vector n that is perpendicular to both lambda and [0 0 1] and you can have an aribitrary amount x*n of that without affecting the two conditions. So x can be optimized to minimize the quadratic quantity.
F = Fpre;
lam = lambda_1'; % row vector
z = [0 0 1];
n = null([lam;z])';
G = [n; lam; z];
invG = inv(G);
c = [1 0 0]*invG'*F'*F*invG;
x0 = -c(3)/c(1);
abc0 = invG*[x0 0 1]' % the result
S0 = abc0'*F'*F*abc0 % the quantity that is minimized
lam*abc0 % check, should be zero
abc0 =
0.0140
-0.6621
1.0000
S0 = 35.5975
ans = -4.6838e-17
To check for a minimum you can change both a and b such that the two conditions are still satisfied. Note that for da = +-005, S-S0 has the same positive value in both cases, the right result for the bottom of a quatratic well.
da = .005;
db = -lam(1)*da/lam(2); % db s.t. lam*abc is still 0
abc = abc0 + [da db 0]';
S = abc'*F'*F*abc;
S-S0 % should be positive
lam*abc % check, should be 0
ans = 0.0667
ans = -6.0715e-17
da = -.005;
db = -lam(1)*da/lam(2); % db s.t. lam*abc is still 0
abc = abc0 + [da db 0]';
S = abc'*F'*F*abc;
S-S0 % should be positive
lam*abc % check, should be 0
ans = 0.0667
ans = -3.2960e-17
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Quadratic Programming and Cone Programming 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!