PCA
本课属于 Coddy Machine Learning 学习旅程的“无监督学习”单元。第 26 课,共 51 课。
PCA 找出数据分布最分散的方向,然后找出与它成直角的最佳方向,以此类推:这些方向就是主成分。来看这组葡萄酒双胞胎数据:
每一行在前几个组件上的投影成为它的新特征:
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 会追踪数据的分散程度,因此单位较大的特征,比如数值达到数百的脯氨酸,仅凭数值大小就会占据优势:
挑战
中等水质实验室检测来自三个泉水源的瓶装水,每瓶测量 8 项指标。二维图能区分这些泉水源吗?draw_springs(ax, points)会按泉水源为任意二维点着色。
- 先对
X进行缩放,再用 PCA 将其降至 2 个主成分,并将结果存入points。 - 打印降维前后的特征数量。
- 用
draw_springs绘制这些点并显示图表。
对于另一个实验室,测量 6 项指标时:
From 6 features to 2Coddy 会描述你的图表。
亲手试试
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")
# 在下方编写你的代码
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
无监督学习中的所有课
自己练习: Python 在线编译器