吴恩达机器学习实战:手把手教你用Python复现线性回归作业(附完整代码)

吴恩达机器学习 2022版 Python 项目实战:3大模块11个练习完整复现指南 本文详细介绍了吴恩达机器学习2022版课程的Python实战指南,涵盖监督学习、无监督学习和神经网络三大模块的11个核心练习。通过从零实现的代码示例和优化技巧,帮助学习者将理论转化为实践,掌握线性回归、逻辑回归、K-means聚类和神经网络等关键算法。适合希望用Python复现经典机器学习案例的开发者。 阅读详情

从公式到代码:手把手构建你的第一个线性回归模型

很多朋友在学吴恩达老师的机器学习课程时,都有过类似的困惑:那些优雅的数学公式,比如代价函数、梯度下降,听起来逻辑清晰,可一旦打开编辑器,面对空白的Python文件,却不知从何下手。理论上的“理解”和实际能“跑起来”的代码之间,似乎隔着一道鸿沟。这篇文章,就是为你准备的桥梁。我们不谈空泛的概念,而是聚焦于一个最经典也最基础的算法——线性回归,用Python一步步把它从数学符号变成可运行、可调试的代码。无论你是想巩固理论基础,还是为面试积累实战项目,这个过程都将让你对机器学习如何“工作”有更扎实的把握。

1. 环境搭建与数据初探

在动手写任何算法之前,一个干净、可复现的环境是高效工作的基石。我强烈建议使用Anaconda来管理你的Python环境,它能很好地处理包依赖问题。对于这个项目,我们需要的核心库并不多:

# 创建并激活一个专用于本项目的虚拟环境(可选但推荐)
conda create -n linear_regression_demo python=3.9
conda activate linear_regression_demo

# 安装必要库
pip install numpy pandas matplotlib scikit-learn jupyter
  • numpy 是进行矩阵和数值计算的基石,没有它,机器学习中的向量化操作将寸步难行。
  • pandas 用于数据加载和初步的清洗、查看,它让处理表格数据变得异常轻松。
  • matplotlib 是我们的可视化工具,无论是绘制原始数据散点图,还是观察梯度下降过程,都离不开它。
  • scikit-learn 在这里并非用于直接调用它的线性回归模型,而是借用其丰富的数据集和工具函数,例如数据划分。
  • jupyter 提供了一个交互式的探索环境,非常适合一步步调试和观察中间结果。

接下来,我们加载数据。为了完全复现课程作业的感觉,我们可以使用一个经典的数据集:波士顿房价数据集(虽然该数据集因伦理问题已从sklearn最新版本中移除,但其历史地位无可替代,我们可用其他类似数据集或自行构造)。这里,为了纯粹聚焦算法,我们自己构造一份模拟数据。这有一个额外好处:你清楚地知道数据是怎么来的,便于理解算法如何拟合。

import numpy as np
import matplotlib.pyplot as plt

# 设置随机种子,确保每次运行结果一致
np.random.seed(42)

# 生成特征X和目标y
# 假设真实关系为 y = 2.5 * X + 1.0 + 噪声
m = 100  # 样本数量
X = 2 * np.random.rand(m, 1)  # 生成0到2之间的均匀分布,形状(100, 1)
y = 2.5 * X + 1.0 + np.random.randn(m, 1)  # 加入高斯噪声

# 快速可视化,看看数据长什么样
plt.figure(figsize=(10, 6))
plt.scatter(X, y, alpha=0.7, edgecolors='k', label='Training Data')
plt.xlabel('Feature X (e.g., House Size)')
plt.ylabel('Target y (e.g., Price)')
plt.title('Simulated Linear Regression Dataset')
plt.legend()
plt.grid(True, linestyle='--', alpha=0.5)
plt.show()

运行这段代码,你应该能看到大致呈线性趋势的散点图。我们的目标,就是找到一条直线,最好地穿过这些点。记住这个图,后面我们会把算法找到的直线画上去做对比。

注意:在实际项目中,拿到数据后的第一步永远是探索性数据分析(EDA)。你需要查看数据的基本统计信息(均值、标准差)、检查缺失值、观察特征分布以及特征与目标之间的关系。对于线性回归,尤其要留意异常值,因为它们会对最小二乘估计产生巨大影响。

2. 线性回归的核心:代价函数与梯度下降

现在进入正题。线性回归的目标是找到参数 $\theta_0$ (截距) 和 $\theta_1$ (斜率),使得我们的预测值 $\hat{y} = \theta_0 + \theta_1 X$ 与真实值 $y$ 之间的差距最小。这个差距用代价函数(Cost Function) 来衡量,最常用的是均方误差(MSE)。

2.1 实现代价函数

代价函数 $J(\theta_0, \theta_1)$ 的数学定义是:

$$J(\theta_0, \theta_1) = \frac{1}{2m} \sum_{i=1}^{m} (\hat{y}^{(i)} - y^{(i)})^2 = \frac{1}{2m} \sum_{i=1}^{m} (\theta_0 + \theta_1 X^{(i)} - y^{(i)})^2$$

这里除以 $2m$ 而不是 $m$ 是为了后续求导时形式更整洁(系数2会被消掉)。让我们用Python实现它,并采用向量化的写法,这比用for循环高效得多。

def compute_cost(X, y, theta):
    """
    计算线性回归的代价函数(MSE)。
    参数:
    X : 特征矩阵,形状 (m, n),其中n是特征数(本例中n=1,但函数支持多元)
    y : 目标向量,形状 (m, 1)
    theta : 参数向量,形状 (n+1, 1)
    返回:
    cost : 标量,代价函数值
    """
    m = len(y)  # 样本数量
    # 计算预测值。注意:X需要添加一列1以对应theta_0 (偏置项)
    # 这里假设传入的X是原始特征,未添加偏置列。我们在函数内部处理。
    # 更通用的做法是,在外部将X准备好为 [1, X] 的形式。
    # 为了清晰,我们假设X已经是添加了偏置列的形式,即第一列全为1。
    predictions = X.dot(theta)  # (m, n+1) dot (n+1, 1) -> (m, 1)
    errors = predictions - y    # (m, 1)
    # 向量化计算平方误差和
    cost = (1/(2*m)) * np.sum(errors**2)
    return cost

# 让我们测试一下这个函数。首先,为我们的数据X添加偏置列。
X_b = np.c_[np.ones((m, 1)), X]  # 将形状(100,1)的X变为(100,2),第一列为1
print("X_b的形状:", X_b.shape)  # 应该输出 (100, 2)

# 初始化参数theta,比如全设为0
theta_initial = np.zeros((2, 1))
print("初始theta:", theta_initial.T)  # 转置一下方便看

# 计算初始代价
initial_cost = compute_cost(X_b, y, theta_initial)
print(f"当theta=[0, 0]时,代价函数值: {initial_cost:.4f}")

如果一切正常,你会得到一个较大的代价函数值,因为用一条水平线(斜率为0)去拟合数据,误差当然很大。

2.2 实现梯度下降算法

代价函数告诉我们当前参数有多“差”,而梯度下降(Gradient Descent) 则告诉我们如何改进参数。其核心思想是沿着代价函数下降最快的方向(负梯度方向)更新参数。

更新规则(同时更新所有参数): $$\theta_j := \theta_j - \alpha \frac{1}{m} \sum_{i=1}^{m} (\hat{y}^{(i)} - y^{(i)}) X_j^{(i)} \quad \text{for } j = 0, 1$$

其中 $\alpha$ 是学习率(Learning Rate),控制着每一步更新的幅度。

def gradient_descent(X, y, theta, alpha, num_iters):
    """
    执行批量梯度下降以学习参数theta。
    参数:
    X : 特征矩阵(已添加偏置列),形状 (m, n+1)
    y : 目标向量,形状 (m, 1)
    theta : 初始参数向量,形状 (n+1, 1)
    alpha : 学习率
    num_iters : 迭代次数
    返回:
    theta : 学习到的参数,形状 (n+1, 1)
    cost_history : 每次迭代的代价函数值列表,用于可视化
    """
    m = len(y)
    cost_history = []
    
    for i in range(num_iters):
        # 计算预测值
        predictions = X.dot(theta)  # (m, 1)
        # 计算误差
        errors = predictions - y    # (m, 1)
        # 计算梯度。注意:这是向量化形式,一次性计算所有theta的梯度。
        # X.T.dot(errors) 得到形状 (n+1, 1) 的梯度向量
        gradients = (1/m) * X.T.dot(errors)
        # 更新参数
        theta = theta - alpha * gradients
        # 记录本次迭代的代价
        cost = compute_cost(X, y, theta)
        cost_history.append(cost)
        
        # 每100次迭代打印一次进度(可选)
        if i % 100 == 0:
            print(f"Iteration {i}: Cost = {cost:.6f}")
    
    return theta, cost_history

# 设置超参数并运行梯度下降
alpha = 0.1  # 学习率
num_iters = 1000  # 迭代次数

# 再次使用初始化为0的参数
theta_initial = np.zeros((2, 1))
theta_learned, cost_hist = gradient_descent(X_b, y, theta_initial, alpha, num_iters)

print(f"\n学习到的参数 theta: {theta_learned.flatten()}")
print(f"真实的生成参数是: 截距=1.0, 斜率=2.5")

运行后,你应该看到代价函数随着迭代不断下降,最终学习到的参数应该接近我们生成数据时使用的真实参数(1.0和2.5)。由于我们加入了噪声,结果不会完全一致,但会非常接近。

2.3 可视化学习过程

理解算法如何工作,可视化是最有力的工具。我们来画两张图:一是代价函数的下降曲线,二是梯度下降过程中拟合直线的演变。

# 图1:代价函数随迭代次数的变化
plt.figure(figsize=(12, 5))

plt.subplot(1, 2, 1)
plt.plot(range(num_iters), cost_hist, 'b-', linewidth=2)
plt.xlabel('Iteration Number')
plt.ylabel('Cost J')
plt.title('Gradient Descent: Cost vs. Iterations')
plt.grid(True)

# 图2:最终拟合结果
plt.subplot(1, 2, 2)
plt.scatter(X, y, alpha=0.7, label='Training Data')
# 生成预测线
X_range = np.array([[0], [2.5]])  # 取X的最小和最大值范围
X_range_b = np.c_[np.ones((2, 1)), X_range]  # 添加偏置列
y_predict = X_range_b.dot(theta_learned)
plt.plot(X_range, y_predict, 'r-', linewidth=3, label=f'Fit: y={theta_learned[1][0]:.2f}x + {theta_learned[0][0]:.2f}')
plt.xlabel('Feature X')
plt.ylabel('Target y')
plt.title('Linear Regression Fit')
plt.legend()
plt.grid(True)

plt.tight_layout()
plt.show()

第一张图展示了优化过程是否健康。一个平滑、持续下降的曲线表明学习率设置合适。如果曲线震荡剧烈或上升,说明学习率可能太大了。如果下降极其缓慢,则学习率可能太小。

3. 关键技巧与深度解析

仅仅实现基础版本还不够。在实际应用中,有几个技巧能显著提升模型的性能和训练效率。这部分往往是理论课程中一笔带过,但实践中至关重要的。

3.1 特征缩放:为什么以及怎么做

当特征之间的尺度差异巨大时(例如,一个特征是房屋面积(100-300平方米),另一个特征是房间数(2-6)),梯度下降会变得非常低效。代价函数的等高线图会变得又高又窄,梯度下降需要很多次曲折的“之字形”移动才能到达最低点。

特征缩放就是将不同特征的值缩放到相近的范围内。两种最常用的方法是:

  1. 均值归一化(Mean Normalization): $X' = \frac{X - \mu}{\text{range}}$ 或 $\frac{X - \mu}{\sigma}$
  2. 标准化(Standardization / Z-score Normalization): $X' = \frac{X - \mu}{\sigma}$

其中 $\mu$ 是均值,$\sigma$ 是标准差,range是极差(最大值减最小值)。标准化通常更常用,因为它处理了数据的分布,使得特征值大致服从标准正态分布。

def feature_standardization(X):
    """
    对特征矩阵X的每一列(每个特征)进行标准化。
    参数:
    X : 特征矩阵,形状 (m, n),每列是一个特征
    返回:
    X_norm : 标准化后的特征矩阵
    mu : 每个特征的均值,形状 (1, n)
    sigma : 每个特征的标准差,形状 (1, n)
    """
    mu = np.mean(X, axis=0)  # 沿样本轴(第0轴)求均值
    sigma = np.std(X, axis=0)
    # 防止除零,如果某个特征标准差为0(所有值相同),则设为1
    sigma = np.where(sigma == 0, 1, sigma)
    X_norm = (X - mu) / sigma
    return X_norm, mu, sigma

# 注意:对于我们的单特征例子,特征缩放效果不明显,但为了演示,我们实现它。
# 假设我们有一个新的多元特征数据集
np.random.seed(123)
m2 = 50
X_multi = np.random.randn(m2, 2) * np.array([10, 0.1]) + np.array([5, 2])  # 两个尺度差异巨大的特征
print("原始特征示例(前5行):")
print(X_multi[:5])
print(f"\n特征1的均值: {np.mean(X_multi[:,0]):.2f}, 标准差: {np.std(X_multi[:,0]):.2f}")
print(f"特征2的均值: {np.mean(X_multi[:,1]):.2f}, 标准差: {np.std(X_multi[:,1]):.2f}")

X_norm, mu, sigma = feature_standardization(X_multi)
print("\n标准化后特征示例(前5行):")
print(X_norm[:5])
print(f"\n标准化后特征1的均值: {np.mean(X_norm[:,0]):.4f}, 标准差: {np.std(X_norm[:,0]):.4f}")
print(f"标准化后特征2的均值: {np.mean(X_norm[:,1]):.4f}, 标准差: {np.std(X_norm[:,1]):.4f}")

重要提示:计算均值mu和标准差sigma时,必须只使用训练集数据。然后用训练集计算出的mu和sigma去标准化验证集和测试集。绝对不能用整个数据集(包含测试集)来计算这些统计量,否则就造成了数据泄露,会严重高估模型性能。

3.2 学习率的选择与调试

学习率 $\alpha$ 是梯度下降中最重要的超参数。如何选择?

  • $\alpha$ 太小:收敛速度极慢,需要大量迭代。
  • $\alpha$ 太大:代价函数可能不收敛,甚至发散(代价函数值越来越大)。

一个实用的调试方法是:尝试一系列呈指数增长或衰减的 $\alpha$ 值,例如 0.001, 0.003, 0.01, 0.03, 0.1, 0.3。观察代价函数下降曲线。

def plot_learning_rates(X, y, thetas_init, alphas, num_iters=50):
    """
    绘制不同学习率下代价函数的下降曲线。
    """
    plt.figure(figsize=(10, 6))
    for alpha in alphas:
        theta_temp = thetas_init.copy()
        cost_hist = []
        for i in range(num_iters):
            predictions = X.dot(theta_temp)
            errors = predictions - y
            gradients = (1/len(y)) * X.T.dot(errors)
            theta_temp = theta_temp - alpha * gradients
            cost_hist.append(compute_cost(X, y, theta_temp))
        plt.plot(range(num_iters), cost_hist, label=f'alpha={alpha}')
    
    plt.xlabel('Iterations')
    plt.ylabel('Cost')
    plt.title('Effect of Learning Rate on Convergence')
    plt.legend()
    plt.grid(True)
    plt.yscale('log')  # 使用对数坐标可以更清晰地看到差异
    plt.show()

# 为我们的简单数据(已添加偏置列)测试不同学习率
alphas_to_try = [0.001, 0.01, 0.1, 0.5, 1.0]
plot_learning_rates(X_b, y, np.zeros((2, 1)), alphas_to_try)

从图中,你可以直观地看到:过小的学习率(如0.001)下降缓慢;合适的学习率(如0.01, 0.1)平滑快速下降;过大的学习率(如0.5, 1.0)可能导致震荡甚至发散(代价上升)。

3.3 正规方程:另一种求解方式

对于线性回归,我们其实可以不使用迭代的梯度下降,而通过解析方法直接求出最优参数。这个方法叫做正规方程(Normal Equation)。

公式为:$\theta = (X^T X)^{-1} X^T y$

其推导来自于令代价函数对 $\theta$ 的导数为零。它的优点是无需选择学习率,无需迭代,一次计算得到最优解。缺点是当特征数量 $n$ 很大时(例如 > 10000),计算 $(X^T X)^{-1}$ 的逆矩阵会非常慢(时间复杂度约为 $O(n^3)$),而梯度下降在特征数量很大时依然表现良好。

def normal_equation(X, y):
    """
    使用正规方程求解线性回归参数。
    参数:
    X : 特征矩阵(已添加偏置列),形状 (m, n+1)
    y : 目标向量,形状 (m, 1)
    返回:
    theta : 最优参数,形状 (n+1, 1)
    """
    # 计算 theta = np.linalg.inv(X.T @ X) @ X.T @ y
    # 使用np.linalg.pinv求伪逆,数值上更稳定,即使X.T @ X不可逆也能处理
    theta = np.linalg.pinv(X.T.dot(X)).dot(X.T).dot(y)
    return theta

# 用正规方程求解我们模拟数据的最优参数
theta_normal_eq = normal_equation(X_b, y)
print(f"正规方程求得的 theta: {theta_normal_eq.flatten()}")
print(f"梯度下降求得的 theta: {theta_learned.flatten()}")
print(f"两者差异: {np.abs(theta_normal_eq - theta_learned).flatten()}")

你会发现,正规方程和梯度下降(在充分迭代后)得到的结果几乎相同。对于小数据集,正规方程非常方便快捷。

方法优点缺点适用场景
梯度下降当特征数量n很大时也能高效工作;适用于各种模型(逻辑回归、神经网络)需要选择学习率α;需要多次迭代大规模数据集(m很大),特征数量多(n大)
正规方程无需选择学习率;无需迭代;直接得到解析解需要计算$(X^T X)^{-1}$,复杂度$O(n^3)$;当n很大时非常慢;若$X^T X$不可逆需特殊处理小规模数据集(m适中),特征数量少(n < 1000)

4. 从一元到多元:扩展你的模型

现实问题中,影响结果的因素很少只有一个。房价不仅取决于面积,还有房间数、房龄、地段等。这就需要多元线性回归。好消息是,我们之前写的代码几乎不需要改动就能支持多元!因为我们已经使用了向量化的形式。

假设现在我们有一个包含两个特征的数据集:$X_1$(面积)和 $X_2$(房间数)。我们的假设函数变为: $\hat{y} = \theta_0 + \theta_1 X_1 + \theta_2 X_2$

向量化表示中,$X$ 是一个 $m \times 3$ 的矩阵(第一列是1),$\theta$ 是一个 $3 \times 1$ 的向量。代价函数和梯度下降的公式在形式上完全一致。

让我们用代码演示一下:

# 生成一个二元特征的模拟数据集
np.random.seed(2023)
m_multi = 200
# 特征1:面积(单位:百平方英尺),范围在10到30之间
X1 = 10 + 20 * np.random.rand(m_multi, 1)
# 特征2:房间数,范围在2到6之间
X2 = 2 + 4 * np.random.rand(m_multi, 1)
# 真实关系:价格 = 30 + 5*面积 + 10*房间数 + 噪声
y_multi = 30 + 5*X1 + 10*X2 + np.random.randn(m_multi, 1) * 5

# 组合特征
X_raw = np.hstack([X1, X2])  # 形状 (200, 2)
print("原始特征矩阵形状:", X_raw.shape)

# 1. 特征缩放(非常重要!)
X_norm, mu_multi, sigma_multi = feature_standardization(X_raw)

# 2. 添加偏置列
X_multi_b = np.c_[np.ones((m_multi, 1)), X_norm]  # 形状 (200, 3)

# 3. 初始化参数 (现在是3个:theta0, theta1, theta2)
theta_init_multi = np.zeros((3, 1))

# 4. 运行梯度下降
alpha_multi = 0.1
iters_multi = 500
theta_multi_learned, cost_hist_multi = gradient_descent(X_multi_b, y_multi, theta_init_multi, alpha_multi, iters_multi)

print(f"\n学习到的参数 (标准化后特征空间): {theta_multi_learned.flatten()}")

现在得到的 $\theta$ 是针对标准化后的特征 $X'$ 的。如果我们想得到针对原始特征 $X$ 的模型参数,需要进行转换。回忆一下,标准化是 $X' = (X - \mu) / \sigma$。我们的模型是:

$\hat{y} = \theta_0' + \theta_1' X_1' + \theta_2' X_2' = \theta_0' + \theta_1' \frac{X_1 - \mu_1}{\sigma_1} + \theta_2' \frac{X_2 - \mu_2}{\sigma_2}$

将其整理成 $\hat{y} = \theta_0 + \theta_1 X_1 + \theta_2 X_2$ 的形式:

$\theta_1 = \theta_1' / \sigma_1$ $\theta_2 = \theta_2' / \sigma_2$ $\theta_0 = \theta_0' - \theta_1' \frac{\mu_1}{\sigma_1} - \theta_2' \frac{\mu_2}{\sigma_2}$

# 将标准化特征空间的参数转换回原始特征空间
theta1_original = theta_multi_learned[1] / sigma_multi[0]
theta2_original = theta_multi_learned[2] / sigma_multi[1]
theta0_original = theta_multi_learned[0] - theta_multi_learned[1] * mu_multi[0]/sigma_multi[0] - theta_multi_learned[2] * mu_multi[1]/sigma_multi[1]

theta_original = np.array([[theta0_original[0]], [theta1_original[0]], [theta2_original[0]]])
print(f"转换回原始特征空间的参数: {theta_original.flatten()}")
print(f"真实生成参数: [30, 5, 10]")

对比一下,转换后的参数应该非常接近我们生成数据时使用的真实参数 [30, 5, 10]。这个转换步骤在实际部署模型时必不可少,因为你预测新数据时,输入的是原始特征值。

