線性回歸的應用——容量預測


一個發展中的電信市場,網絡容量往往是線性增加的,我們可以通過擬合歷史網絡容量指標,來判斷未來網絡規模,從而提前進行網絡擴容,防患於未然。

線性回歸實際上是找到一條直線,使得所有觀測點y值到直線的離差平方和最小。

 

一、多元線性回歸

多元線性回歸使用矩陣方程可以很好的描述:

1、 擬合的p元線性方式格式

2、 回歸擬合直線滿足觀測值與理論值離差平方和最小

3、 分別對p+1個因變量系數Beta求導,得到如下方程組

4、 進一步化簡

5、 采用矩陣形式表示方程

6、 則方程系數如下

 

二、一元線性回歸

在實際應用場景中,一元線性回歸應用較廣,求解方法十分簡單,下面詳細介紹一下一元線性回歸的最小二乘法,百度百科介紹如下:

1. 列計算表,求∑x,∑xx,∑y,∑yy,∑xy;
2. 計算Lxx,Lyy,Lxy;
Lxx=∑(x-xˇ)(x-xˇ)
Lyy=∑(y-yˇ)(y-yˇ)
Lxy=∑(x-xˇ)(y-yˇ)
3. 求相關系數,並檢驗;
r = Lxy /( Lxx Lyy)1/2
2. 求回歸系數b和常數a;
b=Lxy /Lxx
a=y - bx
3. 列回歸方程。

其中r^2表示y的變化受x變化的影響程度。如果所有觀測點都落在擬合直線上,r^2 = 1; 如果觀測點左右對稱,r^2 = 0。相關系數是評判擬合直線准確性的一個重要指標,r^2越大,對於擬合直線的預測理論上越可信。

一元線性回歸代碼

package com.coshaho.learn;

/**
 * 
 * LineRegression.java Create on 2017年5月28日 下午9:38:47    
 *    
 * 類功能說明:  一元線性回歸 
 *
 * Copyright: Copyright(c) 2013 
 * Company: COSHAHO
 * @Version 1.0
 * @Author coshaho
 */
public class LineRegression 
{
    private float Lxx = 0;
    private float Lyy = 0;
    private float Lxy = 0;
    private float avgx = 0;
    private float avgy = 0;
    private int n = 0;
    // 因變量系數
    private float a = 0;
    // 方程常量
    private float b = 0;
    // 相關系數
    private double r = 0;
    private double r2 = 0;
    
    public boolean init(int[] xs, int[] ys)
    {
        if(null == xs || null == ys)
        {
            return false;
        }
        
        if(1 == xs.length || 1 == ys.length)
        {
            return false;
        }
        
        if(xs.length != ys.length)
        {
            return false;
        }
        caculate(xs, ys);
        return true;
    }
    
    private void caculate(int[] xs, int[] ys)
    {
        refresh();
        n = xs.length;
        
        for(int x : xs)
        {
            avgx = avgx + x;
        }
        avgx = avgx / n;
        
        for(int y : ys)
        {
            avgy = avgy + y;
        }
        avgy = avgy / n;
        
        for(int x : xs)
        {
            Lxx = Lxx + (x - avgx) * (x - avgx);
        }
        
        for(int y : ys)
        {
            Lyy = Lyy + (y - avgy) * (y - avgy);
        }
        
        for(int i = 0; i < n; i++)
        {
            Lxy = Lxy + (xs[i] - avgx) * (ys[i] - avgy);
        }
        
        a = Lxy / Lxx;
        b = avgy - a * avgx;
        r = Lxy / Math.sqrt(Lxx * Lyy);
        r2 = r * r;
    }
    
    private void refresh()
    {
        Lxx = 0;
        Lyy = 0;
        Lxy = 0;
        avgx = 0;
        avgy = 0;
        n = 0;
        a = 0;
        b = 0;
        r = 0;
        r2 = 0;
    }

    public float getA() 
    {
        return a;
    }

    public float getB()
    {
        return b;
    }

    public double getR() 
    {
        return r;
    }
    
    public double getR2() 
    {
        return r2;
    }

    public static void main(String[] args)
    {
        LineRegression line = new LineRegression();
        int[] xs = {1, 2, 3, 4, 5};
        int[] ys = {100, 80, 60, 80, 100};
        line.init(xs, ys);
        System.out.println("y = " + line.getA() + "x + " + line.getB());
        System.out.println("r^2 = " + line.getR2());
        
        int[] xs1 = {1, 2, 3, 4, 5};
        int[] ys1 = {100, 110, 130, 140, 170};
        line.init(xs1, ys1);
        System.out.println("y = " + line.getA() + "x + " + line.getB());
        System.out.println("r^2 = " + line.getR2());
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM