人工智能:线性回归

案例分析

根据面积和价格间的关系求解线性回归h_{\theta}(x) = \theta_0 + \theta_1x

基本流程

1.建立基本模型

\hat{y} = \theta_0 + \theta_1x

2.构造损失函数,求出偏导

J(\theta_0,\theta_1) = \frac{1}{2n}\sum_{i=0}^{n}(y_i-\hat{y_i})^2

J_{\theta_0}(\theta_0,\theta_1) = \sum_{i=0}^{n}\frac{\theta_0+\theta_1{x}-y}{n}

J_{\theta_1}(\theta_0,\theta_1) = \sum_{i=0}^{n}\frac{x_i*(\theta_0+\theta_1{x_i}-y)}{n}

3.利用梯度下降更新变量值

\theta_0 = \theta_0 - \alpha\frac{\partial{J}}{\partial{\theta_0}}

\theta_1 = \theta_1 - \alpha\frac{\partial{J}}{\partial{\theta_1}}

4.求出损失函数的值判断是否终止

5.进行迭代运算

代码推导

1.设置\alpha的值即梯度下降中的步长,和迭代次数times的值

alpha = 0.1#学习率
times = 10000 # 步长

2.每次利用梯度下降更新 \theta_0 和 \theta_1 的值

    for i in range(m):     # m为数据总数
        theta0 = theta0 - alpha*((theta0+theta1*x[i]-y[i])/m) 
        theta1 = theta1 - alpha*((theta0+theta1*x[i]-y[i])/m)*x[i]

3.求出损失函数J(\theta)的总值

    for i in range(m):
        diss = diss + (1/(2*m))*pow((theta0+theta1*x[i]-y[i]),2)

4.判断是否符合退出条件,若不符合则继续迭代运行

if diss <= 100:
    break

源代码

import matplotlib.pyplot as plt
import matplotlib
from math import pow
from random import uniform
import random

x0 = [150, 200, 250, 300, 350, 400, 600]
y0 = [6450, 7450, 8450, 9450, 11450, 15450, 18450]
# 为了方便计算,将所有数据缩小 100 倍
x = [1.50, 2.00, 2.50, 3.00, 3.50, 4.00, 6.00]
y = [64.50, 74.50, 84.50, 94.50, 114.50, 154.50, 184.50]

# 线性回归函数为 y=theta0+theta1*x
# 参数定义
theta0 = 0.1  # 对 theata0 赋值
theta1 = 0.1  # 对 theata1 赋值
alpha = 0.1  # 学习率
m = len(x)
count0 = 0
theta0_list = []
theta1_list = []

for num in range(10000):
    count0 += 1
    diss = 0  # 误差
    deriv0 = 0  # 对 theata0 导数
    deriv1 = 0  # 对 theata1 导数
    # 求导
    for i in range(m):
        deriv0 += (theta0 + theta1 * x[i] - y[i]) / m
        deriv1 += ((theta0 + theta1 * x[i] - y[i]) / m) * x[i]
    # 更新 theta0 和 theta1
    for i in range(m):
        theta0 = theta0 - alpha * ((theta0 + theta1 * x[i] - y[i]) / m)
        theta1 = theta1 - alpha * ((theta0 + theta1 * x[i] - y[i]) / m) * x[i]
    # 求损失函数 J (θ)
    for i in range(m):
        diss = diss + (1 / (2 * m)) * pow((theta0 + theta1 * x[i] - y[i]), 2)

    theta0_list.append(theta0 * 100)
    theta1_list.append(theta1)
    # 如果误差已经很小,则退出循环
    if diss <= 100:
        break

theta0 = theta0 * 100  # 前面所有数据缩小了 100 倍,所以求出的 theta0 需要放大 100 倍,theta1 不用变

print("最终得到theta0={},theta1={}".format(theta0, theta1))
print("得到的回归函数是:y={}+{}*x".format(theta0, theta1))

                                                                     图 1

 

                                                            图 2 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值