实现多元线性回归后,一个很自然的问题是:如何评估模型的好坏?除了看代价函数,在训练集上我们还可以计算决定系数 $R^2$,它表示模型对目标变量方差的解释比例,越接近1越好。

def r2_score(y_true, y_pred):
    """
    计算决定系数 R^2。
    """
    ss_res = np.sum((y_true - y_pred) ** 2)
    ss_tot = np.sum((y_true - np.mean(y_true)) ** 2)
    r2 = 1 - (ss_res / ss_tot)
    return r2

# 计算训练集上的预测和R^2
y_pred_train = X_multi_b.dot(theta_multi_learned)
train_r2 = r2_score(y_multi, y_pred_train)
print(f"模型在训练集上的 R^2 分数: {train_r2:.4f}")

一个接近1的 $R^2$ 分数(例如 > 0.9)表明模型拟合得很好。但要注意,这只是在训练集上的表现。为了评估模型的泛化能力,我们必须使用未参与训练的验证集或测试集。这引出了机器学习中另一个核心概念——训练/验证/测试集划分,以及防止过拟合的正则化技术,这些将是构建健壮模型的下一个关键步骤。不过,基于我们当前的目标,你已经成功地将线性回归的理论完整地实现为了可运行的代码,并理解了从数据准备、算法实现到结果评估的完整链路。下次当你看到线性回归的公式时,脑海中浮现的将不再只是符号,而是一行行可以构建出预测世界的代码。

保姆级教程:用Python3.6复现吴恩达机器学习课后作业(附完整代码与避坑指南) 本文提供了一份保姆级教程,详细讲解如何用Python3.6复现吴恩达机器学习课后作业,涵盖环境配置、代码实现与实战避坑指南。通过对比Octave与Python的差异,帮助读者掌握现代Python数据科学生态中的最佳实践,并附完整代码与常见问题解决方案。 阅读详情

相关推荐

Zynq远程更新程序实战:从emmc到flash的完整方案解析

本文详细解析了Zynq远程更新程序的完整方案,重点探讨了从emmc到flash的实战操作。通过硬件连接限制破解、emmc配置技巧、flash擦写策略优化等关键技术点,提供了可靠的远程更新解决方案,特别适合需要频繁更新boot.bin的应用场景。

weixin_29163797的博客 179

告别Octave!用Python 3.6+复现吴恩达机器学习课后作业全攻略

本文详细介绍了如何使用Python 3.6+复现吴恩达机器学习课程的课后作业,替代传统的Octave实现。通过NumPy和Pandas等现代工具,优化算法性能并提升代码可读性,涵盖环境配置、核心算法重构及调试技巧,助力开发者高效掌握机器学习实战技能。

weixin_28743405的博客 301

SCCM部署教程:(3)SCCM安装

这两则摘要介绍了WSUS和SCCM的安装步骤: WSUS安装:通过服务器管理器添加"Windows服务器更新服务"角色,选择SQL数据库并指定安装路径,验证数据库连接后完成安装。 SCCM安装:先运行预检工具Prereqchk.exe,选择主站点安装类型,配置语言、站点代码和名称,设置SQL数据库连接参数(保留默认端口4022),选择通信方法和系统角色(管理点和分发点),最后完成约1小时的安装过程。 两则安装指南都强调要确保数据库配置与前期准备一致,并提供了关键配置选项的说明。

小V锅的专栏 919

吴恩达机器学习课程代码作业-Python版本

吴恩达老师的机器学习课程作业是MATLAB版本(Octave)的,现在有点过时了,我参考了几位大牛的代码,将作业改成了Python3.6版本,并做了中文注释,推荐使用jupyter notebook。Python作业使用了原版数据,计算结果基本与Octave版本一致,不能在线提交作业,仅用于学习。原版作业内容:Programming Exercise 1: Linear RegressionPr...

fengdu78的博客 1046

openwrt编译及第一个安装包教程

Date: 2017.03.14 Made:SuperDeverloper Email: na1206@live.com Target: For mt7688 based board说明:本人在学习过程中走了不少弯路,希望本文档能为后来者提供便利。欢迎复制和使用本文档。本文档记录了搭建openwrt编译环境以及快速创建ipk包(openwrt上的安装程序)。本文档在实际应用中做过几次修改,以帮

SuperDevloper的博客 1万+

【COMSOL】修改内置物理场方程 模拟水沸腾的蒸汽泡运动

在COMSOL中通过弱贡献(weak contribution)节点,可以向任何内置模型方程中添加约束。这里,以模拟水沸腾的蒸汽泡运动为例,来讲一讲当我们研究的方程与模块方程不一样时,应该怎么增加新的贡献项。

u012161192的博客 9013

吴恩达机器学习课程实战:用Python手把手实现线性回归(含数据集+代码)

本文通过Python实战,手把手教你实现吴恩达机器学习课程中的线性回归算法。内容涵盖从环境搭建、数据准备到单变量/多变量梯度下降的完整代码实现,并深入讲解了特征缩放、多项式特征、正则化等关键工程细节,帮助你打通从理论到实践的最后一公里。

ol7890123的博客 195

以太网_RGMII接口与GMII接口的转化_03

RGMII接口转GMII接口!

weixin_42499230的博客 379

用Python复现吴恩达机器学习:线性回归与逻辑回归的实战代码解析

本文通过Python和NumPy从零实现吴恩达机器学习课程中的线性回归与逻辑回归模型,深入解析了梯度下降、向量化编程、特征缩放及正则化等核心概念。文章提供了完整的实战代码,帮助读者跨越理论与实践的鸿沟,掌握监督机器学习的基础算法与优化技巧。

weixin_29053695的博客 394

在 SAP S/4HANA 本地部署和私有云里预览 RAP Travel App:为什么 ADT 发不出去,以及如何用 /IWFND/V4_ADMIN 正确发布 OData V4 Service

在SAP S/4HANA On-Premise/Private Cloud环境中,通过ADT直接发布RAP服务的本地端点常会失效。这是因为系统治理策略要求必须通过SAP Gateway Foundation(事务码/IWFND/V4_ADMIN)发布Service Group,而非开发者本机测试模式。本文详解了该流程的必要性:Service Group是OData V4服务的发布单元,涉及后端登记(/IWBEP/V4_ADMIN)和前端发布(/IWFND/V4_ADMIN)两个环节。提供了从ADT跳转SAP

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 270

SAP Build Work Zone standard edition 订阅报错 OIDC trust missing 的成因与完整解决路径

摘要:用户订阅SAP Build Work Zone时遇到422错误,提示未配置OpenID Connect信任。该错误表明业务用户需通过SAP Cloud Identity Services的OIDC协议认证,而当前子账户仅配置了SAML信任或未配置信任。解决方法是进入子账户的Trust Configuration页面,使用Establish Trust功能建立与SAP Cloud Identity Services的OIDC信任关系。这是SAP新版服务的强制要求,SAML协议已不被支持。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 197

吴恩达机器学习ppt_带你少走弯路:五篇文章学完吴恩达机器学习

本文是吴恩达老师的机器学习课程[1]的笔记和代码复现部分,这门课是经典,没有之一。但是有个问题,就是内容较多,有些内容确实有点过时。如何在最短时间学完这门课程?作为课程的主要翻译者和笔记作者,我推荐把精华部分进行学习,这样进度会快一点。作者:黄海广[2]时间不多的朋友可以按照以下五篇文章的笔记和作业代码(原课程作业是 OCTAVE的,这里是复现的 Python 代码)进行学习,快速入门机器学习,避...

weixin_39933438的博客 821

基于Simulink进行步进电机的重复控制仿真建模

目的:通过引入一个周期延迟环节来补偿系统的周期性误差,从而提高系统对周期性参考信号或扰动的跟踪性能。方法内部模型原理:在控制器中嵌入一个与周期性信号相关的模型(例如周期延迟环节),以实现对周期性误差的零稳态误差控制。滤波器设计:为了避免高频噪声放大,通常会在重复控制器中加入低通滤波器。优势对周期性信号具有良好的跟踪性能。不需要精确的数学模型即可实现高性能控制。挑战:需要合理设计重复控制器的参数以避免系统不稳定。

MHD0815的博客 382

带你少走弯路:五篇文章学完吴恩达机器学习

本文是吴恩达老师的机器学习课程[1]的笔记和代码复现部分,这门课是经典,没有之一。但是有个问题,就是内容较多,有些内容确实有点过时。如何在最短时间学完这门课程?作为课程的...

zandaoguang的博客 681

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【机器学习】吴恩达机器学习视频作业-线性回归

前言 机器学习,很多人都想入门,但是总感觉自己基础太薄弱,数学难,难入上青天,其实有大学的数学基础,然后肯花时间,慢慢入门,再到人们常说的“精通”是可以的,主要看你的目标在哪?如果是一个掉包侠,了解相关参数,及这些参数的作用就行了,如果多想一步,为什么,它们的优点在哪?它们的缺点在哪,我该如何优化,如何改进?那么就需要花费一些时间,要有一定的阅读国外文献能力(也就是英语阅读),了解前言的技术,要有...

