1. 迭代法
适合场景:
- 不能一次搞定的问题
- 分成很多步来逐步解决
KMeans 聚类算法
Linear / Logistic Regression 线性回归、逻辑回归
三个关键点:
- 1. 随机的开始(random, rough start)
- 随机 = 普适
- 2. 逐步变好的策略(optimize)
- step by step
- 每天进步一天天
- 相信累积,相信长期主义
- 3. 退出条件(stop)
- 固定步数
- 误差限制
KMeans 算法:
- 使用最多、最简单易用的聚类算法。
- clustering聚类
- 本质:无标签的分类
- 没有标签,只有特征
- 只根据特征来进行分类
- 原来没有类别,需要你根据业务需要将样本分成几类
- 思想:物以类聚,人以群分
- 挨得近的看作一类,挨得远的看作另一类
- KMeans内涵:
- K:代表分类数量,K个类
- Means:
- Mean 均值
- s 多次,复数
- 迭代式算法跟随机的出生点是有关系的,存在一个小概率的不稳定
from sklearn.datasets import make_blobs
from matplotlib import pyplot as plt
# Generate isotropic Gaussian blobs for clustering
X, y = make_blobs(n_samples=1000,
n_features=2,
centers=4,
cluster_std=0.5,
random_state=0)
plt.scatter(x=X[:,0],y=X[:,1],c=y)
"""
分成4类
不管是有监督,还是无监督学习,sklearn api高度一致
"""
from sklearn.cluster import KMeans
#实例化对象
km = KMeans(n_clusters=4)
# 训练模型
km.fit(X=X,y=y)
km.cluster_centers_
plt.scatter(x=X[:,0],y=X[:,1],c=y)
plt.scatter(x=km.cluster_centers_[:,0],
y=km.cluster_centers_[:,1],
c="red",
marker="*")
在数据科学中,生成假数据fake data是一种重要的能力。
线性回归
- Linear
- 自变量和因变量都是一次方关系
- 因变量是自变量的线性组合
- 把每个自变量都乘上一个系数(权重),再加在一起
- weight w
- 乘到变量上,代表该变量的重要程度
- 有多少个变量,就有多少个权重
- 最后再加上一个公共的常量(偏置)
- bias b
- 加到最终结果上
- 有多少个最终的结果,就有多少个偏置
- 把每个自变量都乘上一个系数(权重),再加在一起
- y = wx + b
- y = kx + b
- f(x,y) = k1x + k2y + b
- Regression
- 预测连续型数据
- 房价预测:
- 线性回归:
- 假定:房价是由特征们的线性组合得到的
- 线性回归:
- 算法流程:
- 1. 随机初始化:w 和 b
- f = w1x1 + w2x2 +...w13x13 + b
- x和y是数据集里的,在这里w和b是变量,x和y是常量
- 2. 从训练集中,取出一批样本batch_X, batch_y
- 把特征batch_X代入模型,得到一个预测结果y_pred
- 此时,y_pred是w和b的函数
- 衡量预测结果和真实结果的误差
- loss = loss_fn(y_pred, batch_y)
- 预测的越差,误差越大;预测的越好,误差就越小;
- loss是y_pred的函数,y_pred又是w和b的函数
- loss是w和b的函数
- 误差的大小是受w和b的影响
- 模型变好,就是误差变小
- 数学问题:求函数的最 / 极小值
- 当w和b是多少的时候,loss可以取得最小值
- 综上所述,模型优化的问题,就变成了一个函数求最小值的过程。
- 把特征batch_X代入模型,得到一个预测结果y_pred
- 1. 随机初始化:w 和 b
如何求函数的最小值?
- 求y = F(x) 的最小值?
- 理论数学:
- 求导数 / 偏导
- 令导数/ 偏导等于零
- 解方程/组,得到疑似结果,再做进一步结果验证
- 样本不在模型上,在模型周围,所以这个理论数学在工程上是不可行的,我们需要用别的方法解决
工程上:
- 迭代法
- (随机)梯度下降法 SGD (Stochastic Gradient Descent)
import numpy as np
from matplotlib import pyplot as plt
def fn(x):
"""
定义函数
"""
return x ** 2
x = np.linspace(start=-5, stop=5, num=100)
"""
绘制图形
"""
plt.plot(x, fn(x))
plt.grid()
def dfn(x):
"""
求导函数
"""
return 2 * x
# 走一个固定的步数
steps = 1000
# 把步子压得小一点
learning_rate = 1e-2
# 1,随机的开始
x = np.random.randint(low=-1000, high=1001, size=(1,))
print(f"x的初始值: {x}")
# 2,迭代优化
for step in range(steps):
# 梯度下降法
x = x - learning_rate * dfn(x)
print(f"优化{step+1}步后, x的值: {x}")
print(f"x的最终值: {x}")