在书籍《白话机器学习的数学》中,关于回归的内容主要涉及如何用一次函数实现回归模型。这里的基本概念包括:
1. 一次函数实现: 书中讨论了如何使用一次函数 来实现回归模型,并定义了目标函数 来计算误差。
2.最速下降法: 想要误差越来越小需要修改参数,并计算且与之前的值作比较,这样会很麻烦,所以需要使用函数的微分,首先计算的梯度,判断目前的参数在哪个梯度上
其中为学习率 ,学习率决定了在每次迭代中参数更新的步长。对于其他参数有
计算偏微分可得:
2. 数据预处理: 在实现参数更新之前,建议进行数据预处理,如将训练数据转换为平均值为0、方差为1的数据,也称为标准化或z-score规范化。这不是必须的步骤,但可以加快参数的收敛。
3. 学习率和误差差值: 学习率(ETA)设置为,误差的差值(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)的回归分析方法。这种方法可以用于分析多个变量之间的关系,以及它们如何共同影响一个因变量。如:
但方法也依然是对多个求微分,但是可以简化为矩阵的乘法。
随机梯度算法:
如果函数图像如图所示,则在梯度下降过程中采用快速下降法会容易陷入局部最优解,所以需要对训练的数据进行优化,假设训练数据有 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]
'''