Here only the code implementation, the specific principles and procedures please see the previous blog post
Note: This Test notebooks machine test passed, but I do not know why the OJ always appear in the run-time error prompts, there are big God see the problem please advise ~ ~
The test file input format is as follows:
2 10 0.01 102104 3 3999001600 3 3299002400 3 3690001416 2 2320003000 4 5399001985 4 2999001534 3 3149001427 3 1989991380 3 2120001494 3 242500
The meaning is as follows:
The normalization of eigenvalues is not the same as the previous blog post, and another method of normalization is used:
The specific implementation code is as follows:
#include <iostream> #include <stdio.h> #include <math.h>using namespace std;double predict (double* W, double* data,int feature_num) {double sum=0; for (int i=0;i<feature_num;i++) {sum+=w[i]*data[i]; } return sum;} Double Theta (Double **training_set,int featue_num,int training_num,double* W) {double sum=0; for (int i=0;i<training_num;i++) {sum+= (Training_set[i][featue_num]-predict (W,training_set[i],featue_num)) * ( Training_set[i][featue_num]-predict (W,training_set[i],featue_num)); } return sum/(2*training_num);} void Gradient_descent (double** training_set,int feature_num,int training_num,double* w,double a,int iterator_time) {WH Ile (iterator_time--) {double* del_theta=new double[feature_num]; for (int i=0;i<feature_num;i++) {del_theta[i]=0; for (int j=0;j<training_num;j++) {del_theta[i]+= (Predict (W,training_set[j],feature_num)-training_set[j][f Eature_num]) *training_set[j][i]; }}//w[i] Update must wait for all the Del_theta to be calculated! Otherwise the update will affect the not updated//the above problem in the code to indicate that is the following for loop cannot and the above merge! for (int i=0;i<feature_num;i++) w[i]-=a*del_theta[i]/(double) training_num; printf ("%.3lf\n", Theta (training_set,feature_num,training_num,w)); Delete[] Del_theta; } for (int i=0;i<feature_num-1;i++) {printf ("%.3lf", W[i]); } printf ("%.3lf\n", w[feature_num-1]); return;} void Feature_normalize (double **feature_set,int feature_num,int training_num) {//feature normalization, here the feature normalization method is slightly different from the gradient descent the characteristic normalization method of the article Question: Does the value of feature normalization y need to be normalized? No need! Double *average=new Double[feature_num]; Double *stanrd_divition=new Double[feature_num]; for (int i=1;i<feature_num;i++) {double sum=0; for (int j=0;j<training_num;j++) {sum+=feature_set[j][i]; } Average[i]=sum/training_num; } for (int i=1;i<feature_num;i++) {double sum=0; for (int j=0;j<training_num;j++) {sum+= (feature_set[j][i]-Average[i]) * (Feature_set[j][i]-average[i]); } stanrd_divition[i]=sqrt ((sum/(training_num-1))); } for (int i=1;i<feature_num;i++) for (int j=0;j<training_num;j++) {feature_set[j][i]= (feature_se T[j][i]-average[i])/(double) stanrd_divition[i]; } delete[] Stanrd_divition; Delete[] average;} int main () {int feature_num,training_num,times; Double A; Please modify the path freopen ("In.txt", "R", stdin) when you test yourself. while (cin>>feature_num>>training_num>>a>>times) {double **featurn_set=new double*[ Training_num]; for (int i=0;i<=training_num;i++) {featurn_set[i]=new double[feature_num+2]; } for (int i=0;i<training_num;i++) featurn_set[i][0]=1; for (int i=0;i<training_num;i++) {for (int j=1;j<=feature_num+1;j++) {Cin>>featurn_set I [j]; }}//When the feature is standardized w0 is exactly the same, directly assigned to one, do not standardize, or error feature_normalize (Featurn_set,featuRe_num+1,training_num); for (int i=0;i<training_num;i++) featurn_set[i][0]=1; double* W=new Double[feature_num]; for (int i=0;i<=feature_num;i++) w[i]=0; Gradient_descent (Featurn_set,feature_num+1,training_num,w,a,times); for (int i=0;i<feature_num+2;i++) delete[] featurn_set[i]; Delete[] Featurn_set; Delete[] W; } return 0;}
C + + code implements gradient descent algorithm and gives test cases