📜  确定公式的系数(1)

📅  最后修改于: 2023-12-03 15:27:18.406000             🧑  作者: Mango

确定公式的系数

在数据科学和机器学习中,我们通常需要建立一个数理模型来描述某个现象或问题。对于线性模型而言,我们需要确定公式中的系数。接下来,我们将介绍一些方法来确定公式的系数。

最小二乘法

最小二乘法是一种常用的确定线性模型系数的方法。它通过寻找使残差平方和最小的系数来确定模型。即,我们寻找一组系数,能够使预测值与真实值之间的误差最小。

import numpy as np

# 构建数据
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 5, 4, 5])

# 构建矩阵
X = np.vstack([x, np.ones(len(x))]).T

# 最小二乘法
b, a = np.linalg.lstsq(X, y, rcond=None)[0]

# 输出结果
print(f"y = {a} + {b}x")

输出结果如下所示:

y = 2.2 + 0.3x
梯度下降法

梯度下降法是一种常用的优化方法,可以用于确定模型中的系数。我们通过迭代,逐步调整模型系数,使得损失函数的值最小化。

# 代价函数
def cost_function(X, y, theta):
    m = len(y)
    J = np.sum((X @ theta - y) ** 2) / (2 * m)
    return J

# 梯度下降函数
def gradient_descent(X, y, theta, alpha, iterations):
    m = len(y)
    J_history = np.zeros(iterations)  # 记录代价函数值

    for i in range(iterations):
        theta = theta - alpha * (X.T @ (X @ theta - y) / m)
        J_history[i] = cost_function(X, y, theta)

    return theta, J_history

# 构建数据
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 5, 4, 5])

# 构建矩阵
X = np.vstack([x, np.ones(len(x))]).T

# 初始化参数
theta = np.zeros(2)

# 梯度下降法
theta, J_history = gradient_descent(X, y, theta, alpha=0.01, iterations=1000)

# 输出结果
print(f"y = {theta[1]} + {theta[0]}x")

输出结果如下所示:

y = 1.797194012053529 + 0.4166444682848178x
正则化方法

正则化是一种常用的防止过拟合的方法。在确定模型系数时,我们将正则化项加入到代价函数中,以降低模型复杂度。常用的正则化方法有L1正则化和L2正则化。

# L2正则化
def cost_function_l2(X, y, theta, regularization=0.01):
    m = len(y)
    J = (np.sum((X @ theta - y) ** 2) + regularization * np.sum(theta[1:]**2)) / (2 * m)
    return J

# L1正则化
def cost_function_l1(X, y, theta, regularization=0.01):
    m = len(y)
    J = (np.sum((X @ theta - y) ** 2) + regularization * np.sum(np.abs(theta[1:]))) / (2 * m)
    return J

在使用上述方法时,我们可以通过调节参数,如最小二乘法中的rcond、梯度下降法中的alpha和iterations、正则化方法中的regularization来调整模型系数的确定过程。