课程概述 Course Overview

在数据科学中有很多工具,但它们不会思考

The purpose of computing is insight, not numbers.
计算的目的是洞察,而不是数字
——Hamming

数据科学的生命周期

数据采样和概率 Data Sampling and Probability

采样

偏差:

  • 选择偏差:可能不包括或有利于特定的群体
  • 回应偏差:人们不会真实回答
  • 不回应偏差:人们不一定回答

有替换的随机取样:避免一个人被选到两次

简单随机取样:一个人可能被选到两次

在样本总量很大时,两者表现相似

二项式/多项式概率

Pandas

引入:

import pandas as pd

生成的是 DataFrame 类(类似于一张表):

elections = pd.read_csv("elections.csv")

DataFrame

这个类有丰富的API,这里只介绍其中的一部分

索引

elections.head(5):获取前五行;.tail 同理

loc 通过标签 label 选择物品,有行标签和列标签

loc 的参数可以是:

  • 列表:elections.loc[[87,25,179],["Year","Candidate","Result"]]
  • 切片:elections.loc[[87,25,179],"Popular vote":"%"],注意这里的对字符串的切片表示从 Popular vote% 的所有列
  • 值:elections.loc[[87,25,179],"Popular vote"]

同样可以只使用 : 来选取所有元素

iloc 使用数字(0-xx)选取物品

[] 只接受一个参数:

  • 行数字的切片
  • 列标签的列表
  • 单个列标签

在 pandas 中有三个基本数据结构:

  • Data Frame:二维数据表格
  • Series:一维数据
  • Index:行标签序列

可以把 Data Frame 视为有相同 Index 的 Series 的集合

行标签不一定要唯一,列标签一般唯一

使用 Series.to_frame() 可以把 Series 转为 DataFrame 类型

条件选择

因为支持用 bool 列表索引,可以写成:elections[elections["Party"] == 'Independent'] 表示选出所有符合的人物。支持更多运算符

还有一些函数可以用于筛选,如

  • .isin
  • ``.str.startswith`
  • .queryelections.query('Year >= 2000 and Result == "Win"'),类似于 SQL 的操作
    • @character 访问 python 变量

其它

.size.shape 同 Numpy

.describe() 统计了各列有用的值,包括数量、平均值、方差、最小值、25%、50%、75%、最大值

.sample(n) 随机取 n 行,默认是无重复的,可以使用 replace=True 改为有重复的

.value_counts() 计算 Series 中每个值的出现次数

Series.unique() 返回一个包括所有不重复的值的 Series

.sort_values() 给 DataFrame 排序,可指定的参数有 ascendingkeyby

添加、修改与删除

添加一列非常简单:babynames["name_lengths"] = babyname_lengthsbabynames DataFrame 中添加标签为 name_lengths 的一列,数据是 babyname_lengths

删除一列:babynames.drop("name_lengths", axis = 'columns')

修改:使用 mapbabynames["dr_ea_count"] = babynames["Name"].map(dr_ea_count)

groupby 和 agg

groupby原理

agg 之前显式选择列 fbn.groupby("Name")[["Count"]].agg(ratio_to_peak)

groupby 返回一个 DataFrameGroupBy 对象,agg 是其中之一生成 DataFrame 的方法,其它的还有

  • max:使用 max 函数聚合
  • size:使用每个子 frame 的大小创建一个新的 Series
  • filter:从原始 DataFrame 中复制一个新的,但只保留满足条件的行

Pivot Tables

babynames_pivot= babynames.pivot_table(
index='Year', # 行
columns='Sex', # 列
values=['Count','Name'],
aggfunc-np.max, # 分组操作
)

Pivot Tables

合并表格

merged = pd.merge(left= elections, right= male_2020_babynames, left_on= "First Name", right_on= "Name")

数据整理和 EDA Data Wrangling and EDA

  • 结构
    • 表格,矩阵
    • TSV,CSV,JSON
    • xml,txt
    • 定性 qualitative
    • 定量 quantitative
  • 粒度
  • 范围
  • 时效性
  • 可靠性

可视化 Visualization

目的:

  • 帮助你理解数据
  • 与别人交流结果

画条形图:

  • Series.bar

  • plt.bar

  • sns.countplot

图表类型

  • histogram

  • box plot

  • violin plot

  • scatter plot

    • contour plot
    • hex plot

KDE Kernel density estimation

  • 在每个数据点放一个 kernel(一般是高斯 kernel,即正态分布)
  • 标准化为 1
  • 将所有 kernel 加起来

颜色的选择

取对数等方法转变为线性关系

建模和简单线性回归 Modeling and Simple Linear Regression

线性回归是最小化平均平方误差估计的直线

相关系数 correlation rr 是 x 和 y 乘积的平均值,并标准化:

r=1ni=1n(xixˉσx)(yiyˉσy)r = \frac{1}{n} \sum_{i=1}^n (\frac{x_i - \bar{x}}{σ_x}) (\frac{y_i - \bar{y}}{σ_y})

协方差 covariance 1ni=1n(xixˉ)(yiyˉ)=rσxσy\frac{1}{n}\sum_{i=1}^n (x_i - \bar{x}) (y_i - \bar{y}) = r σ_x σ_y

rr 表示了两个变量之间的线性,r<1|r| < 1,越接近 1 则线性程度越高,为正表示两个变量正相关

线性回归:

y^=a^+b^x\hat{y} = \hat{a} + \hat{b}x

b^=rσyσx\hat{b} = r\frac{σ_y}{σ_x}

a^=yˉb^xˉ\hat{a} = \bar{y} - \hat{b} \bar{x}

ei=yiy^ie_i = y_i - \hat{y}_i

模型 model 是一个系统的理想化表示

为什么要建模?

  • 理解复杂的现象
  • 对于未知的数据做出准确的估计

简单线性回归 Modeling and Simple Linear Regression (SLR) 是一个参数模型 parametric model,即可以基于数据选择最好的斜率和截距的参数

符号 含义 符号 含义
yy 真实观察值 y^\hat{y} 估计值
θθ 模型参数 θ^\hat{θ} 最优参数(定义最优

建模过程:

  1. 选择模型
  2. 选择损失函数
  3. 填充模型
  4. 估计模型表现

损失函数 loss function 特征化错误

平方损失:L(y,y^)=(yy^)2L(y, \hat{y}) = (y - \hat{y})^2

绝对值损失:L(y,y^)=yy^L(y, \hat{y}) = |y - \hat{y}|

平均损失:R(θ)=1ni=1nL(yi,y^i)R(θ) = \frac{1}{n} \sum_{i=1}^n L(y_i, \hat{y}_i),其揭示了模型与数据的符合程度

通过求导的方法求出最优解中的 b

通过可视化等方法评估模型的好坏

常数模型,损失和转换 Constant Model, Loss, and Transformations

估计 estimation 是使用数据决定模型参数的工作

预计 prediction 是使用模型预计未知数据的工作

常数模型

y^=θ\hat{y} = θ

通过最小平方可以得出 θ^=yˉ\hat{θ} = \bar{y}

常数模型与线性回归模型比较:

  • 常数模型:
    • θθ 是一维的
    • 损失表面是二维的
    • 预计轴须图 rug plot
  • 线性回归模型:
    • θθ 是二维的
    • 损失表面是三维的
    • 预计散点图

如果使用绝对值损失,则 θ^=median(y)\hat{θ} = median(y)

MSE vs MAE

对比两个损失函数,不难发现:

  • MSE
    • 光滑
    • 对异常值敏感
  • MAE
    • 分段
    • 对异常值鲁棒

安斯库姆四重奏 Anscombe's quartet:有四组数据,它们的均值,方差,协方差都相同,但是分布大相径庭,即可视化很重要

安斯库姆四重奏

Tukey-Mosteller Bulge Diagram:图像向那个方向弯,就使用哪个方向的函数

Tukey-Mosteller Bulge Diagram

多重线性回归:

y^=θ0+θ1x1++θpxp\hat{y} = θ_0 + θ_1 x_1 + ⋯ + θ_p x_p

通常最小二乘法 Ordinary Least Squares

使用线性代数,期望向量写成:

Y^=Xθ\hat{Y} = X θ

最小二乘法估计:

R(θ)=1nYXθ22R(θ) = \frac{1}{n} ||Y- X θ||^2_2

通过投影等方法可以解得:

θ^=(XTX)1XTY\hat{θ}= (X^TX)^{-1}X^TY

梯度下降 sklearn Gradient Descent, Sklearn

引入线性回归:from sklearn.linear_model import LinearRegression

创建一个模型:model = LinearRegression()

填入模型:model.fit(df[['total_bill']], df['tips'])

预期参数:model.predict(df[['total_bill']])

可以通过:model.intercept_ 获取截距,model.coef_ 获取系数

多重线性回归同理

最小化任意一维函数:

from scipy.optimize import minimize
minimize(arbitrary, x0 = 6)

原理是每一步的都调整新的位置,不断朝下走

xi+1=xiαf(xi)x_{i+1} = x_i - α f^{\prime}(x_i)

选择不同的 α\alpha 以达到最好的效果

梯度下降,特征工程 Gradient Descent, Feature Engineering

对于多参数的,有:

\vec{θ}^{(t+1)} = \vec{θ}^{(t)} - α ∇_\vec{θ} L(\vec{θ}, X, \vec{y})

小捆梯度下降 Mini-batch grandient descent:使用数据的每一捆计算梯度,如使用数据的前 10% 计算梯度,调整参数;再用下一个 10% 计算并调整

一般选择的 batch 大小为 32 个点,在每个训练阶段都要对数据重新洗牌

梯度下降

梯度下降找到的是局部最小值,对于凸函数,总是能找到全局最小值

对于满足非线性的数据,使用非线性变化,如添加一个新的特征 x2=hp2x_2 = hp^2,再使用线性回归,得到的就是多项式的关系

特征工程 feature engineering 是将原始特征转化更有价值的特征的过程,有利于

  • 获取域知识
  • 使用简单线性模型表达非线性关系
  • 将非数字的特征编码为输入

特征函数 feature function:将 d 维输入转换为 p 为输入

XRn×dΦRn×pX ∈ R^{n × d} → Φ ∈ R^{n × p}

独热编码 one hot encoding:对于每个类别赋予 1,可以使用 get_dummies 函数

使用的多项式阶数越高,即复杂度 complexity 越高,对当前数据的拟合程度越高,即错误 error 越少,但过拟合 overfitting 越多,即方差 variance 越大

交叉验证,正则化 Cross Validation, Regularization

检测过拟合的方法:holdout method:将数据集中的一部分用于训练,剩余部分用于验证模型的准确性,注意要在分裂数据之前打乱数据

训练和验证误差图

选择验证集误差最小的模型复杂度

超参数 hyperparameter 是控制学习过程自身的一个值,即选择模型的参数

k 折交叉验证法 k-fold cross-validation:将数据分成 k 份,每次使用其中一部分作为验证集,其余部分训练模型,重复 k 次,取验证误差的平均值为该模型的验证误差

测试集 test set 是未知解的一般数据集

  • 训练集用于挑选参数
  • 验证集用于挑选超参数,即在不同模型中选择
  • 测试集用于最终提供一个无偏向的 MSE (均方误差)

测试误差通常与验证误差很接近

L2 正则化

L2 正则化 L2 regularization:模型的参数约束在原点周围的一个球,找出最小化

1ni=1n(yi(θ0+θ1ϕ1++θdϕd))2\frac{1}{n} \sum_{i=1}^n (y_i - (θ_0 + θ_1ϕ_1 + … + θ_dϕ_d))^2

其中 j=1dθj2Q\sum_{j=1}^d θ_j^2 ≤ Q

等价问题是找出最小的 θθ,使得

1ni=1n(yi(θ0+θ1ϕ1++θdϕd))2+αj=1dθj2\frac{1}{n} \sum_{i=1}^n (y_i - (θ_0 + θ_1ϕ_1 + … + θ_dϕ_d))^2 + α \sum_{j=1}^d θ_j^2

其中 α\alpha 是一个复杂度控制参数

可以使用 Ridge 类运行 L2 正则化

闭式解为

θ^ridge=(XTX+nλI)1XTY\hat{θ}_{ridge} = (X^T X + n λ I)^{-1} X^T Y

L1 正则化

L1 正则化 L1 regularization:模型的参数约束在原点周围的一个立方体,找出最小化

1ni=1n(yi(θ0+θ1ϕ1++θdϕd))2\frac{1}{n} \sum_{i=1}^n (y_i - (θ_0 + θ_1ϕ_1 + … + θ_dϕ_d))^2

其中 j=1dθjQ\sum_{j=1}^d |θ_j| ≤ Q

等价问题是找出最小的 θθ,使得

1ni=1n(yi(θ0+θ1ϕ1++θdϕd))2+αj=1dθj\frac{1}{n} \sum_{i=1}^n (y_i - (θ_0 + θ_1ϕ_1 + … + θ_dϕ_d))^2 + α \sum_{j=1}^d |θ_j|

可以发现与 L1 和 L2 误差有关联

可以使用 Lasso 类运行 L1 正则化

无闭式解

概率 Probability

如果 IID 变量的尺寸大小 n 很大,则样本分布的概率接近于正态分布N(μ,σ/n)N(μ, σ / \sqrt{n})

预期 prediction 是使用模型预期未知的数据

推理 Inference 是使用模型得出特征和回应的真实关系

推理:关于仅给定一个随机的样本,得出总体参数的结论

参数、统计、估计

对于一个新的独立点(x,Y),模型风险 model risk 是平均平方预期误差

modelrisk=E[(YY^(x))2]model risk = \operatorname{E}[(Y - \hat{Y}(x))^2]

模型风险由三个部分组成:

  • 观察方差 observation variance:因为测量技术有限,所以真实的 Y 和测量值之间有 noise,即 Y=g(x)+σY = g(x) + σ 其中 σσ 是随机误差,故观察方差为 σ2σ^2
  • 模型方差 model variance:模型建立在随机样本上,所以若样本不同,则模型不同,模型方差 = Var(Y^(x))\operatorname{Var}(\hat{Y}(x)),其主要来源是过拟合
  • 模型偏差 model bias:预期值和真实 g(x)g(x) 的差异,即模型偏差 = E[Y^(x)]g(x)\operatorname{E}[\hat{Y}(x)] - g(x),其主要来源是欠拟合

得出等式:

模型风险 = 观察方差 + (模型偏差)^2 + 模型方差

E[(YY^(x))2]=σ2+(E[Y^(x)]g(x))2+Var(Y^(x))\operatorname{E}[(Y - \hat{Y}(x))^2] = σ^2 + (\operatorname{E}[\hat{Y}(x)] - g(x))^2 + \operatorname{Var}(\hat{Y}(x))

如果模型的复杂度增加,则模型方差增大;若复杂度减小,则模型偏差增大,这就是测试误差会先减小后增大的原因

对于线性关系,如果系数 θ1θ_1 为 0,则表示结果和 x1x_1 没关系

假设测试:零假设:真正的 θ1θ_1 为 0

若一个特征能够通过另一个特征的一个线性函数精确预期,则这个特征和那个特征共线性 collinearity,此时该模型无效

SQL

数据库优点:

数据存储:

  • 可靠存储
  • 优化无法放入内存的数据的计算
  • 使用特殊数据结构提高性能

数据管理:

  • 配置了数据的逻辑组织和访问权限
  • 保障数据
    • 防止数据异常
    • 保证对数据的并发操作的安全

加载 SQL 模块:%load_ext sql

使用 SQL 命令:%%sql

SQL表

SQL 表的每个列都有三个属性:列名 colName类型 Type,和 0 个或多个约束 constraints

主键 primary key 用于所有的优化,不能重复

SQL 语句格式:

SELECT <column expression list>
FROM <table>
[WHERE <predicate]
[GROUP BY <column list>]
[HAVING <predicate>]
[ORDER BY <column list>]
[LIMIT <number of rows>]
[OFFSET <number of rows>]

选择时可以使用 AS 取别名,如:SELECT cute AS cuteness, year AS birth FROM Dragon;

连接条件用 ANDNOTOR

COUNT(*) 返回行数

排序:ORDER BY cute DESC

  • 降序 DESC
  • 升序 ASC

取前几个使用 LIMIT number

不从第一个开始取可以使用 OFFSET n

筛选:

  • 行:WHERE
  • 组:HAVING

DISTINCT 去掉相同的项,如 SELECT DISTINCT type, cost FROM Dish;

使用 sqlalchemy 库使用 SQL 命令

  • 创建一个 sqlalchemy engine
  • 调用 engine.connect() 连接
  • pd.read_sql(SQL 命令, connection),返回一个 dataframe

LIKE 关键词类似于简单的正则表达式,用于匹配,如 LIKE '%:00%' 用于匹配 8:00

CAST 类似强制类型转换,如 CAST(runtimeMinutes AS int)

表之间的join

另一种内部join

如果什么都不做,如 SELECT * FROM s, t; 则新的表相当于两个表的笛卡尔积

所以内部 join 相当于去掉了错误行的交叉 join

左外部 join:让左边表的每个行出现在结果中,无论是否匹配,如 SELECT * FROM s LEFT JOIN t ON s.t = t.v;

左外部join

右外部 join 同理

当然,也可以使用条件而不是相等来 join,如 SELECT * FROM student, teacher WHERE student.age > teacher.age;

主成分分析 PCA Pricipal Component Analysis

矩阵乘法的两种解释:

  • 操作
  • 坐标变换

矩阵分解:一个矩阵不能分解成秩小于原矩阵的两个矩阵

奇异值分解将矩阵分解为两个矩阵:

  • 左矩阵 Uσ 和原矩阵的维度相同
  • 右矩阵 VTV^TUσ 变换回 X

我们发现,去掉 Uσ 的最后一列后变换回去的矩阵和原矩阵非常相似

  • σσ 是一个对角矩阵,对角线上的值由 X 的奇异值组成,且逐渐下降
  • U 和 V 的列都是单位正交集
  • Uσ 的列有一个名字:主成分 Pricipal Components

要先把每一列减去其平均值,也就是把数据中心化,因为 PC 一定是过原点的

第一维 PC 给每个国家一个在直观坐标轴上的分数:

PC1

PC2 更难解释,表示在 PC1 线上多“上”或多“下”

PC2

定义数据的总方差 total variance 为每个属性的方差之和,每一个 PC 捕捉的方差为 (奇异值)2/N(\text{奇异值})^2/N

碎石图 scree plot:画出每个奇异值捕捉到的方差:

碎石图

主成分分析 Pricipal Component Analysis(PCA):将数据转入到一个新的坐标系,其最大的方差在一维,第二大的在二维,以此类推

回归最小化竖直(或水平)线的平均平方错误:

回归

SVD 找到了最小的投影误差:

SVD

PCA 对 EDA 的适用情况:

  • 在高维度可视化相似的团簇观察值
  • 仍然在探索数据(如果已经知道预期什么,不需要 PCA)
  • 有很多属性,但只有一些(可能未被观察到)的属性最大程度上决定了线性关心的剩余

逻辑回归 Logistic Regression

机器学习分类

回归和分类都是有监督学习 supervised learning

二项分类:

  • 两类
  • 回应 response y 不是 0 就是 1

可以发现,每个仓的 y 的平均值是一个概率:P(Y=1x)=bin 中 (y==1) 的数据点bin 中的总数据点P(Y = 1|x) = \frac{\text{bin 中 (y==1) 的数据点}}{\text{bin 中的总数据点}}

但这个概率不是一个线性模型,所以需要进行变化:

  • 比率 odd 不同于概率 Probability,它表示发生和不发生的比值,即 odds(p)=p1podds(p) = \frac{p}{1-p}
  • 注意到其可能是指数的,所以取对数即可变成线性的
  • 最终得出 sigmoid 函数,即:

σ(t)=11+etσ(t) = \frac{1}{1 + e^{-t}}

所以预期:

P^θ(Y=1x)=σ(xTθ)\hat{P}_θ(Y = 1 | x) = σ(x^Tθ)

逻辑函数光滑了从 0 到 1 的跳跃

线性回归用于 prediction,逻辑回归用于 classification

线性回归与逻辑回归

平方误差无法使用,因为:

  • 非凸
  • 有界(概率在 0 到 1 之间)
  • 概念上难以解释

交叉熵损失 cross-entropy loss

(ylog(p)+(1y)log(1p))(y\log(p) + (1-y)\log(1-p))

y 的两种情况分别对应两幅图:

交叉熵损失

LogisticRegression 模型的用法和线性回归相似

交叉熵损失实际上最大化训练数据的可能性,最优的 theta 就是将所有可能性“推向”真实的类

如果存在一个超平面,将输入特征 x 分成两类 y,则称该数据集线性可分 linearly separable

如果线性划分的话,该模型是过分自信的 overconfident

分类器的测量指标:

  • 精度 accuracy = 正确分类的点数 / 总点数

将结构分为四类:

混淆矩阵

  • accuracy = TP+TNn\frac{TP + TN}{n},表示正确区分的点数
  • precision = TPTP+FP\frac{TP}{TP + FP},表示当其为阳性时,分类器检测出来的概率
  • recall = TPTP+FN\frac{TP}{TP + FN},表示分类器对于阳性的敏感度

precision & recall

两者面临权衡取舍

  • 我们有时看着 precision,不能误判;有时重视 recall,宁错杀、不放过

分类门槛:

y^=classify(x)={1,P^θ(Y=1x)T0,otherwise\hat{y} =\operatorname{classify}(x) = \begin{cases} 1, \hat{P}_θ(Y=1|x) ≥ T \\ 0, otherwise \end{cases}

这个门槛影响着我们的选择

TPR=TPTP+FNTPR = \frac{TP}{TP + FN}

FPR=FPFP+TNFPR = \frac{FP}{FP + TN}

ROC(Receiver Operating Characteristic) 曲线对不同的分类门槛画出了 TRP - FPR 曲线

ROC

计算模型的 AUC(area under curve),最理想的情况是 AUC = 1,最坏情况是 AUC = 0.5(即随机选择)

决策树 Decision Trees

逻辑回归

创建时加入参数:LogisticRegression(multi_class = 'ovr'),其中 ovr 表示 one vs rest,即选择最大的那个

决策树 Decision Tree 是交替区分数据的方式:

决策树

决策树可视化

可以发现,直接使用决策树会导致过拟合,决策树能保证几乎每个点都分类正确,除了重叠的几个点

决策树过程图

对比 2 维和 4 维的决策树,可以发现 4 维的反而更简单,并不一定是维度越高越复杂

决策树生成算法:

  • 所有数据在根结点开始
  • 重复直到每个结点都是纯净的 pure不可分裂 unsplittable
    • 选择最好的特征 x 和最好的分裂值 β
    • 把数据分成 x<βx < βxβx ≥ β 两个结点

一个结点的熵:

S=cpclog2pcS = - \sum_c p_c \log_2 p_c

可以看到熵并不是递减的,但倘若加上权重,即加权熵 weighted entropy 为熵乘以该结点处的样本比例,这是递减的

所以最优选择的依据是 ΔWSΔ WS 最大

防止过拟合的方法:

  • 设置一个或多个规则防止树成长:不创建 ΔWS<0.01Δ WS < 0.01 的结点 min_impurity_decrease,限制树的最大深度 max_depth,不分裂 < 1 % 样本的结点 min_samples_split
  • 让树完全成长,然后砍掉树的一些分支:在创建树之前设定验证集,如果将一个结点用它最普通的预期替代对验证集错误没有影响,则不要分裂该结点

随机森林 random forest:控制方差,通过建立许多决策树并给它们投票

bagging:简单来说就是 bootstrap

  • 对训练数据使用 bootstrap 重采样
  • 对每个重采样建立模型
  • 最终模型 = 每个小模型的平均预期

但是 bagging 对减少模型方差不够,所以只在每个分裂处使用 m 个特征的一个样本,通常 m = sqrt(p)

随机森林算法:bootstrap 训练数据 T 次,对每个重采样:

  • 从一个结点开始数据,直到所有数据 pure
  • 选择一个 impure 结点
  • 选择 m 个特征的随机子集
  • 分裂

询问 T 个决策树的预期,选择大多数的

这个方法有两个超参数 T 和 m

这些想法都是启发性 heuristic 的,即无法证明最优,但确实有效

团簇 Clustering

有监督学习:目标是创造一个把输入映射到输出的函数,如回归和分类

无监督学习:目标是在未标记的数据中识别模式,如 PCA 和 团簇

K-平均团簇 K-mean clustering

  • 任选一个 k,随机取 k 个中心,每个有不同的颜色
  • 重复执行直到收敛:
    • 将每个点的颜色改为最接近的中心的颜色
    • 把中心移动到那个颜色的点群的中心

评估团簇结果的损失函数:

  • 惰性 inertia:每个点到它的中心的距离平方的和
  • 失真 distortion:每个点到它的中心的距离平方的加权

K-Mean 算法无法找到全局最优解的原因:两个优化器交替工作:

  • 第一个优化器保持中心位置不变,优化数据颜色
  • 第二个优化器保持数据颜色不变,优化中心位置

最优化惰性的算法:NP-Hard

层次聚类算法 agglomerative clustering

  • 开始时每个点都在它自己的团簇中
  • 连接两个邻近的团簇,直到剩下 K 个团簇

可以通过树状图 dendrogram 可视化合并的层次结构:

树状图

还有很多其他的团簇算法,有不同的结果:

团簇

选择 K:

肘方法 elbow method:对许多不同的 K 画出 inertia 图,选择“肘部”的 K

肘方法

轮廓系数 silhouette score 用于评估一个具体的数据点有多么“聚在一起”

  • 高得分:接近它的某聚类中的其它点
  • 低得分:远离它的聚类中的其它点
  • 对于一个点 X,得分 S=(BA)/max(A,B)S = (B-A) / \max(A, B),其中
    • $A = $ 聚类中其他点的平均距离
    • $B = $ 最近聚类中的其他点的平均距离
    • 可以看到 S 最大为 1,最小可能为负数

轮廓系数