在統計學中,線性回歸(Linear Regression)是利用稱為線性回歸方程的最小平方函數對一個或多個
自變量和
因變量之間關系進行建模的一種
回歸分析。這種函數是一個或多個稱為回歸系數的模型參數的線性組合。只有一個自變量的情況稱為簡單回歸,大於一個自變量情況的叫做多元回歸。(這反過來又應當由多個相關的因變量預測的多元線性回歸區別,[引文需要],而不是一個單一的標量變量。)
回歸分析中,只包括一個自變量和一個因變量,且二者的關系可用一條直線近似表示,這種回歸分析稱為一元線性回歸分析。如果回歸分析中包括兩個或兩個以上的自變量,且因變量和自變量之間是線性關系,則稱為
多元線性回歸分析。
在線性回歸中,數據使用線性預測函數來建模,並且未知的模型參數也是通過數據來估計。這些模型被叫做線性模型。最常用的線性回歸建模是給定X值的y的條件均值是X的仿射函數。不太一般的情況,線性回歸模型可以是一個中位數或一些其他的給定X的條件下y的條件分布的分位數作為X的線性函數表示。像所有形式的回歸分析一樣,線性回歸也把焦點放在給定X值的y的條件概率分布,而不是X和y的聯合概率分布(多元分析領域)。
線性回歸是回歸分析中第一種經過嚴格研究並在實際應用中廣泛使用的類型。這是因為線性依賴於其未知參數的模型比非線性依賴於其位置參數的模型更容易擬合,而且產生的估計的統計特性也更容易確定。
下面的例1 來自下面網址:
http://wenku.baidu.com/link?url=4Dlv5iuen0K9pb2rD-OICKRpXk0QrEcDjsbgJMXo0nuqIUHuq5im-HU8v6p3Q1QKvj0nEhzsV5znMH1V0Wa3WzDvvynNNd0rT8QCX8LKuwa
線性方程:y=bx+a ,r為相關系數。線性方程詳情詳細參考
http://baike.baidu.com/link?url=0Ob9UvB9oe01IXZj93iWNS8zbtqX1fSHdjK4JKB0w0jzmw_8C32U1H55HVWc7oYJ
例1 10名同學在高一和高二的數學成績如下表:
74 |
71 |
72 |
68 |
76 |
73 |
67 |
70 |
65 |
74 |
|
76 |
75 |
71 |
70 |
76 |
79 |
65 |
77 |
62 |
72 |
其中x為高一數學成績,y為高二數學成績.
(1)y與x是否具有相關關系;
(2)如果y與x是相關關系,求回歸直線方程.
c#程序實現:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace testxyab { class Program { static void Main(string[] args) { //數據來自上面的例子 double[] x = new double[10] { 74,71,72,68,76,73,67,70,65,74}; double[] y = new double[10] { 76,75,71,70,76,79,65,77,62,72}; int count=10; double a,b,maxerr,rr; //a b 為系數,rr 為相關系數的平方,maxerr為最大偏差 CalcRegress(x, y, count, out a, out b, out maxerr, out rr); Console.WriteLine("a={0}\n b={1}\n maxerr={2}\n rr={3}", a, b, maxerr, rr); Console.ReadKey(); } public static void CalcRegress(double[] x, double[] y, int count, out double a, out double b, out double maxErr, out double r) { double sumX = 0; double sumY = 0; double avgX; double avgY; double r1; double r2;
//數據量過少,無法計算 if (count < 4) { return; } for (int i = 0; i < count; i++) { sumX += x[i]; sumY += y[i]; } avgX = sumX / count; avgY = sumY / count; double SPxy = 0; double SSx = 0; double SSy = 0; for (int i = 0; i < count; i++) { SPxy += (x[i] - avgX) * (y[i] - avg_Y); SSx += (x[i] - avgX) * (x[i] - avgX); SSy += (y[i] - avg_Y) * (y[i] - avg_Y); } //如果所有點的x相同,直線平行於y軸,無法計算。
//如果所有點的y相同直線為平行於x軸的直線y=k+0*x if (SSy==0) { a = y[1]; b = 0;
rr=0;
maxErr = 0; //return -1; } //y=bx+a b= SPxy / SSx; a= avgY - b* avgX; //開始計算R²值 r1 = SPxy * SPxy;//分子的平方 r2 = SSx * SSy;//分母的平方 r = r1 / r2; //計算R²值 //下面代碼計算最大偏差 maxErr = 0; for (int i = 0; i < count; i++) { double yi = a + b * x[i]; double absErrYi = Math.Abs(yi - y[i]);//假動作 if (absErrYi > maxErr) { maxErr = absErrYi; } } } } }