再上一个我们介绍了代价函数以及梯度下降的概念和原理。并且构建了一个单变量线性回归的问题,实现了单个变量的回归问题。因为实际问题往往包括多个特征,所以我们要采用这些数据构建一个多元线性回归的模型,我将介绍两种方法即梯度下降法和正规方程法,并讨论两者的差异。
当输入变量有两个特征,一是房子的面积,二是房子卧室的数量;输出变量是房子的价格。使用我们构建的多元回归模型,开进行预测房价。
数据链接: https://pan.baidu.com/s/1-u0iDFDibZc6tTGGx9_wnQ 提取码: 351j
在多变量线性回归中假设函数依然是:现在不同的是矩阵x中包含有多个特征。在梯度下降之前我们仍要给x增加x0=1,方便矩阵的运算。
y是一个(n,1)维的列向量,xθT得到(n,1)维的向量,每一行数据是第 i 个元素,每一个元素都有相同的特征。
通过矩阵可以证明上述两种形式的公式是等价的。我们通过同时更新
的θ来计算J(θ)。通过多步的梯度下降,计算J(θ)将结果储存在一个向量中,等迭代次数结束后,画出J(θ)的图形。
再多变量线性回归中,由于我们涉及到多个特征,有的特征值差距很大,为了有效地减少迭代次数,我们需要将特征归一化到统一的范围,称为特征的归一化(特征缩放)
在这里我介绍特标准差归一化:
标准差归一化后可以将数据处理后符合正态分布。
import matplotlib
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']#用来显示中文标签
plt.rcParams['axes.unicode_minus'] = False#用来正常显示负号
#导入数据,因为两个特征差距很大,所以需要做归一化(采用标准化归一化)
data = pd.read_csv('ex1data2.txt',names = ['size','bedrooms','price'])
###特征归一化
def normalize_feature(data):
z = (data - data.mean())/data.std()#data.mean(),求均值函数:data.std(),求标准差
return z
data = normalize_feature(data)
#在这个数据集中我们有两个特征,单独观察size对价格的影响
data.plot.scatter( 'size','price',c='r',label='size data ')
plt.legend(loc=2)
plt.show()
data.insert(0,'ones',1)#要添加一列
X = data.iloc[:,0:3]
y = data.iloc[:,3:4]
X = np.matrix(X.values)
y = np.matrix(y.values)
##代价函数,和单变量一致
def costFunction(theta,X,y):
inner = np.power(X * theta.T - y ,2)
return np.sum(inner)/(2 * len(X))
##梯度下降和单变量一致
def gradintDescent(X,y,theta,alpha,iters):
costs = []
for i in range(iters):
theta -= alpha/len(X)*((X * theta.T-y).T * X)
cost = costFunction(theta,X,y)
costs.append(cost)
return theta,costs
##比较不同alpha下的代价函数图
condinate_alpha = [0.0003,0.003,0.03,0.0001,0.001,0.01]
iters = 2000
plt.figure(figsize=(10,8))#修改图的大小
for alpha in condinate_alpha:
theta = np.zeros((1,3)) #有三个特征,需要theta的也是(1,3)矩阵
theta,costs = gradintDescent(X,y,theta,alpha,iters)
plt.plot(np.arange(iters),costs,label='学习率{}'.format(alpha))
plt.xlabel('iters')
plt.ylabel('cost')
plt.title('cost vs iters')
plt.legend(loc=1)
plt.show()
如上图所知,当学习率较小时,代价函数减小的较慢,意味着在梯度下降的收敛速度较慢,运行的时间更长。但是并不是学习率越大越好,学习率太大可能出现无法收敛的情况。
在代价函数收敛后,我们可以打印不同学习率下θ 的值,从而写出假设函数,完成对房价的的预测。
在下一篇我们将使用正规方程来实现回归算法。