#include"stdio.h"#include <math.h>double function(double matrix[3][6],double theta[3],int sample_i){ double ret=0.0; for(int i=0;i<3;++i) { ret+=matrix[sample_i][i]*theta[i]; } return ret;}double theta[3]={1,1,1};int main(void){ double matrix[3][6]={ {1,2,3,1,0,0}, {2,1,1,0,1,0}, {3,1,2,0,0,1}, }; double alfa = 0.1; double c = 0; double d = 1; for(int z=0;z<3;++z) { double loss = 0.0; for(int j = 0;j<3;++j) { double sum=function(matrix,theta,j); loss += pow((pow(sum+c,d)-matrix[j][z+3]),2); }//printf("loss : %lf\n",loss); for(int i=0;i<200;++i) { for(int sample_i = 0; sample_i<3;sample_i++) { double result = function(matrix,theta,sample_i)+c; for(int j=0;j<3;++j) { theta[j] = theta[j] - alfa*(pow(result,d)-matrix[sample_i][z+3])*d*pow((result),d-1)*matrix[sample_i][j]; } } double loss = 0.0; for(int j = 0;j<3;++j) { double sum=function(matrix,theta,j); loss += pow((pow(sum+c,d)-matrix[j][z+3]),2); } //printf("%d,loss now: %lf,%lf,%lf,%lf\n",i,loss,theta[0],theta[1],theta[2]); } printf("%lf,%lf,%lf\n",theta[0],theta[1],theta[2]); } return 0;}
以上代碼從實驗6稍微修改而來
求一個矩陣的逆陣,如下例:
1 2 3 x1 y1 z1 1 0 0
2 1 1 x2 y2 z2 0 1 0
3 1 2 x3 y3 z3 0 0 1
精確結果應為:
-1/2 1/2 1/2
1/2 7/4 5/4
1/2 -3/2 3/4
迭代的結果為
-0.249835,0.250747,0.249447
0.247973,1.740834,-1.243221
0.253544,-1.233976,0.738149