【机器学习】线性回归(Liner Regression)

本文深入介绍了线性回归算法的基本原理,包括一元回归与多元回归的区别,并详细推导了线性回归模型的损失函数及梯度下降法的更新公式。此外,还提供了使用TensorFlow实现线性回归的完整代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

回归算法是一种通过最小化预测值与实际结果值之间的差距,而得到输入特征之间的最佳组合方式的一类算法。对于连续值预测有线性回归等,而对于离散值/类别预测,我们也可以把逻辑回归等也视作回归算法的一种。这次我们来详细了解一下线性回归

1、算法思想

线性回归,是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。直白的说就是根据一些连续的数据拟合出一条线,通过这条线就可以实现有监督学习的预测。

线性回归分析又分为一元回归和多元回归:
一元回归分析:y=wx+b 可表示为hθ=θTxhθ=θTx 只有一个自变量和因变量,他们之间呈线性关系(可用一条直线表示)
多元回归分析:hθ=θ0+θ0x1+.......+θnxnhθ=θ0+θ0x1+.......+θnxn包含两个以上的自变量而且自变量与因变量之间也是线性关系

线性回归分析的值与实际值的距离的平均值,损失函数得到的值越小,损失也就越小,此处损失函数为最小二乘,均方误差形式

J(θ)=12mi=1(hθ(x(i))y(i))2J(θ)=12∑i=1m(hθ(x(i))−y(i))2

有了损失函数既可以就可以使用梯度下降进行求解拟合
梯度下降法:就是最小化损失函数的过程,通过不断调整权重使得损失函数最小达到一个局部最优值。
吴恩达网易云课堂上有一个例子很生动的解释了梯度下降,想想我们在山上想要找到一条一条路下山,每次我们都会选择一条斜率最大方向向下走,这个三维空间的斜率就可以理解成我们的梯度,我们每次走的步长就是 αα 也就是所谓的学习率,然后重复选择最大斜率直到我们达到一个局部最优解山脚下。
这里写图片描述
所以我么就可写出他的梯度更新公式

θjθjαJ(θ0,θ1)θj←θj−α▽J(θ0,θ1)
θjθjαmi=1(hθ(x(i))y(i))x(i)jθj←θj−α∑i=1m(hθ(x(i))−y(i))xj(i)

2、公式推导

线性回归:y=ax+by=ax+b
假设目标函数:hθ=θ0+θ0x1+.......+θnxn=θTxhθ=θ0+θ0x1+.......+θnxn=θTx
y(i)=θTx(i)+ϵ(i)y(i)=θTx(i)+ϵ(i)
其中ϵ(i)ϵ(i)为误差,是独立相同分布的,服从均值为0方差为σ2σ2的高斯分布,根据中心极限定理所得
高斯分布的概率密度函数为P(ϵ(i))=12πσexp((ϵ(i))22σ2)P(ϵ(i))=12πσexp(−(ϵ(i))22σ2)
可以得出
P(y(i)|x(i);θ)=12πσexp((y(i)θTx(i))22σ2)P(y(i)|x(i);θ)=12πσexp(−(y(i)−θTx(i))22σ2)
极大似然函数
L(θ)=mi=1P(y(i)|x(i);θ)=mi=112πσexp((y(i)θTx(i))22σ2)L(θ)=∏i=1mP(y(i)|x(i);θ)=∏i=1m12πσexp(−(y(i)−θTx(i))22σ2)
然后取对数
logL(θ)=logmi=112πσexp((y(i)θTx(i))22σ2)logL(θ)=log∏i=1m12πσexp(−(y(i)−θTx(i))22σ2)
logL(θ)=mi=1log12πσexp((y(i)θTx(i))22σ2)logL(θ)=∑i=1mlog12πσexp(−(y(i)−θTx(i))22σ2)
logL(θ)=mlog12πσ12σ2mi=1(y(i)θTx(i))2logL(θ)=mlog12πσ−12σ2∑i=1m(y(i)−θTx(i))2
因为极大似然函数要极大值所以问题可转化为求12mi=1(y(i)θTx(i))212∑i=1m(y(i)−θTx(i))2的最小值
所以得出线性回归的损失函数为
J(θ)=12mi=1(y(i)θTx(i))2J(θ)=12∑i=1m(y(i)−θTx(i))2

3、代码实现

import tensorflow as tf
import numpy
import matplotlib.pyplot as plt
rng = numpy.random
# 设定的超参数
learning_rate = 0.01
training_epochs = 1000
display_step = 50
# 构造一些数据
train_X = numpy.asarray([3.3,4.4,5.5,6.71,6.93,4.168,9.779,6.182,7.59,2.167,
                         7.042,10.791,5.313,7.997,5.654,9.27,3.1])
train_Y = numpy.asarray([1.7,2.76,2.09,3.19,1.694,1.573,3.366,2.596,2.53,1.221,
                         2.827,3.465,1.65,2.904,2.42,2.94,1.3])
n_samples = train_X.shape[0]
# tf 计算图的 输入
X = tf.placeholder("float")
Y = tf.placeholder("float")
# 设定模型权重
W = tf.Variable(rng.randn(), name="weight")
b = tf.Variable(rng.randn(), name="bias")
# 构建一个线性回归模型
pred = tf.add(tf.mul(X, W), b)
# 均方误差
cost = tf.reduce_sum(tf.pow(pred-Y, 2))/(2*n_samples)
# 梯度下降
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)
# 初始化变量
init = tf.initialize_all_variables()
# 在session中启动计算图
with tf.Session() as sess:
    sess.run(init)

    # 拟合训练数据
    for epoch in range(training_epochs):
        for (x, y) in zip(train_X, train_Y):
            sess.run(optimizer, feed_dict={X: x, Y: y})

        #每个epoch输出信息
        if (epoch+1) % display_step == 0:
            c = sess.run(cost, feed_dict={X: train_X, Y:train_Y})
            print "Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(c), \
                "W=", sess.run(W), "b=", sess.run(b)

    print "Optimization Finished!"
    training_cost = sess.run(cost, feed_dict={X: train_X, Y: train_Y})
    print "Training cost=", training_cost, "W=", sess.run(W), "b=", sess.run(b), '\n'

    #Graphic display
    plt.plot(train_X, train_Y, 'ro', label='Original data')
    plt.plot(train_X, sess.run(W) * train_X + sess.run(b), label='Fitted line')
    plt.legend()
    plt.show()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值