Menu
CoddyTech

投影

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

投影会像影子一样,把每个点垂直投到一条直线上。这里是“特征太多”中的葡萄酒双胞胎,以它们的均值为中心,分别投影到两条直线上:

两张图展示了相同的葡萄酒数据,蓝色点分布在中心周围。左图中,一条直线沿着点云延伸:橙色影子沿直线分散得很远,离散度为 1.14。右图中,一条直线穿过点云:影子聚集在一起,离散度为 0.30

沿着云带分布时,阴影保留了大部分分布特征,因此每种葡萄酒用一个数字就几乎能表达原来两个数字所表达的信息。

方向是两个平方和为 1 的数字,例如 (0.6, 0.8)。影子是加权和:

centered = X - X.mean(axis=0)
shadow = centered[:, 0] * 0.6 + centered[:, 1] * 0.8
print(round(shadow.std(), 3))

这会打印 1.136。最佳方向能保留最大的分散度。

challenge icon

挑战

中等

林务员希望每个松果用一个数字表示,而不是用长度和宽度。两个方向中,哪个能保留更多松果的分散程度?程序会读取两个方向,每个方向包含两个数字。

  1. 编写 spread_along(direction):计算松果在该方向上的投影的标准差。
  2. 打印两个方向上的分散程度,保留 3 位小数。
  3. 打印要保留的方向。

对于其他松果:

Along [0.6, 0.8]: spread 2.104
Along [0.8, -0.6]: spread 0.412
Keep [0.6, 0.8]

亲手试试

import numpy as np
import pandas as pd

# 一位林业工作者测量了 70 个松果的长度和宽度,单位为 cm
cones = pd.read_csv("cones.csv")
X = np.column_stack([cones["length_cm"], cones["width_cm"]])
first = [float(input()), float(input())]
second = [float(input()), float(input())]

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

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

无监督学习中的所有课

自己练习: Python 在线编译器