2013-12-14 38 views
1

我目前正在使用JAMA lib編寫邏輯迴歸的成本函數。但它不起作用。我不知道爲什麼。它應該返回一個值:0.6743使用JAMA lib進行Logistic迴歸的成本函數

public matrix cost() { 
    double[][] sigmoid = sigmoidFunction().getArray(); 
    double[][] sigmoid2 = sigmoidFunction().getArray(); 
    int m = sigmoidFunction().getRowdimension(); 
    int n = sigmoidFunction().getColdimension(); 

    for (int i = 0; i<m; i++) { 
     for (int j =0; j< n; j++) { 
      sigmoid[i][j] = Math.log(sigmoid[i][j]); 
     } 
    } 
    for (int i = 0; i<m; i++) { 
     for (int j =0; j< n; j++) { 
      sigmoid2[i][j] = Math.log(1-sigmoid2[i][j]); 
     } 
    } 

    matrix regularized = theta.transpose().times(theta); 
    double[][] reg = regularized.getArray(); 
    for(int i = 0; i< regularized.getRowdimension(); i++) { 
     for (int j = 0; j< regularized.getColdimension(); j++) { 
      reg[i][j] = lambda/(2*m) * (reg[i][j]); 
     } 
    } 
    regularized = new matrix(reg); 

    matrix log_hx = new matrix(sigmoid); 
    matrix log1_hx = new matrix(sigmoid2); 

    matrix y_1 = Y; 
    y_1 = y_1.transpose().subtract(1); 
    Y = Y.uminus(); 
    Y= Y.transpose(); 
    //J = 1/m * (-y' * log(hx) - (1-y)' * log(1-hx)) 
    matrix J = Y.times(log_hx).subtract(y_1.times(log1_hx)); 

    double [][] cost = J.getArray(); 
    for(int i = 0; i< J.getRowdimension(); i++) { 
     for (int j =0; j< J.getColdimension(); j++) { 
      cost[i][j]= 1/m * cost[i][j]; 
     } 
    } 
    //J = new matrix(cost); 
    //J.addEquals(regularized); 
    return J; 
} 
} 

當我返回如上所示的矩陣J時,它返回0.0。但是當我直接返回Y.times(log_hx).subtract(y_1.times(log1_hx))時,它神奇地返回值3.3715。當它不是由1/M相乘,並通過正則化

+0

對於字體,糟糕的英語和糟糕的編碼感到抱歉。 – user3065339

回答

1

加入這是正確的I弄明白:我刪除FF代碼:

double [][] cost = J.getArray(); 
for(int i = 0; i< J.getRowdimension(); i++) { 
    for (int j =0; j< J.getColdimension(); j++) { 
     cost[i][j]= 1/m * cost[i][j]; 
    } 

和與此

double[][] cost = J.getArray(); 
double cost_temp = cost[0][0]*1/m; 
J.set_element(0,0,cost_temp); 
J.addEquals(regularized); 
return J; 

取代它現在,我不知道它爲什麼起作用。