فهرست منبع

Fixed a bug in multinomial linear regression.

Frank Prüfer 11 سال پیش
والد
کامیت
a2d6fd2830
1فایلهای تغییر یافته به همراه31 افزوده شده و 25 حذف شده
  1. 31 25
      regression/linregression/LinRegression.cpp

+ 31 - 25
regression/linregression/LinRegression.cpp

@@ -65,46 +65,50 @@ void LinRegression::teach ( const NICE::VVector & x, const NICE::Vector & y ){
     
     alpha[1] /= tmpAlpha;
     
-    alpha[0] = meanY - alpha[1] * meanX;    
+    alpha[0] = meanY - alpha[1] * meanX;
+    
+//     cerr<<"Alpha-Vektor: ";
+//     for(uint i=0;i<alpha.size();i++){
+//       cerr<<alpha[i]<<" ";
+//     }
+//     cerr<<endl;
   }
   else {  //N-dimensional least squares
-    NICE::Matrix X, Xtmp, tmpAlpha, tmpAlphaInv, G;
+    NICE::Matrix X, tmpAlpha, G;
     NICE::Vector params;
-    uint X_rows,X_cols;
     
     x.toMatrix(X);
-    X_rows = X.rows();
-    X_cols = X.cols();
-    cout<<X_rows<<" "<<X_cols<<endl;
     
-    // attach front column with ones (UGLY)
-    NICE::Vector oneVector(x.size(),1.0);
-    Xtmp = X.transpose();
-    cout<<Xtmp.rows()<<" "<<Xtmp.cols()<<endl;
-    Xtmp.resize(X_cols+1,X_rows);
-    cout<<Xtmp.rows()<<" "<<Xtmp.cols()<<endl;
-    cout<<"Size of vector; "<<oneVector.size()<<endl;
-    Xtmp.setRow(Xtmp.rows()-1,oneVector);
-    Xtmp.exchangeRows(0,Xtmp.rows()-1);
-    cout<<Xtmp.rows()<<" "<<Xtmp.cols()<<endl;
-    X = Xtmp.transpose();
+    NICE::Matrix Xtmp(X.rows(),X.cols()+1,1.0);
     
-    cout<<X.rows()<<" "<<X.cols()<<endl;
+    // attach front column with ones
+
+    for(uint row = 0;row<X.rows();row++){
+      for(uint col = 0;col<X.cols();col++){
+	Xtmp(row,col+1) = X(row,col);
+      }
+    }
 
     // alpha =(X'X)^-1 * X'y
-    tmpAlpha.multiply(X,X,true);
+    NICE::Matrix tmpAlphaInv;
+    NICE::Vector rhs;
+      
+    rhs.multiply(Xtmp,y,true);
+      
+    tmpAlpha.multiply(Xtmp,Xtmp,true);
+      
     choleskyDecomp(tmpAlpha,G);
     choleskyInvert(G,tmpAlphaInv);
-    params.multiply(X,y,true);
-    params.multiply(tmpAlphaInv,params);
+      
+    params.multiply(tmpAlphaInv,rhs);
 
     alpha = params.std_vector();
     
-    cout<<"Alpha-Vektor: ";
+    cerr<<"Alpha-Vektor: ";
     for(uint i=0;i<alpha.size();i++){
-      cout<<alpha[i]<<" ";
+      cerr<<alpha[i]<<" ";
     }
-    cout<<endl;
+    cerr<<endl;
   }
 }
 
@@ -116,7 +120,9 @@ double LinRegression::predict ( const NICE::Vector & x ){
   else {
     // y = x * alpha
     NICE::Vector nAlpha(alpha);
-    y = x.scalarProduct(nAlpha);
+    NICE:: Vector xTmp(1,1.0);
+    xTmp.append(x);
+    y = xTmp.scalarProduct(nAlpha);
   }
   
   return y;