Cosan  1.0
Data Analytics Library
CosanRidgeRegression.h
Go to the documentation of this file.
1 //
2 // Created by Xinyu Zhang on 3/27/21.
3 //
4 
5 #ifndef COSAN_COSANRIDGEREGRESSION_H
6 #define COSAN_COSANRIDGEREGRESSION_H
8 
9 namespace Cosan{
10 
11  /**
12  * y = a+bx
13  * minimize \sum_{i=1}^n (y_i-a-b^Tx_i)^2+\|b\|_2^2 -> find the optimal a and b
14  * @tparam NumericType
15  * @details https://en.wikipedia.org/wiki/Ridge_regression
16  */
17  template<Numeric NumericType>
18  class CosanRidgeRegression: public CosanLinearRegression<NumericType>{
19  public:
20 // Initialization
21 // CosanRidgeRegression()=delete;
22 // CosanRidgeRegression(NumericType Lambda):CosanLinearRegression<NumericType>(false){
23 // MLambda=Lambda;
24 // }
27  MLambda=Lambda;
28  }
29 
30 // CosanLinearRegression(CosanMatrix<NumericType>& X,const CosanMatrix<NumericType>& Y,bool Bias): CosanLinearModel<NumericType>(Bias){
31 // fit(X,Y);
32 // }
34  fit(RD.GetInput(),RD.GetTarget());
35  }
37  fit(CD.GetInput(),CD.GetTarget());
38  }
39 
40  template<class T,
41  std::enable_if_t<std::is_same_v<std::decay_t<T>,CosanMatrix<NumericType>>,bool> = true >
43  NumericType Lambda,bool Bias): CosanLinearRegression<NumericType>(Bias){
44  MLambda=Lambda;
45  fit(X,Y);
46  }
47 
48  void SetParams(NumericType Lambda) {MLambda = Lambda; };
50 // bool Load(const string & path);
51 // bool Save(const string & path);
53  const std::string GetName() const override{ return "Linear Ridge Regression";}
54 
55  template<class T,
56  std::enable_if_t<std::is_same_v<std::decay_t<T>,CosanMatrix<NumericType>>,bool > = true >
57  void fit(T && X,const CosanMatrix<NumericType>& Y) {
59  if (this->MBias==true){
60  X.conservativeResize(X.rows(), X.cols()+1);
61  X.col(X.cols()-1) = CosanMatrix<NumericType>::Ones(X.rows(),1);
62  Identity.conservativeResize(Identity.rows()+1, Identity.cols()+1);
63  Identity.col(Identity.cols()-1) = CosanMatrix<NumericType>::Zero(Identity.rows(),1);
64  Identity.row(Identity.rows()-1) = CosanMatrix<NumericType>::Zero(1,Identity.cols());
65  }
66 // const auto& svd = X.jacobiSvd(Eigen::ComputeFullU | Eigen::ComputeFullV);
67 // const auto& s = svd.singularValues();
68 // const auto r = s.rows();
69 // const auto& D = s.cwiseQuotient((s.array().square() + MLambda).matrix()).asDiagonal();
70 // MBeta = svd.matrixV().leftCols(r) * D * svd.matrixU().transpose().topRows(r) * Y;
71  this->MBeta = (X.transpose()*X+Identity).ldlt().solve(X.transpose()*Y);
72 // MBeta = (X.transpose()*X+CosanMatrix(MLambda*Eigen::MatrixXd::Identity(X.cols(),X.cols()))).bdcSvd(Eigen::ComputeThinU | Eigen::ComputeThinV).solve(X.transpose()*Y);
73 // MBeta = (X.transpose()*X+CosanMatrix(MLambda*Eigen::MatrixXd::Identity(X.cols(),X.cols()))).colPivHouseholderQr().solve(X.transpose()*Y);
74  if (this->MBias==true){
75  removeColumn(X,X.cols()-1);
76  }
77  }
78 
79  private:
81  };
82 }
83 
84 #endif //COSAN_COSANRIDGEREGRESSION_H
Cosan
Definition: CosanBO.h:29
Cosan::CosanRawData::GetInput
CosanMatrix< NumericType > GetInput()
Get a copy of CosanMatrix<NumericType> X.
Definition: CosanData.h:141
Cosan::CosanLinearModel::MBias
bool MBias
Definition: CosanLinearModel.h:57
Cosan::CosanRawData::GetTarget
CosanMatrix< NumericType > GetTarget()
Get a copy of CosanMatrix<NumericType> Y.
Definition: CosanData.h:147
Cosan::CosanRidgeRegression::GetName
const std::string GetName() const override
Get the name of the objects.
Definition: CosanRidgeRegression.h:53
Cosan::CosanRidgeRegression
Definition: CosanRidgeRegression.h:18
NumericType
double NumericType
Definition: onehotencodingTest.cpp:20
Cosan::MdRidgeRegression
@ MdRidgeRegression
Definition: CosanModel.h:24
Cosan::EModelType
EModelType
Definition: CosanModel.h:21
Cosan::CosanRidgeRegression::CosanRidgeRegression
CosanRidgeRegression(NumericType Lambda, bool bias=false)
Definition: CosanRidgeRegression.h:26
Cosan::CosanRidgeRegression::CosanRidgeRegression
CosanRidgeRegression(bool bias=false)
Definition: CosanRidgeRegression.h:25
Cosan::CosanRidgeRegression::MLambda
NumericType MLambda
Definition: CosanRidgeRegression.h:80
Cosan::CosanRidgeRegression::SetParams
void SetParams(NumericType Lambda)
Definition: CosanRidgeRegression.h:48
Cosan::CosanMatrix
Eigen::Matrix< NumericType, Eigen::Dynamic, Eigen::Dynamic > CosanMatrix
Definition: CosanBO.h:37
Cosan::CosanLinearModel::MBeta
CosanMatrix< NumericType > MBeta
Definition: CosanLinearModel.h:56
Cosan::CosanData
Data container.
Definition: CosanData.h:546
Cosan::CosanLinearModel
CosanLinear Model. All linear model inherit this object.
Definition: CosanLinearModel.h:32
Cosan::CosanRidgeRegression::CosanRidgeRegression
CosanRidgeRegression(T &&X, const CosanMatrix< NumericType > &Y, NumericType Lambda, bool Bias)
Definition: CosanRidgeRegression.h:42
CosanLinearRegression.h
Cosan::CosanRidgeRegression::CosanRidgeRegression
CosanRidgeRegression(CosanRawData< NumericType > &RD, bool bias=false)
Definition: CosanRidgeRegression.h:33
Cosan::CosanRawData
Raw Data container.
Definition: CosanData.h:36
Cosan::CosanRidgeRegression::CosanRidgeRegression
CosanRidgeRegression(CosanData< NumericType > &CD, bool bias=false)
Definition: CosanRidgeRegression.h:36
removeColumn
void removeColumn(Matrix &matrix, gsl::index colToRemove)
Definition: utils.h:22
Cosan::CosanRidgeRegression::GetParams
NumericType GetParams()
Definition: CosanRidgeRegression.h:49
Cosan::CosanRidgeRegression::fit
void fit(T &&X, const CosanMatrix< NumericType > &Y)
Definition: CosanRidgeRegression.h:57
Cosan::CosanLinearRegression
Definition: CosanLinearRegression.h:20
Cosan::CosanRidgeRegression::GetModelType
EModelType GetModelType() override
Definition: CosanRidgeRegression.h:52