0

これは私のMatlab CVXです

linkpair=[link_1 -link_2];
unlinkpair=[unlink_1 -unlink_2];
m=size(linkpair,2);
n=size(linkpair,1);

%%%%%%%%%%%%%%%%%%%%%%%%%%%parametres%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C=100;
B=10;
d=10; 
W=[];
delta=[];
 for i=1:size(linkpair,1)    
  delta(i)=norm((unlinkpair(i,(m/2+1):end))-(linkpair(i,(m/2+1):end)));
 end
%%%%%%%%%%%%%%%%%%%%%%%%%%%CVX%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Wt=rand(m,d);
cvx_begin
variables W(m,d) xi(n)
minimize( 0.5*norm( W , 'fro' )+  C*sum(xi));
subject to
2*sum((unlinkpair*W).*(unlinkpair*Wt),2) -  sum((linkpair*W).*(linkpair*W),2) >= (B*delta)'-xi+ sum((unlinkpair*Wt).*(unlinkpair*Wt),2);
xi>=0;
cvx_end
%%%%%%%%%%%%%%%%%%%%prediction%%%%%%%%%%%%%   
[prediction_LUS,prediction_Original,count_LUS,count_noLUS]=pred(W, test1, test2)

そして、Python 環境の cvxpy でこれを試します。

def ulink_cccp():
    link_1,link_2,unlink_1,unlink_2,test1,test2=data_generate()
    linkpair=np.column_stack((link_1,link_2*-1))
    unlinkpair=np.column_stack((unlink_1,unlink_2*-1))
    m=linkpair.shape[1]   ##col
    n=linkpair.shape[0]   ##row

    #####parameters###############
    C=100
    B=10
    d=10

    delta=[]
    for i in range(n):
        delta.append(np.linalg.norm(unlinkpair[i,m/2:]-linkpair[i,m/2:]))
    Wt=np.random.rand(m,d)
    print Wt.size
    #####CVX_Problems##################
    xi=Variable(n)
    W=Variable(m,d)
    print W.size
    objective=Minimize(0.5*norm(W,'fro')+C*sum(xi))
    constraints=[2*sum_entries(np.multiply(np.dot(unlinkpair*W),np.dot(unlinkpair,Wt)),axis=1)-\
                 sum_entries(np.multiply(np.dot(linkpair,W),np.dot(linkpair,W)),axis=1)>=\
                 (np.dot(B,delta)).T-xi+\
                  sum_entries(np.multiply(np.dot(unlinkpair,Wt),np.dot(unlinkpair,Wt)),axis=1),\
                 xi>=0]
    prob=Problem(objective,constraints)
    result=prob.solve(verbose=True)

しかし、制約変数に何か問題があります。numpy 関数が機能しない可能性があります。cvxpy 構文だけが機能するようです。ただし、cvxpy 構文で行列乗算が見つかりません。これどうやってするの?

4

0 に答える 0