前言
这几天师哥给我布置多项式拟合的作业,可我只是一个大一菜鸡,只会一点点c++(T_T)
在b站看了几天吴老大(吴恩达)的机器学习视频,好不容易打出了梯度下降结果
连我的电脑都觉得南
面对精度问题手足无措的我选择投向正规方程法的怀抱
正文开始 如果看不懂那就去看吴恩达机器学习的视频吧
一、一个方程
其中θ为参数矩阵,X为训练样本自变量的矩阵,Y为训练样本的答案矩阵
有了这个方程,我们可以直接求解出多项式拟合的参数
为了实现这个方程,我们得写出以下几个函数
- 矩阵乘法
- 矩阵转置
- 矩阵求逆
我自定义了一个结构体
struct ma
{
double matrix[nn][mm];
int line,row;
};
line与row代表矩阵的行和列
二、算法实现
1、矩阵乘法
一个大小为N * U 的矩阵A与一个U * M的矩阵B相乘,会得到一个N*M的矩阵C
C内元素与A、B内元素的关系为:
看不懂的小同学补补线性代数就可以了
因此,可以得到
for(int i=0;i<ll;i++)
for(int j=0;j<rr;j++)
for(int k=0;k<uu;k++)
C.matrix[i][j]+=A.matrix[i][k]*B.matrix[k][j];
为了方便,使用重载运算符
ma operator * (ma A,ma B)//矩阵乘法
{
int ll=A.line,rr=B.row,uu=A.row;
ma C;memset(C.matrix