一、什么是线性回归(Linear Regression)
维基百科:线性回归
在统计学中,线性回归是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。
在统计学中,线性回归是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。
线性回归最简单的定义:给出一个点集D,用一个函数去拟合这个点集,并且使得点集与拟合函数间的误差最小,如果这个函数曲线是一条直线,那就被称为线性回归
二、最小二乘法的引用
在数据的统计分析中,数据之间即变量x与y之间的相关性研究非常重要,通过在直角坐标系中做散点图的方式我们会发现很多统计数据近似一条直线,它们之间或者正相关或者负相关。虽然这些数据是离散的,不是连续的,我们无法得到一个确定的描述这种相关性的函数方程,但既然在直角坐标系中数据分布接近一条直线,那么我们就可以通过画直线的方式得到一个近似的描述这种关系的直线方程。
当然,从前面的描述中不难看出,所有数据都分布在一条直线附近,因此这样的直线可以画出很多条,而我们希望找出其中的一条,能够最好地反映变量之间的关系。换言之,我们要找出一条直线,使这条直线“最贴近”已知的数据点
当然,从前面的描述中不难看出,所有数据都分布在一条直线附近,因此这样的直线可以画出很多条,而我们希望找出其中的一条,能够最好地反映变量之间的关系。换言之,我们要找出一条直线,使这条直线“最贴近”已知的数据点
直线表达式:
(可知只需求得a,b即可确定这条直线)
“最小二乘法”的核心就是保证所有数据偏差的平方和最小。(“平方”的在古时侯的称谓为“二乘”)
使用偏导:
这两个方程中xi和yi都是知道的,很容易就求得a和b了
三、回归系数公式推导
假定被解释变量Y与多个解释变量 X1,X2...Xk 之间具有线性关系,是解释变量的线性函数
注:该PPT为本人自制,这里的是多元线性回归,比一般的一元线性回归复杂一点,但求系数公式是通用的
四、python代码
1、引用外部数据,提供数据样本
你需要建立一个txt文本,内部存储数据,模式如下,你需要把该文本与代码文件放在同一个文件夹中
定义函数,从文本提取数据,顺序分别是直线y=kx+b中的b,x,y
def loadDataSet(fileName):
numFeat = len(open(fileName).readline().split('\t')) - 1 #得到特征值的个数
dataMat = []; labelMat = []
fr = open(fileName) #打开文件
for line in fr.readlines(): #读取整行
lineArr =[]
curLine = line.strip().split('\t') #将一行的不同特征分开
for i in range(numFeat):
lineArr.append(float(curLine[i]))
dataMat.append(lineArr)
labelMat.append(float(curLine[-1]))
return dataMat,labelMat
def standRegres(xArr,yArr):
xMat = mat(xArr); yMat = mat(yArr).T
xTx = xMat.T*xMat
ws = xTx.I * (xMat.T*yMat) #求 w=(x.T*x).I*x.T*y
return ws
a,b=loadDataSet('ex0.txt')
ws=standRegres(a,b)
print ws
x=arange(0,1,0.01)
plt.plot([i[1] for i in a],b,'or')
plt.plot(x,float(ws[0])+float(ws[1])*x,'g')
plt.show()
完整源代码
from numpy import *
import matplotlib.pyplot as plt
def loadDataSet(fileName):
numFeat = len(open(fileName).readline().split('\t')) - 1 #得到特征值的个数
dataMat = []; labelMat = []
fr = open(fileName) #打开文件
for line in fr.readlines(): #读取整行
lineArr =[]
curLine = line.strip().split('\t') #将一行的不同特征分开
for i in range(numFeat):
lineArr.append(float(curLine[i]))
dataMat.append(lineArr)
labelMat.append(float(curLine[-1]))
return dataMat,labelMat
def standRegres(xArr,yArr):
xMat = mat(xArr); yMat = mat(yArr).T
xTx = xMat.T*xMat
ws = xTx.I * (xMat.T*yMat) #求 w=(x.T*x).I*x.T*y
return ws
a,b=loadDataSet('ex0.txt')
ws=standRegres(a,b)
print ws
x=arange(0,1,0.01)
plt.plot([i[1] for i in a],b,'or')
plt.plot(x,float(ws[0])+float(ws[1])*x,'g')
plt.show()
2、自己制造样本
使用随机数生成样本
#制造样本
x = np.arange(0, 100, 0.2)
xArr = []
yArr = []
for i in x:
lineX = [1]
lineX.append(i)
xArr.append(lineX)
yArr.append( 0.5 * i + 3 + random.uniform(0, 1) * 4 *math.sin(i) )
确定线性回归的系数
#线性回归
xMat = np.mat(xArr)
yMat = np.mat(yArr).T
xTx = xMat.T * xMat
if np.linalg.det(xTx) == 0.0:
print "Can't inverse"
ws = xTx.I * xMat.T * yMat
print ws
y = xMat * ws
画图
#画图
plt.title("linear regression")
plt.xlabel("independent variable")
plt.ylabel("dependent variable")
plt.plot(x, yArr, 'go')
plt.plot(x, y, 'r', linewidth = 2)
plt.show()