多变量线性回归以及正规方程实现线性回归

多变量线性回归

再上一个我们介绍了代价函数以及梯度下降的概念和原理。并且构建了一个单变量线性回归的问题,实现了单个变量的回归问题。因为实际问题往往包括多个特征,所以我们要采用这些数据构建一个多元线性回归的模型,我将介绍两种方法即梯度下降法和正规方程法,并讨论两者的差异。
当输入变量有两个特征,一是房子的面积,二是房子卧室的数量;输出变量是房子的价格。使用我们构建的多元回归模型,开进行预测房价。
数据链接: 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()

不同学习率代价函数可视化

在这里插入图片描述
如上图所知,当学习率较小时,代价函数减小的较慢,意味着在梯度下降的收敛速度较慢,运行的时间更长。但是并不是学习率越大越好,学习率太大可能出现无法收敛的情况。
在代价函数收敛后,我们可以打印不同学习率下θ 的值,从而写出假设函数,完成对房价的的预测。
在下一篇我们将使用正规方程来实现回归算法。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值