Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit97f7ee2

Browse files
committed
added logistic regression
1 parentacb0c41 commit97f7ee2

File tree

10 files changed

+30888
-11
lines changed

10 files changed

+30888
-11
lines changed

‎ETL/ETL.cpp‎

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,14 +66,26 @@ auto ETL::Std(Eigen::MatrixXd data) -> decltype(((data.array().square().colwise(
6666
return ((data.array().square().colwise().sum())/(data.rows()-1)).sqrt();
6767
}
6868

69-
Eigen::MatrixXdETL::Normalize(Eigen::MatrixXd data){
69+
Eigen::MatrixXdETL::Normalize(Eigen::MatrixXd data,bool normalizeTarget){
7070

71-
auto mean =Mean(data);
72-
Eigen::MatrixXd scaled_data = data.rowwise() - mean;
71+
Eigen::MatrixXd dataNorm;
72+
if(normalizeTarget==true) {
73+
dataNorm = data;
74+
}else {
75+
dataNorm = data.leftCols(data.cols()-1);
76+
}
77+
78+
auto mean =Mean(dataNorm);
79+
Eigen::MatrixXd scaled_data = dataNorm.rowwise() - mean;
7380
auto std =Std(scaled_data);
7481

7582
Eigen::MatrixXd norm = scaled_data.array().rowwise()/std;
7683

84+
if(normalizeTarget==false) {
85+
norm.conservativeResize(norm.rows(), norm.cols()+1);
86+
norm.col(norm.cols()-1) = data.rightCols(1);
87+
}
88+
7789
return norm;
7890
}
7991

‎ETL/ETL.h‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class ETL
1919
std::vector<std::vector<std::string>>readCSV();
2020
Eigen::MatrixXdCSVtoEigen(std::vector<std::vector<std::string>> dataset,int rows,int cols);
2121

22-
Eigen::MatrixXdNormalize(Eigen::MatrixXd data);
22+
Eigen::MatrixXdNormalize(Eigen::MatrixXd data,bool normalizeTarget);
2323
autoMean(Eigen::MatrixXd data) -> decltype(data.colwise().mean());
2424
autoStd(Eigen::MatrixXd data) -> decltype(((data.array().square().colwise().sum())/(data.rows()-1)).sqrt());
2525

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
#include"LogisticRegression.h"
2+
3+
#include<eigen3/Eigen/Dense>
4+
#include<iostream>
5+
#include<map>
6+
#include<list>
7+
8+
Eigen::MatrixXdLogisticRegression::Sigmoid(Eigen::MatrixXd Z) {
9+
return1/(1+(-Z.array()).exp());
10+
}
11+
12+
std::tuple<Eigen::MatrixXd,double,double>LogisticRegression::Propagate(Eigen::MatrixXd W,double b, Eigen::MatrixXd X, Eigen::MatrixXd y,double lambda) {
13+
14+
int m = y.rows();
15+
16+
Eigen::MatrixXd Z = (W.transpose() * X.transpose()).array() + b;
17+
Eigen::MatrixXd A =Sigmoid(Z);
18+
19+
auto cross_entropy = -(y.transpose()*(Eigen::VectorXd)A.array().log().transpose() + ((Eigen::VectorXd)(1-y.array())).transpose() * (Eigen::VectorXd)(1-A.array()).log().transpose())/m;
20+
21+
double l2_reg_cost = W.array().pow(2).sum() * (lambda/(2*m));
22+
23+
double cost =static_cast<constdouble>((cross_entropy.array()[0])) + l2_reg_cost;
24+
25+
Eigen::MatrixXd dw = (Eigen::MatrixXd)(((Eigen::MatrixXd)(clearA-y.transpose()) * X)/m) + ((Eigen::MatrixXd)(lambda/m*W)).transpose();
26+
27+
double db = (A-y.transpose()).array().sum()/m;
28+
29+
returnstd::make_tuple(dw,db,cost);
30+
}
31+
32+
std::tuple<Eigen::MatrixXd,double, Eigen::MatrixXd,double, std::list<double>>LogisticRegression::Optimize(Eigen::MatrixXd W,double b, Eigen::MatrixXd X, Eigen::MatrixXd y,int num_iter,double learning_rate,double lambda,bool log_cost) {
33+
34+
std::list<double> costsList;
35+
36+
Eigen::MatrixXd dw;
37+
double db, cost;
38+
39+
for(int i=0; i<num_iter; i++){
40+
std::tuple<Eigen::MatrixXd,double,double> propagate =Propagate(W, b, X, y, lambda);
41+
std::tie(dw, db, cost) = propagate;
42+
43+
W = W - (learning_rate*dw).transpose();
44+
b = b - (learning_rate*db);
45+
46+
if(i%100==0) {
47+
costsList.push_back(cost);
48+
}
49+
50+
if(log_cost && i%100==0) {
51+
std::cout <<"Cost after iteration" << i <<":" << cost << std::endl;
52+
}
53+
}
54+
55+
returnstd::make_tuple(W,b,dw,db,costsList);
56+
}
57+
58+
Eigen::MatrixXdLogisticRegression::Predict(Eigen::MatrixXd W,double b, Eigen::MatrixXd X) {
59+
60+
int m = X.rows();
61+
62+
Eigen::MatrixXd y_pred =Eigen::VectorXd::Zero(m).transpose();
63+
64+
Eigen::MatrixXd Z = (W.transpose() * X.transpose()).array() + b;
65+
Eigen::MatrixXd A =Sigmoid(Z);
66+
67+
for(int i=0; i<A.cols(); i++) {
68+
if(A(0,i) <=0.5) {
69+
y_pred(0,i) =0;
70+
}else {
71+
y_pred(0,i) =1;
72+
}
73+
}
74+
75+
return y_pred.transpose();
76+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#ifndef LogisticRegression_h
2+
#defineLogisticRegression_h
3+
4+
#include<eigen3/Eigen/Dense>
5+
#include<list>
6+
7+
classLogisticRegression
8+
{
9+
public:
10+
LogisticRegression()
11+
{}
12+
13+
Eigen::MatrixXdSigmoid(Eigen::MatrixXd Z);
14+
15+
std::tuple<Eigen::MatrixXd,double,double>Propagate(Eigen::MatrixXd W,double b, Eigen::MatrixXd X, Eigen::MatrixXd y,double lambda);
16+
std::tuple<Eigen::MatrixXd,double, Eigen::MatrixXd,double, std::list<double>>Optimize(Eigen::MatrixXd W,double b, Eigen::MatrixXd X, Eigen::MatrixXd y,int num_iter,double learning_rate,double lambda,bool log_cost);
17+
Eigen::MatrixXdPredict(Eigen::MatrixXd W,double b, Eigen::MatrixXd X);
18+
};
19+
20+
#endif

‎README.md‎

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,24 @@ In this repository, you can find all the code from my series of tutorials of Mac
44

55
#Usage
66

7-
Fork and clone/download the repository.To compile simply run the code:
7+
Fork and clone/download the repository.
88

9-
`g++ -std=c++11 LinearRegression/LinearRegression.cpp ETL/ETL.cpp main.cpp -o main`
9+
##Linear Regression
10+
11+
To compile simply run the code:
12+
13+
`g++ -std=c++11 LinearRegression/LinearRegression.cpp ETL/ETL.cpp main/LinearRegression.cpp -o linregr`
14+
15+
To run and test:
16+
17+
`./linregr datasets/winedata.csv ","`
18+
19+
##Logistic Regression
20+
21+
To compile simply run the code:
22+
23+
`g++ -std=c++11 LogisticRegression/LogisticRegression.cpp ETL/ETL.cpp main/LogisticRegression.cpp -o logregr`
1024

1125
To run and test:
1226

13-
`./main datasets/winedata.csv ","`
27+
`./logregr datasets/adult_data.csv ","`

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp