白话机器学习的数学学习总结(一):回归问题

在书籍《白话机器学习的数学》中,关于回归的内容主要涉及如何用一次函数实现回归模型。这里的基本概念包括:

1. 一次函数实现: 书中讨论了如何使用一次函数 f\Theta (x) = \Theta1 + \Theta2*x 来实现回归模型,并定义了目标函数 E(\Theta ) = \frac{1}{2}\sum_{i=1}^{n}(y_{}^{(i)}-f\Theta (x{_{}}^{(i)}))^{_{}^{2}}来计算误差。

2.最速下降法: 想要误差E\left ( \Theta \right )越来越小需要修改参数\Theta,并计算E\left ( \Theta \right )且与之前的值作比较,这样会很麻烦,所以需要使用函数的微分,首先计算E\left ( \Theta \right )的梯度,判断目前的参数\Theta在哪个梯度上

比如在 x = 3 这一点,为了使 g ( x ) 的值变小,我们需要向左移动 x ,也就是必须减小 x,所以需要根据导数符号的相反的方向移动x,g(x)就会自然而然的沿着最小值方向前进了。最速下降法的表达式为                                     x:=x - \eta *g{}'(x)

其中\eta为学习率 ,学习率决定了在每次迭代中参数更新的步长。对于其他参数有

计算偏微分可得: 

 

 

2. 数据预处理: 在实现参数更新之前,建议进行数据预处理,如将训练数据转换为平均值为0、方差为1的数据,也称为标准化或z-score规范化。这不是必须的步骤,但可以加快参数的收敛。

3. 学习率和误差差值: 学习率(ETA)设置为1*10^{_{}^{-3}},误差的差值(diff)被初始化为1。

在实际应用中,合理地选择和调整学习率,以及正确地理解和计算误差值,对于确保模型有效学习和收敛至关重要。

4. 参数更新过程: 参数更新过程涉及对误差的连续计算和参数的调整。书中提供了示例代码,显示了每次迭代过程中的参数变化和误差差值。

5. 验证: 一次函数成功拟合了训练数据,显示了模型的有效性。

这些内容提供了对一次函数在回归模型中的应用的基本了解,包括如何实现和调整模型参数以及如何通过实验验证模型的有效性。

根据上述的内容可编写代码为

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

# 读取xlsx文件,书中是csv文件
df = pd.read_excel('235.xlsx')

# 截取文件数据
train_x = df.iloc[:, 0]
train_y = df.iloc[:, 1]


#初始化参数、
theta0 = np.random.rand()
theta1 = np.random.rand()

#预测函数
def f(x):
    return theta0 + theta1*x

#目标函数
def E(x,y):
    return 0.5 * np.sum((y-f(x))**2)

#标准化,可写可不写,目的是为了使数据收敛
mu = train_x.mean()   #平局值
sigma = train_x.std() #标准差
def standardize(x):
    return (x-mu)/sigma
train_z = standardize(train_x)

#打印图像
#plt.plot(train_z, train_y, 'o')
#plt.show()

#学习率
ETA = 1e-3

#误差的差值
diff = 1

#更新次数
count = 0

#重复学习
error = E(train_z, train_y)
while diff > 1e-2:
    #更新结果保存到临时变量
    tmp0 = theta0 - ETA * np.sum((f(train_z) - train_y))
    tmp1 = theta1 - ETA * np.sum((f(train_z) - train_y) * train_z)
    #更新参数
    theta1 = tmp1
    theta0 = tmp0
    #计算与上一次的误差值
    current_error = E(train_z,train_y)
    diff  = error - current_error
    error = current_error
    #输出日志
    count += 1
    log = ' 第 {} 次 : theta0 = {:.3f}, theta1 = {:.3f}, 差值 = {:.4f}'
    print(log.format(count, theta0, theta1, diff))

x = np.linspace(-3,3,100)
plt.plot(train_z,train_y,'o')
plt.plot(x,f(x))
plt.show()

#测验
print(f(standardize(100)))

本书中的多重回归问题(Multiple Regression):通常指的是使用两个或更多个自变量(independent variables)来预测一个因变量(dependent variable)的回归分析方法。这种方法可以用于分析多个变量之间的关系,以及它们如何共同影响一个因变量。如:

 但方法也依然是对多个\Theta求微分,但是可以简化为矩阵的乘法。

  随机梯度算法:

 如果函数图像如图所示,则在梯度下降过程中采用快速下降法会容易陷入局部最优解,所以需要对训练的数据进行优化,假设训练数据有 100 个,那么在 m = 10 时,创建一个有10个随机数的索引的集合,例如 K = {61, 53, 59, 16, 30, 21, 85, 31, 51, 10},然后重复更新参数

while diff > 1e-2:
    #为了调整训练数据的顺序,准备随机的序列
    p = np.random.permutation(X.shape[0])
    # 随机取出训练数据,使用随机梯度下降法更新参数
     for x, y in zip(X[p,:], train_y[p]):
    theta = theta - ETA * (f(x) - y) * x
    # 计算与上一次误差的差值
    errors.append(MSE(X, train_y))
    diff = errors[-2] - errors[-1]
    '''

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值