线性回归简介及python代码实现

线性回归的模型:

h(x)=θ0+θ1x1+θ2x2 h(x)=ni=0θixi=θTX , 这里 x0=1

代价函数为:

J(θ)=12(yh(x))2

代价函数的解释:

Y=θTX+ε , y(i)=θTx(i)+ε(i) , 这里,假设 ε 服从均值为0的高斯分布,即:

P(εi)=1(2π)δexp((y(i)θTx(i))22δ2)

P(y(i)|(x(i);θ))=1(2π)δexp((y(i)θTx(i))22δ2)

似然函数为:

L(θ)=ni=1P(y(i)|(x(i);θ))

对最似然函数求对数:

l(θ)=log(L(θ))=ni=1log(1(2π)δexp((y(i)θTx(i))22δ2))

=nlog(12πδ)1δ212ni=0(y(i)θTx(i))2

当对似然函数取最大值时,既是求 12ni=1(y(i)θTx(i))2 的最小值,即:

J(θ)=12ni=1(y(i)θTx(i))2=12(XθY)T(XθY) .

最小二乘意义下的参数最优:

J(θ)θ=XTXθXTY , 求驻点,

θ=(XTX)1XTY

XTX 不可逆, 或者为防止过拟合,可引入Lasso 回归或 岭回归。

J(θ)=12ni=0(y(i)θTx(i))2+12λmi=1θ2i

θ 求偏导数;

J(θ)θ=XTXθXTY+λθ ,

θ=(XTX+λI)1XTY

使用梯度下降法求 θ :

J(θ)θ=12ni=1(y(i)θTx(i))2

J(θ)θj=(yh(x))(yh(x))θj=(h(x)y)xj

批量梯度下降:( n 是 样本数量 )
Repeat until convergence{
θj=θj+αni=1(h(x(i))y(i))x(i)j
}
随机梯度下降:(m 是参数 θ 的数量)
Loop {
for i to m
θj=θj+α(h(x(i)y(i))x(i)j)
}
python代码实现:

#-*- coding:utf-8 -*-
import numpy as np
from numpy import *
import matplotlib as mpl
import matplotlib.pyplot as plt

if __name__=="__main__":
    m = 7                         # m 是样本数
    n = 2                         # n 是特征数目 + 1
    x = mat(ones((2,m)))
    x[1] = [-1,-2,0,0.5,1.2,0.9,-0.3]
    y = mat(zeros((1,m)))
    y = [1.2,0.3,3,2.65,3.1,2.75,1.5]
    a = 0.01
    Lamda = 0.001
    theta = mat(ones((1,n)))
    # 批量梯度下降
    for i in range(1000):
        for j in range(m):
            y_hat = theta * x
            theta[0,1]=theta[0,1] - a*(((y_hat-y).sum())*x[1,j] + Lamda*theta[0,1])
            theta[0,0]=theta[0,0] - a*(((y_hat-y).sum())*x[0,j] + Lamda*theta[0,0])
    # 随机梯度下降
    # for i in range(500):
    #     for j in range(m):
    #         y_hat = theta[0,0]*x[0,j] + theta[0,1]*x[1,j]
    #         theta[0,0] = theta[0,0] - a*(y_hat - y[j])*x[0,j]
    #         theta[0,1] = theta[0,1] - a*(y_hat - y[j]) * x[1,j]
    print theta
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.scatter(x[1], y, s=30, c='red', marker='s')
    xc = arange(-3.0, 3.0, 0.1)              # x 轴的取值范围
    y_hat = theta[0,0] + theta[0,1]*xc        # 由参数计算分解线
    ax.plot(xc, y_hat)
    plt.xlabel('X')
    plt.ylabel('Y')
    plt.show()

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值