机器学习笔记【Week1】

一、机器学习简介(Introduction)

什么是机器学习?

定义(Tom Mitchell)

“A computer program is said to learn from experience E with respect to some task T and performance measure P, if its performance on T, as measured by P, improves with experience E.”

要素示例
Task T识别垃圾邮件、识别人脸、预测房价等
Experience E历史邮件数据、历史房价数据
Performance P分类准确率、均方误差(MSE)等

与传统编程的区别:

编程方式输入模型输出
传统编程规则 + 数据人工设计的程序得出结果
机器学习数据 + 结果算法训练生成的模型模型进行预测

二、机器学习的分类

1. 监督学习(Supervised Learning)

  • 有输入 x 和已知输出 y
  • 目标:学习函数 f(x) ≈ y

任务类型

  • 回归:输出是连续值(如房价)
  • 分类:输出是离散类别(如垃圾邮件)

2. 非监督学习(Unsupervised Learning)

  • 只有输入 x,没有输出标签 y
  • 目标:发现数据内部结构,如聚类或降维

三、线性回归模型(Linear Regression)

什么是线性回归?

线性回归(Linear Regression)是一种回归算法,用于预测一个连续数值型输出(例如房价、工资等),假设输入变量 xxx 与输出 yyy 存在线性关系。

问题定义

根据输入变量 x 预测连续输出 y,例如房价预测。

假设函数(Hypothesis)

单变量线性回归的假设函数如下:

hθ(x)=θ0+θ1x h_\theta(x) = \theta_0 + \theta_1 x hθ(x)=θ0+θ1x
其中:

  • xxx:输入特征(如房屋面积)
  • yyy:真实标签(如房价)
  • hθ(x)h_\theta(x)hθ(x):模型预测值
  • θ0\theta_0θ0:偏置项(intercept)
  • θ1\theta_1θ1:权重系数(slope)

在 Python 中表示为:

def hypothesis(theta, x):
    return theta[0] + theta[1] * x

四、代价函数(Cost Function)

为什么要最小化代价函数(Cost Function)?

预测值和真实值会存在误差,我们需要一个方式来衡量“预测得好不好”。

衡量预测值与实际值偏差的函数:

J(θ)=12m∑i=1m(hθ(x(i))−y(i))2 J(\theta) = \frac{1}{2m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)})^2 J(θ)=2m1i=1m(hθ(x(i))y(i))2
mmm 是样本数量

该函数是一个关于 θ0,θ1\theta_0, \theta_1θ0,θ1凸函数(抛物面)

Python 实现:

import numpy as np

def compute_cost(X, y, theta):
    m = len(y)
    predictions = X @ theta
    errors = predictions - y
    return (1 / (2 * m)) * np.dot(errors.T, errors)

五、梯度下降算法(Gradient Descent)

为什么使用梯度下降法(Gradient Descent)?

代价函数 J(θ)J(\theta)J(θ) 是一个关于参数 θ\thetaθ 的二次函数图像(碗状),我们要找到那个最低点(最优参数):

梯度下降的思想:

  1. 随便选一组参数初始值(如 θ0=0\theta_0=0θ0=0, θ1=0\theta_1=0θ1=0
  2. 计算当前点的“斜率方向”(导数)
  3. 朝着函数下降最快的方向(梯度的反方向)更新参数
  4. 重复多次,直到收敛到最低点(代价函数几乎不变)

梯度下降是如何收敛的?

  • 如果学习率 α\alphaα 太大,可能“跨过了山谷”,导致震荡甚至发散;
  • 如果太小,虽然能收敛,但需要非常多次迭代;
  • 所以在实践中,一般尝试多个 α\alphaα,并可绘制 J(θ)J(\theta)J(θ) 的值随时间变化的曲线来观察收敛速度。

为什么加入 θ0\theta_0θ0(bias)项?

假设没有偏置项 θ0\theta_0θ0,那么模型强制通过原点。显然这不是普适的情况。

例如:

  • 面积为 0 平方米的房子,不一定价格是 0 万元。
  • 所以我们需要一个“可以整体平移”的能力,这就是偏置项的作用。

目标:最小化代价函数,找到最优参数 θ\thetaθ

梯度更新公式:

θj:=θj−α⋅∂∂θjJ(θ) \theta_j := \theta_j - \alpha \cdot \frac{\partial}{\partial \theta_j} J(\theta) θj:=θjαθjJ(θ)

  • α\alphaα:学习率,表示每一步更新的速度
  • 太小 → 收敛慢;太大 → 发散

导数告诉我们:该参数朝哪个方向走会让代价函数变小

在单变量线性回归中:
θ0:=θ0−α⋅1m∑(hθ(x(i))−y(i)) \theta_0 := \theta_0 - \alpha \cdot \frac{1}{m} \sum (h_\theta(x^{(i)}) - y^{(i)}) θ0:=θ0αm1(hθ(x(i))y(i))

θ1:=θ1−α⋅1m∑(hθ(x(i))−y(i))⋅x(i) \theta_1 := \theta_1 - \alpha \cdot \frac{1}{m} \sum (h_\theta(x^{(i)}) - y^{(i)}) \cdot x^{(i)} θ1:=θ1αm1(hθ(x(i))y(i))x(i)

Python 实现:

def gradient_descent(X, y, theta, alpha, iterations):
    m = len(y)
    cost_history = []

    for i in range(iterations):
        predictions = X @ theta
        errors = predictions - y
        gradients = (1 / m) * (X.T @ errors)
        theta -= alpha * gradients
        cost_history.append(compute_cost(X, y, theta))

    return theta, cost_history

示例:房价预测(数据 + 可视化 + 训练)

示例数据:

面积 x(平方米)价格 y(万元)
5015
7020
10030

Python 全流程实现:

import numpy as np
import matplotlib.pyplot as plt

# Step 1: 数据定义
X_raw = np.array([50, 70, 100])
y = np.array([15, 20, 30])
m = len(y)

# Step 2: 加上 x0 = 1(常数项)
X = np.c_[np.ones(m), X_raw]  # shape = (m, 2)
y = y.reshape(m, 1)
theta = np.zeros((2, 1))

# Step 3: 设置学习率和迭代次数
alpha = 0.0001
iterations = 1000

# Step 4: 梯度下降训练
theta, cost_history = gradient_descent(X, y, theta, alpha, iterations)

# Step 5: 输出结果
print("Learned theta:", theta.ravel())
print("Final cost:", compute_cost(X, y, theta))

# Step 6: 可视化拟合
plt.scatter(X_raw, y, color='red', label='Training data')
plt.plot(X_raw, X @ theta, label='Linear regression')
plt.xlabel("Area (sqm)")
plt.ylabel("Price (10k)")
plt.legend()
plt.grid(True)
plt.title("Linear Regression Fit")
plt.show()

# Step 7: 可视化代价函数下降过程
plt.plot(range(iterations), cost_history)
plt.xlabel("Iterations")
plt.ylabel("Cost J(θ)")
plt.title("Gradient Descent Cost Convergence")
plt.grid(True)
plt.show()

六、线性代数基础复习(为后续多变量线性回归做准备)

概念描述
向量一维数组,如 x=[x1,x2,...,xn]Tx = [x₁, x₂, ..., xₙ]^Tx=[x1,x2,...,xn]T
矩阵二维数组,如 X=[x(1);x(2);...]X = [x^{(1)}; x^{(2)}; ...]X=[x(1);x(2);...]
转置行列互换:X.T
矩阵乘法A @ B 表示矩阵点乘,要求形状兼容(如 A 是 m × n,B 必须是 n × 1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值