一個發展中的電信市場,網絡容量往往是線性增加的,我們可以通過擬合歷史網絡容量指標,來判斷未來網絡規模,從而提前進行網絡擴容,防患於未然。
線性回歸實際上是找到一條直線,使得所有觀測點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
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()); } }