让算法融入生活,改变生活! 651

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

吴恩达机器学习 ex1 python实现

吴恩达机器学习 ex1 python实现 ex1 python实现吴恩达机器学习 ex1 python实现1 简单练习输出一个5*5的单位阵2 单变量的线性回归2.1 读取数据、绘制散点图2.2 梯度下降2.2.1 公式2.2.2代价函数实现2.2.3梯度下降函数实现三、多变量线性回归3.1 特征归一化3.2多元线性回归梯度下降的使用3.3正规方程 1 简单练习 输出一个5*5的单位阵 A=np.eye(5) A #结果: array([[ 1., 0., 0., 0., 0.],

qq_44854646的博客 419

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

吴恩达机器学习作业(week1-4)

公式根据吴恩达老师的课总结的题目复制来自_cv吴彦祖数据集(ladykaka007):链接:https://pan.baidu.com/s/1L-Tbo3flzKplAof3fFdD1w 密码:oin0代码跟着b站ladykaka007敲的。

niananjy1的博客 543

吴恩达机器学习课程资源全解析:从笔记、视频到Python实战,一站式获取指南

本文全面解析吴恩达机器学习课程资源,包括视频、笔记及Python实战作业。课程以零基础友好著称,涵盖监督学习、无监督学习等核心知识点,并提供多种格式笔记资源。特别推荐Python复现作业,提升技能迁移性和就业优势,适合机器学习入门者一站式学习。

weixin_30421809的博客 150

python复现吴恩达机器学习线性回归作业中的三维图

刚开始学习ML和python,复现一个三维图也用了相当几个小时,在已获取到的一维下降序列和三维图需输入的二维数据之间迷惑了一下 ,最后还是参考作业的思路使用嵌套循环获取二维数据。等到熟悉python之后或许有更优雅的方法来实现。 参考文章(表面图):https://www.cnblogs.com/xingshansi/p/6777945.html 作业中应实现的效果 代码 from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplo

YANHUA的博客 1687

避坑指南:用Python复现吴恩达机器学习作业时常见的5个错误(附代码修正)

本文总结了用Python复现吴恩达机器学习作业时常见的5个错误及其解决方案,包括维度不匹配、梯度下降不收敛、数值稳定性问题、神经网络维度混淆和反向传播梯度验证陷阱。通过详细的代码示例和修正建议,帮助学习者避免这些典型错误,提升机器学习实践能力。

weixin_33724046的博客 196

机器学习--吴恩达系列课程课后作业(1-单变量线性回归)

吴恩达机器学习课后作业详细讲解与分析,结尾附完整代码~

m0_64080654的博客 815

吴恩达最受欢迎AI课程机器学习Cousera《Machine Learning》课程完整版

百度网盘链接:https://pan.baidu.com/s/1jNvLV-dqO9DhkMsmmPlI8w 提取码: a644 内容说明: 1. 本课程简介:这门课基本涵盖了机器学习的主要知识点:线性回归、逻辑回归、支持向量机、神经网络、K-Means、异常检测等。课程中没有复杂的公式推导和理论分析,让机器学习初学者能够快速对整个机器学习知识点有比较整体的认识,非常方便初学者快速入门。 2...

Iron_man的博客 6348

避坑指南:用Python复现吴恩达机器学习作业时遇到的5个典型错误(附解决方案)

本文总结了用Python复现吴恩达机器学习作业时常见的5个典型错误及解决方案,包括特征缩放失效、学习率选择、正则化参数优化、决策边界可视化和梯度检验精度问题。针对每个问题提供可立即应用的代码修正方案,帮助学习者避开工程化陷阱,深入理解机器学习算法本质。

weixin_29181861的博客 235

吴恩达机器学习 2022 Python版:3个核心概念与2个实战项目代码解析

本文深入解析吴恩达2022年机器学习Python版课程的3个核心算法与2个实战项目,涵盖线性回归、逻辑回归及商业场景应用。课程全面转向Python技术栈,使用NumPy、scikit-learn等现代工具,提升工程实践效率。通过咖啡店利润预测和客户流失预警项目,展示机器学习在商业场景中的实际应用与优化技巧。

weixin_29038537的博客 383
上一篇: 生存分析中的C-index:从原理到应用,避开这些坑让你的模型更准确
下一篇: 避坑指南:Unity2019+安卓10视频播放的那些‘坑‘(附实测解决方案)
Python
博客等级 码龄26年 1973粉丝 1567原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值