1. 定义
线性回归是通过现有数据,让训练模型生成一个拟合公式,从而计算目标数据的预测值。
在统计学中,线性回归(Linear Regression)是利用称为“线性回归方程”的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。
这种函数是一个或多个称为回归系数的模型参数的线性组合。
一个带有一个自变量的线性回归方程代表一条直线。我们需要对线性回归结果进行统计分析。
线性回归利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计方法运用十分广泛。其表达形式为y=x’x+e,e为误差服从均值为 θ 的正态分布。
线性回归假设物证和结果满足线性关系。其实线性关系的表达能力非常强大,每个特征对结果的影响强弱可以由前面的参数体现,而且每个特征变量可以首先映射到一个函数,然后再参与线性计算。这样就可以表达特征与结果之间的非线性关系。
回归属于有监督学习中的一种方法。该方法的核心思想是从连续型统计数据中得到数学模型,然后将该数学模型用于预测或者分类。
该方法处理的数据可以是多维的。
2. 回归与梯度下降
回归在数学上来说是给定一个点集,能够用一条曲线去拟合之。
如果这个曲线是一条直线,那就被称为线性回归;
如果曲线是一条二次曲线,就被称为二次回归。
回归还有很多变种,如:locally weighted 回归、logistic回归等。
举例,weka,做一个房屋价值的评估系统。相关变量可能有:
等。
这些影响房屋价值的变量被称为特征(feature)。
为简单起见,假设我们的房屋feature只有一个——房屋的面积。
准备数据如下:
面积(m^2)销售价钱(万元)12325015032087160102220……
x轴表示面积,y表示售价,则出来一个图:
如果再给定一个面积,要计算售价,可以用一条曲线去尽量拟合这些数据。
一些概念
典型的机器学习的过程
我们用X1,X2...Xn去描述feature里面的分量,比如x1=面积,x2=朝向等等,可以做出一个估计函数:
θ 称为参数,在这儿的意思是调整feature中每个分量的影响力,就是到底是房屋的面积更重要两袖清风是房屋的地段更重要。如果令X0=1,就可以用向量的方式来表示了:
我们程序也需要一个机制去评估θ是否比较好,所以说需要对ℎ函数进行评估,一般这个函数称为损失函数(loss function)或者错误函数(error function),描述ℎ函数不好的程度。在下面,做出一个错误函数:
这个错误估计函数是去对x(i)的估计值与真实值y(i)差的平方和作为错误估计函数,前面乘上1/2是为了在求导的时候,这个系数就不见了。
如何调整θ以使得J(θ)取得最小值有很多方法,其中有最小二乘法(min square),是一种完全是数学描述的方法,在stanford机器学习开放课最后的部分会推导最小二乘法的公式的来源,这个来很多的机器学习和数学书上都可以找到,下面介绍梯度下降法。
3. 梯度下降法
梯度下降法是按下面的流程来进行的:
4. 回归的一般方法
代码地址
核心代码:
import numpy as npdef loadDataSet(fileName): numFeat = len(open(fileName).readline().split(','))-1 dataMat=[];labelMat = [] fr = open(fileName) for line in fr.readlines(): lineArr = [] print(line) curLine = line.strip().split(',') for i in range(numFeat): lineArr.append(float(curLine[i])) dataMat.append(lineArr) labelMat.append(float(curLine[-1])) return dataMat, labelMat# 回归方程求取函数def fit(x,y): if len(x) != len(y): return numerator = 0.0 denominator = 0.0 x_mean = np.mean(x) y_mean = np.mean(y) for i in range(len(x)): numerator += (x[i]-x_mean)*(y[i]-y_mean) denominator += np.square((x[i]-x_mean)) print('numerator:',numerator,'denominator:',denominator) b0 = numerator/denominator b1 = y_mean - b0*x_mean return b0,b1# 定义预测函数def predit(x,b0,b1): return b0*x + b1
入口文件:
import numpy as npimport regressionfrom matplotlib import pylab as pl# 定义训练数据x, y = regression.loadDataSet('data.txt')# 求取回归方程b0, b1 = regression.fit(x,y)print('Line is:y = %2.0fx + %2.0f'%(b0,b1))# 预测x_test = np.array([1, 1.5, 2, 3, 4])y_test = np.zeros((1, len(x_test)))for i in range(len(x_test)): y_test[0][i] = regression.predit(x_test[i], b0, b1)# 绘制图像xx = np.linspace(0, 5)yy = b0*xx + b1pl.plot(xx, yy, 'k-')pl.scatter(x, y, cmap=pl.cm.Paired)pl.scatter(x_test, y_test[0], cmap=pl.cm.Paired)pl.show()
运行效果: