线性回归

一、线性回归的一般形式

监督学习的主要任务是分类和回归,而线性回归是最简单的一种回归方式。

线性回归是要解决上面的问题,对于给定房子的面积如何来预测房子的价格。根据数据分布的特点,我们很自然的想到,如果能找到一条直线。这条直线在这些数据上表现好,那么它就能完成对于未知数据的预测。很自然我们假设的直线应该是下面的样子。

 其中,Θ是参数

为了衡量我们假设函数的好坏,还需要引进损失函数来评估函数的预测与真实值之间的差异,通常我们的第一反应是用绝对值来衡量差异,但是绝对值函数在优化的时候会比较麻烦,需要讨论大于零或者小于零,于是我们采用平方差来衡量误差,这样会比较方便,公式如下:

现在,我们有了损失函数,有了假设函数,就剩下一个问题还没有解决。如何求解我们的参数值,这里用的是梯度下降法。如下:

上面就是线性回归的一般形式。

二、线性回归的正则方程形式

关于矩阵求导,这篇知乎写的不错,大家可以看看。还有这篇博客。还有一种求导矩阵的方法是转化为对矩阵的迹求导,因为上面的是一个实数,实数的迹还是他本身。这里就没有列出。最后的结果是一样的。但是这样必须保证X的转置乘以X是可逆的,否则没有办法得到它的逆矩阵,而引入L2正则化可以解决这个问题。

三、线性回归的实现

这里的代码是对吴恩达机器学习课程线性回归部分作业的优化代码:源作业代码地址

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

#读入数据
data = pd.read_csv('ex1data1.txt',header=None,names=['Population','Profit'])
#显示数据
data.plot(kind='scatter',x='Population',y='Profit',figsize=(12,8))

#数据的预处理
#获取列数
cols = data.shape[1]
#将数据和标签分开
X = data.iloc[:,0:cols-1]
y = data.iloc[:,cols-1:cols]
#在X中插入一列,这样可以不用写b
X.insert(0,'ones',1)
#转换成np.array,方便计算
X = np.array(X)
y = np.array(y)
theta = np.zeros([1,2])

#完成loss函数的计算
def compute_loss(X,y,theta):
    inner = np.power((X@theta.T-y),2)
    return np.sum(inner)/(2*len(X))

#完成梯度下降算法的编写
def gradientDescent(X,y,theta,alpha,iters):
    costs=[]
    for i in range(iters):
        error = (X@theta.T)- y
        theta = theta - alpha*(error.T@X)/len(X)
        cost = compute_loss(X,y,theta)
        costs.append(cost)
        if i%100==0:
            print('第{}次循环,loss={}'.format(i,cost))
    return theta,costs

#进行计算
alpha = 0.01
iters = 1000
g,cost = gradientDescent(X,y,theta,alpha,iters)

#将拟合的直线和数据显示
x = np.linspace(data.Population.min(),data.Population.max(),100)
f = g[0,0]+g[0,1]*x
fig, ax = plt.subplots(figsize=(12,8))
ax.plot(x, f, 'r', label='Prediction')
ax.scatter(data.Population, data.Profit, label='Traning Data')
ax.legend(loc=2)
ax.set_xlabel('Population')
ax.set_ylabel('Profit')
ax.set_title('Predicted Profit vs. Population Size')
plt.show()

#绘制损失函数的图像
fig, ax = plt.subplots(figsize=(12,8))
ax.plot(np.arange(iters), cost, 'r')
ax.set_xlabel('Iterations')
ax.set_ylabel('Cost')
ax.set_title('Error vs. Training Epoch')
plt.show()

四、线性回归的概率解释

为什么线性回归的时候,用二次函数来衡量误差是有效的,下面从概率的角度解释一下。

五、线性回归的正则化-Lasso回归和Ridge回归(岭回归)

当数据特征大于数据量的时候,容易产生过拟合,解决过拟合有两种方式,一种是增加数据量,另一种是引入正则化。通常有两种正则化方法,L1正则化(Lasso回归),L2正则化(岭回归)

六、从最大化后验概率的角度看岭回归

七、正则方程和梯度下降的比较

下面列出几个注意的点:

1>学习速率alpha的选择,太小,会导致收敛过慢。太大会导致无法收敛,或者每次迭代后,损失函数不会下降。

可以按0.001   0.003  0.01  0.03   0.1  0.3这样的顺序选取

2>特征缩放:在有多个参数的时候,参数的取值范围不再同一个范围,有的范围大,有的范围小,导致运行梯度下降算法的时候,不能很快收敛,需要对参数进行缩放,一般来说,让参数在-3-3,-1/3-1/3之间。

      特征缩放的方式:x/max(x)-min(x)或者是x-平均值/(max(x)-min(x))或者x-平均值/标准差
 

参考资料:1>机器学习-白板推导系列-线性回归

                    2>CS229机器学习讲义资料

                    3>吴恩达-机器学习笔记及作业

                    4>西瓜书

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值