zoukankan      html  css  js  c++  java
  • 多元线性回归

    package com.smart.test;
    
    public class Algorithm
    {
        /**
         * 一元线性回归分析
         * 
         * @param x[n] 存放自变量x的n个取值
         * @param y[n] 存放与自变量x的n个取值相对应的随机变量y的观察值
         * @param n    观察点数
         * @param a[2]   a(0) 返回回归系数b ,a(1)返回回归系数a
         */
        public static void lineareEquation(double[] x, double[] y, int n, double[] a)
        {
            int i;
            double xx, yy, e, f, q, s;
            xx = 0.0;
            yy = 0.0;
            for (i = 0; i <= n - 1; i++)
            {
                xx = xx + x[i] / n;
                yy = yy + y[i] / n;
            }
            e = 0.0;
            f = 0.0;
            for (i = 0; i <= n - 1; i++)
            {
                q = x[i] - xx;
                e = e + q * q;
                f = f + q * (y[i] - yy);
            }
            a[1] = f / e;
            a[0] = yy - a[1] * xx;
            q = 0.0;
            for (i = 0; i <= n - 1; i++)
            {
                s = a[1] * x[i] + a[0];
                q = q + (y[i] - s) * (y[i] - s);
                e = Math.abs(y[i] - s);
            }
        }
        /**
         * 多元一次方程求解
         * 
         * @param a 系数数组
         * @param b 结果数组
         * @return 解答
         */
        public static double[] multiLinearEquationGroup(double[][] a, double[] b)
        {
            if (a == null || b == null || a.length == 0 || a.length != b.length) return null;
            for (double[] x : a)
            {
                if (x == null || x.length != a.length) return null;
            }
    
            int len = a.length - 1;
            double[] result = new double[a.length];
    
            if (len == 0)
            {
                result[0] = b[0] / a[0][0];
                return result;
            }
    
            double[][] aa = new double[len][len];
            double[] bb = new double[len];
            int posx = -1, posy = -1;
            for (int i = 0; i <= len; i++)
            {
                for (int j = 0; j <= len; j++)
                    if (a[i][j] != 0.0d)
                    {
                        posy = j;
                        break;
                    }
                if (posy != -1)
                {
                    posx = i;
                    break;
                }
            }
            if (posx == -1) return null;
    
            int count = 0;
            for (int i = 0; i <= len; i++)
            {
                if (i == posx) continue;
                bb[count] = b[i] * a[posx][posy] - b[posx] * a[i][posy];
                int count2 = 0;
                for (int j = 0; j <= len; j++)
                {
                    if (j == posy) continue;
                    aa[count][count2] = a[i][j] * a[posx][posy] - a[posx][j] * a[i][posy];
                    count2++;
                }
                count++;
            }
    
            double[] result2 = multiLinearEquationGroup(aa, bb);
    
            double sum = b[posx];
            count = 0;
            for (int i = 0; i <= len; i++)
            {
                if (i == posy) continue;
                sum -= a[posx][i] * result2[count];
                result[i] = result2[count];
                count++;
            }
            result[posy] = sum / a[posx][posy];
    
            return result;
        }
    
        /**
         * @param args
         */
        public static void main(String[] args)
        {
            
            /**
             * 一元回归
             */
            double[] a = new double[2];
            double[] x = { 0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0};
            double[] y = { 2.75,2.84,2.965,3.01,3.20,3.25,3.38,3.43,3.55,3.66,3.74};
            Algorithm.lineareEquation(x,y,11,a);
            System.out.println("a="+a[1]+" b="+a[0]);
            /**
             * 多元回归
             */
    //        double[] r = multiLinearEquationGroup(new double[][] { { 1, 2, 3, 1 }, { 2, 0, 1, 0 }, { 5, 2, 0, 0 }, { 7, 1, 1, 0 } }, new double[] { 18, 5, 9, 12 });
    //        for (int i = 0; i < r.length; i++)
    //        {
    //            System.out.println(r[i]);
    //        }
        }
    }
  • 相关阅读:
    LeetCode OJ 107. Binary Tree Level Order Traversal II
    LeetCode OJ 116. Populating Next Right Pointers in Each Node
    LeetCode OJ 108. Convert Sorted Array to Binary Search Tree
    LeetCode OJ 105. Construct Binary Tree from Preorder and Inorder Traversal
    LeetCode OJ 98. Validate Binary Search Tree
    老程序员解Bug的通用套路
    转载 四年努力,梦归阿里,和大家聊聊成长感悟
    转载面试感悟----一名3年工作经验的程序员应该具备的技能
    Web Service和Servlet的区别
    关于spring xml文件中的xmlns,xsi:schemaLocation
  • 原文地址:https://www.cnblogs.com/hnhcc39/p/2933856.html
Copyright © 2011-2022 走看看