• 一般多项式曲线的最小二乘回归(Linear Regression)


    对于一般多项式:

    K为多项式最高项次,a为不确定的常数项,共k+1个;

    有离散数据集对应,其方差:

    β为,方差函数S对β自变量第j个参数的梯度(偏导数):

    当以上梯度为零时,S函数值最小,即:

    中的每个每个偏导数构成一个等式:

    ...

    则:

    ...

    变为矩阵形式:

    这样就变成线性方程求解形式,可用高斯消元等方法求得,注意在计算过程中要判断对角线上的值是否为零,如果等于零可以通过换行的方法解决;

     1         /// <summary>
     2         /// Function y = a0+a1*x+a2*x^2+ ... + an*x^n
     3         /// </summary>
     4         /// <param name="dataX">x values</param>
     5         /// <param name="Y">y values</param>
     6         /// <param name="N">Degree of a Polynomial</param>
     7         /// <returns>[a0,a1,...,an]</returns>
     8         public static double[] PolyRegress(double[] dataX, double[] Y,int N)
     9         {
    10             const double tiny = 0.00001;
    11             int M = dataX.Length;             // M = Number of data points
    12             int D = N + 1;
    13             double x = 0, y = 0;
    14             double[,] V = new double[D, D];
    15             double[] A = new double[D];
    16             for (int i = 0; i < M; i++)
    17             {
    18                 x = dataX[i];
    19                 y = Y[i];
    20                 for(int j=0;j<D;j++)
    21                 {
    22                     for(int k=0;k<D;k++)
    23                     {
    24                         V[j, k] += Math.Pow(x, j + k);
    25                     }
    26                     A[j] += y * Math.Pow(x, j);
    27                 }
    28 
    29             }
    30             for (int i = 0; i < D; i++)
    31             {
    32                 double m = V[i, i];
    33                 if (Math.Abs(m) < tiny)
    34                 {
    35                     for (int i2 = i + 1; i2 < D; i2++)
    36                     {
    37                         if (Math.Abs(V[i2, i]) > tiny)
    38                         {
    39                             double tmp = 0;
    40                             for (int c = 0; c < D; c++)
    41                             {
    42                                 tmp = V[i, c];
    43                                 V[i, c] = V[i2, c];
    44                                 V[i2, c] = tmp;
    45                             }
    46                             tmp = A[i];
    47                             A[i] = A[i2];
    48                             A[i2] = tmp;
    49                             break;
    50                         }
    51                     }
    52                     m = V[i, i];
    53                 }
    54 
    55                 if (Math.Abs(m) > tiny)
    56                 {
    57                     for (int j = i; j < D; j++)
    58                     {
    59                         V[i, j] /= m;
    60                     }
    61                     A[i] /= m;
    62                     for (int k = 0; k < D; k++)
    63                     {
    64                         if (k != i)
    65                         {
    66                             m = V[k, i];
    67                             for (int l = i; l < D; l++)
    68                             {
    69                                 V[k, l] -= m * V[i, l];
    70                             }
    71                             A[k] -= m * A[i];
    72                         }
    73                     }
    74                 }
    75             }
    76             return A;
    77         }

    维基关于最小二乘的解释

  • 相关阅读:
    关于总线的总结
    我已经理解了并发和并行的区别
    关于CPU的一些基本知识总结
    shell生成指定长度的随机数
    进程、线程、协程、例程、过程的区别是什么?
    Perl输出带颜色行号或普通输出行
    Ruby数组(2):数组方法详细整理
    Linux find常用用法示例
    MariaDB官方手册翻译
    Ruby中to_s和to_str、to_i和to_int、to_a和to_ary、to_h和to_hash的解释说明
  • 原文地址:https://www.cnblogs.com/xrll/p/5939185.html
Copyright © 2020-2023  润新知