Post

机器学习笔记

机器学习笔记

线性回归

0x01 什么是机器学习

从数据中寻找规律, 简历关系, 根据建立的关系去解决问题.

应用场景:

  • 数据挖掘
  • 计算机视觉
  • 自然语言处理
  • 证券分析
  • 医学诊断
  • 机器人
  • DNA 测序

获取数据, 自动求解数据关系, 在新数据上做预测.

分类:

  • 监督学习 (Supervised Learning)
    • 线性回归
    • 逻辑回归
    • 决策树
    • 神经网络
    • 卷积神经网络
    • 循环神经网络
  • 无监督学习 (Unsupervised Learning)
    • 聚类算法
  • 半监督学习 (Semi-supervised Learning)
  • 强化学习 (Reinforce Learning)

0x02 线性回归

定义

回归分析:

根据数据, 确定两种或两种以上变量间相互依赖的定量关系.

\[y = f(x_1, x_2, ..., x_n)\]

回归:

变量数:

  • 一元回归: $y = f(x)$
  • 多元回归: $y = f(x_1, x_2, … x_n)$

函数关系:

  • 线性回归: 回归分析中, 变量与因变量存在线性关系: $y = ax + b$
  • 非线性回归: $y = ax^2 + bx + c$

回归问题求解

1, 确定 P, A 间的定量关系

\[\begin{align} P = f(A) \\ y = ax + b \\ \end{align}\]

2, 寻找合理的 a, b

假设 x 为变量, y 为对应的结果. y' 为模型输出结果.

目标: y' 尽可能接近 y

\[\begin{align} minimize \{\sum_{i=1}^{m}(y'_i - y_i)^2\} \\ minimize \{\frac{1}{2m} \sum_{i=1}^m(y'_i - y_i)^2\}\\ \end{align}\]

梯度下降法

寻找极小值的一种方法. 通过向函数上当前点对应梯度 (或者近似梯队) 的反方向的规定步长距离点进行迭代所所, 直到在极小点收敛.

\[\begin{align} J = f(p) \\ P_{i+1} = p_i - a \frac{\theta}{\theta p_i}f(p_i) \\ \end{align}\]

Scikit-learn (SKLearn)

Python 中专门针对机器学习应用而发展起来的一款开源框架 (算法库), 可以实现数据预处理, 分类, 回归, 降维, 模型选择等常用的机器学习算法.

scikit-learn.org

1
2
pip install scikit-learn \
  -i https://pypi.tuna.tsinghua.edu.cn/simple

调用 Sklearn 求解线性回归问题

Regression (n. 衰退)

公式: $y = ax + b$

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from sklearn.linear_model import LinearRegression

## 寻找 a, b

lr_model = LinearRegression()
lr_model.fit(x, y)

# 展示 a, b

a = lr_model.coef_
b = lr_model.intercept_

# 预测
predictions = lr_model.predict(x_new)

评估模型表现

yy' 的均方误差 (MSE) (越小越好 ):

\[MSE = \frac{1}{m} \sum_{i=1}^{m}(y'_i - y_i)^2\]

R 方值 ($R^2$) (越接近1 越好):

\[R^2 = 1 - \frac{\sum_{i=1}^{m}(y'_i - y_i)^2}{\sum_{i=1}^{m}(y_i - y''_i)^2)} = 1 - \frac{MSE}{方差}\]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from sklearn.metrics import mean_squared_error, r2_score

MSE = mean_squared_error(y, y_predict)
R2 = r2_score(y, y_predict)

## 画图对比 y 和  y' 
from matplotlib import pyplot as plt
plt.scatter(y, y1)

## 画散点图
import matplotlib.pyplot as plt
plt.scatter(x, y)

## 多图
fig1 = plt.subplot(211)
plt.scatter(x1, y1)
fig2 = plt.subplot(212)
plt.scatter(x2, y2)

Appendix

This post is licensed under CC BY 4.0 by the author.