Skip to content
Snippets Groups Projects
Commit 89796ed4 authored by sgegito's avatar sgegito
Browse files

adding this commit just for safety before deleting old func

parent abd4839b
No related branches found
No related tags found
No related merge requests found
#include "opti.h"
int LINE_POINTS = 1000000;
int CLOUD_POINTS = 10000;
int CLOUD_POINTS = 3;
double X_VALUE = 0.000001;
double RANDOMNESS = 0.01;
// Learning rate
double LR = 0.0001;
double ER = 0.00001;
double ER = 0.0000000001;
// y(x)=ax+b
......@@ -79,11 +79,11 @@ Point* cloud2(double *a, double *b){
return my_cloud;
}
double random_point_in_cloud2(Point* my_cloud){
double random_point_in_cloud2_5(Point* my_cloud){
double v = double_random(0,1);
for(int i=0;i<CLOUD_POINTS;i++){
if(v==my_cloud[i].x){
v =random_point_in_cloud2(my_cloud);
v =random_point_in_cloud2_5(my_cloud);
}
}
return v;
......@@ -93,7 +93,7 @@ Point* cloud2_5(double *a, double *b){
Point * my_cloud = (Point*)malloc(sizeof(Point)*CLOUD_POINTS);
for(int i=0;i<CLOUD_POINTS;i++){
Point chosen_point;
chosen_point.x=random_point_in_cloud2(my_cloud);
chosen_point.x=random_point_in_cloud2_5(my_cloud);
double rj = double_random(-RANDOMNESS, RANDOMNESS);
chosen_point.y = (*a*chosen_point.x)+*b+rj;
my_cloud[i].x=chosen_point.x;
......@@ -115,6 +115,17 @@ Point* cloud3(double *a, double *b){
return my_cloud;
}
Point* cloud_test(){
Point * my_cloud = (Point*)malloc(sizeof(Point)*3);
my_cloud[0].x = 0.51;
my_cloud[0].y = 0.24;
my_cloud[1].x = 0.98;
my_cloud[1].y = 0.867;
my_cloud[2].x = 0.1;
my_cloud[2].y = 0.0042;
return my_cloud;
}
// Méthode des moindres carrés
double* averages(Point* my_cloud, int cloud_size){
//double* avg = (double*)malloc(sizeof(double)*4);
......@@ -177,10 +188,44 @@ double gradient(double *a, double *b, Point* my_cloud, int cloud_size, bool is_a
return my_gradient;
}
// La nouvelle fonction gradient_descent 2 en 1, uniquement chez Lidl
// Formule fausse et pas fait la norme donc bug. A refaire demain.
void gradient_descent_v2(double* a, double* b, Point* my_cloud, double current_cost){
double gr_A,gr_B,my_new_a,my_new_b;
/*void gradient_one(double* a, double* b, Point* my_cloud, double* current_cost){
double gr_A,gr_B;
double* my_new_a,my_new_b;
gr_A = gradient(a, b, my_cloud, CLOUD_POINTS, true);
gr_B = gradient(a, b, my_cloud, CLOUD_POINTS, false);
// Les 2 lignes ci-dessous pourraient être condensées, mais c'est pour rendre le code
// plus explicite que je sépare volontairement les étapes.
my_new_a = (*a) - (LR * gr_A);
//printf("\nNew A : %f\n", my_new_a);
my_new_b = (*b) - (LR * gr_B);
//printf("New B : %f\n", my_new_b);
*current_cost = cost2(a,b,my_new_a,my_new_b);
//printf("\nCost : %f\n", current_cost);
*a = my_new_a; *b = my_new_b;
}
void gradient_descent_v3(double* a, double* b, Point* my_cloud){
//double current_cost = 10.0;
printf("\navant\n");
gradient_one(a, b,my_cloud, &current_cost);
printf("\naprès\n");
int nb_it = 1;
//double* a_n_b = (double*)malloc(sizeof(double)*2);
while(current_cost>=ER){
gradient_one(a, b,my_cloud, &current_cost);
nb_it++;
}
printf("\nCost : %f || Nombre d'itérations : %d\n ", current_cost, nb_it);
//a_n_b[0]=a; a_n_b[1]=b;
//return a_n_b;
}*/
void gradient_descent_v4(double *a, double *b, Point* my_cloud){
double gr_A,gr_B,my_new_a,my_new_b,current_cost;
double *zero;
double z = 0.0;
zero = &z;
current_cost = cost2(zero,zero,a,b);
int nb_it = 0;
//double* a_n_b = (double*)malloc(sizeof(double)*2);
while(current_cost>=ER){
......@@ -192,7 +237,7 @@ void gradient_descent_v2(double* a, double* b, Point* my_cloud, double current_c
//printf("\nNew A : %f\n", my_new_a);
my_new_b = (*b) - (LR * gr_B);
//printf("New B : %f\n", my_new_b);
current_cost = cost2(a,b,my_new_a,my_new_b);
current_cost = cost2(a,b,&my_new_a,&my_new_b);
//printf("\nCost : %f\n", current_cost);
*a = my_new_a; *b = my_new_b;
//current_cost = cost(a, b, my_cloud, CLOUD_POINTS);
......@@ -203,17 +248,33 @@ void gradient_descent_v2(double* a, double* b, Point* my_cloud, double current_c
//return a_n_b;
}
double cost(double *a, double *b, Point* my_cloud, int cloud_size){
double my_error;
for(int i=0;i<cloud_size;i++){
//E(a,b)= somme des (aXi+b+Yi)^2
my_error+=popow((((*a)*my_cloud[i].x)+(*b)+my_cloud[i].y),2);
// La nouvelle fonction gradient_descent 2 en 1, uniquement chez Lidl
// Formule fausse et pas fait la norme donc bug. A refaire demain.
void gradient_descent_v2(double *a, double *b, Point* my_cloud, double current_cost){
double gr_A,gr_B,my_new_a,my_new_b;
int nb_it = 0;
//double* a_n_b = (double*)malloc(sizeof(double)*2);
while(current_cost>=ER){
gr_A = gradient(a, b, my_cloud, CLOUD_POINTS, true);
gr_B = gradient(a, b, my_cloud, CLOUD_POINTS, false);
// Les 2 lignes ci-dessous pourraient être condensées, mais c'est pour rendre le code
// plus explicite que je sépare volontairement les étapes.
my_new_a = (*a) - (LR * gr_A);
//printf("\nNew A : %f\n", my_new_a);
my_new_b = (*b) - (LR * gr_B);
//printf("New B : %f\n", my_new_b);
current_cost = cost2(a,b,&my_new_a,&my_new_b);
//printf("\nCost : %f\n", current_cost);
*a = my_new_a; *b = my_new_b;
//current_cost = cost(a, b, my_cloud, CLOUD_POINTS);
nb_it++;
}
return my_error;
printf("\nCost : %f || Nombre d'itérations : %d\n ", current_cost, nb_it);
//a_n_b[0]=a; a_n_b[1]=b;
//return a_n_b;
}
double cost2(double *a, double *b, double new_a, double new_b){
return sqrt(popow((new_a - *a),2)+popow((new_b - *b), 2));
double cost2(double *a, double *b, double *new_a, double *new_b){
return sqrt(popow((*new_a - *a),2)+popow((*new_b - *b), 2));
}
int main (void){
......@@ -232,14 +293,17 @@ int main (void){
destroy_vector(&X);
*/
//Point* first_line = line(7.0, 5.5);
double a_init = 0.556;
double b_init = 0.88732;
Point* fluffy = cloud2_5(&a_init, &b_init);
double a_init = 0.98902527076;
double b_init = -0.1537833935;
//Point* fluffy = cloud2_5(&a_init, &b_init);
Point* fluffy = cloud_test();
printf("\na initial = %f || b initial = %f\n", a_init, b_init);
double a = double_random(-100,100);
double b = double_random(-100,100);
double initial_cost = cost(&a, &b, fluffy, CLOUD_POINTS);
gradient_descent_v2(&a, &b, fluffy, initial_cost);
//double initial_cost = cost2(&a, &b,0,0);
//gradient_descent_v2(&a, &b, fluffy, initial_cost);
double initial_costs = 0;
gradient_descent_v4(&a, &b, fluffy);
printf("\na trouvé = %f || b trouvé = %f\n", a, b);
printf("\ndone\n");
free(fluffy);
......
......@@ -24,12 +24,16 @@ Point* cloud1(Point* a_line);
Point* cloud2(double *a, double *b);
double random_point_in_cloud2(Point* my_cloud);
Point* cloud3(double *a, double *b);
Point* cloud_test();
double* averages(Point* my_cloud, int cloud_size);
double* a_and_b(double* my_averages);
double* sums(Point* my_cloud, int cloud_size);
double gradient(double *a, double *b, Point* my_cloud, int cloud_size, bool is_a);
void gradient_descent_v2(double *a, double *b, Point* my_cloud, double cost);
double cost(double *a, double *b, Point* my_cloud, int cloud_size);
double cost2(double *a, double *b, double new_a, double new_b);
double cost(double *a, double *b, Point* my_cloud);
void gradient_descent_v4(double *a, double *b, Point* my_cloud);
/*void gradient_one(double* a, double* b, Point* my_cloud, double* current_cost);
void gradient_descent_v3(double* a, double* b, Point* my_cloud);*/
double cost2(double *a, double *b, double *new_a, double *new_b);
#endif
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment