Menu
CoddyTech

PCA

本课属于 Coddy Machine Learning 学习旅程的“无监督学习”单元。第 26 课,共 51 课。

PCA 找出数据分布最分散的方向,然后找出与它成直角的最佳方向,以此类推:这些方向就是主成分。来看这组葡萄酒双胞胎数据:

经过缩放的葡萄酒双胞胎数据点形成一片向右上方延伸的云状分布,中心有两支红色箭头:较长的箭头表示主成分 1,沿着云状分布的方向;较短的箭头表示主成分 2,与云状分布的方向交叉

每一行在前几个组件上的投影成为它的新特征:

from sklearn.decomposition import PCA
scaled = StandardScaler().fit_transform(X)
points = PCA(n_components=2).fit_transform(scaled)
print(X.shape, points.shape)

对于全部 13 项葡萄酒测量数据,这会打印出 (178, 13) (178, 2)。

先进行缩放。PCA 会追踪数据的分散程度,因此单位较大的特征,比如数值达到数百的脯氨酸,仅凭数值大小就会占据优势:

178 种葡萄酒的两张 PCA 图。左图未进行缩放:三个品种混在一起,难以区分。右图先进行了缩放:形成了三个清晰的群组

challenge icon

挑战

中等

水质实验室检测来自三个泉水源的瓶装水,每瓶测量 8 项指标。二维图能区分这些泉水源吗?draw_springs(ax, points)会按泉水源为任意二维点着色。

  1. 先对 X 进行缩放,再用 PCA 将其降至 2 个主成分,并将结果存入 points。
  2. 打印降维前后的特征数量。
  3. 用 draw_springs 绘制这些点并显示图表。

对于另一个实验室,测量 6 项指标时:

From 6 features to 2

标题为 Spring Waters in 2D 的图表,横轴为第一个主成分,纵轴为第二个主成分:alpine 瓶装水位于左下方,volcanic 位于右下方,coastal 位于顶部,并带有图例

Coddy 会描述你的图表。

亲手试试

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

# 水质实验室:来自 3 处泉水的 120 瓶水,每瓶有 8 项测量数据
waters = pd.read_csv("waters.csv")
X = waters.drop(columns="spring")


# 绘制 2D 散点图,每处泉水为一组,并显示图例
def draw_springs(ax, points):
    for spring in ["alpine", "volcanic", "coastal"]:
        rows = (waters["spring"] == spring).to_numpy()
        ax.scatter(points[rows, 0], points[rows, 1], s=16, label=spring)
    ax.legend()


fig, ax = plt.subplots()
ax.set_title("Spring Waters in 2D")
ax.set_xlabel("First component")
ax.set_ylabel("Second component")

# 在下方编写你的代码
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

无监督学习中的所有课

自己练习: Python 在线编译器