会员专享
请先
登录,登录后可使用今日免费解锁;
开通会员后可解锁完整内容。
解题思路
训练集只减去自身均值,不按特征缩放。能量最大的方向是去均值矩阵的第一右奇异向量;测试样本减去同一个均值后再点乘它。
- 按列对 train 求平均,得到 μ。每条训练样本减去 μ,记为 Z。
- 对 Z 做奇异值分解 Z=PΣQT,取 v=QT[0]。numpy 的 svd 把奇异值从大到小排列,Vt 的第 0 行就是这个方向。
- 在 v 里找绝对值最大的分量,并列时取更靠前的下标。该分量为负,就把 v 整体乘以 −1。
- 解释方差比 ratio=σ12/∑jσj2。分子分母同时除以样本数 n 后结果不变,对应 ddof=0。总方差为 0 时记成 0。
- 测试投影是 (x−μ)⋅v。把 v、ratio 和投影都用 round(⋅,6) 收到六位小数,按 component、ratio、proj 的顺序写成一行 JSON,冒号和逗号后面不留空格。
题目内容
本题只允许借助 numpy。请对训练集做主成分分析,并且只保留能量最大的那一维,再向测试集汇报下面三项:
- 该方向的向量 v,长度等于特征维数 d
- 训练集落在这个方向上的方差比例 ratio
- 测试集各样本投到这个方向之后的坐标 proj
计算按下面的次序进行。
- 只减去均值,不要按每个特征再做缩放
- 训练集均值:μ=mean(train, axis=0)
- 去掉均值后的矩阵:Z=X−μ
- 测试样本投影时必须减这同一个 μ,即 (x−μ)⋅v
- 对去掉均值后的矩阵做奇异值分解,取出第一条右奇异方向
把 Z 分解成 Z=PΣQT。
方向取 v=QT[0]。
- 方向的正负按同一套规矩固定
v 和 −v 表示同一条轴。本题规定:
- 在 v 的各个分量中,找到绝对值最大的那个,记下下标 t;若有几个并列,取更靠前的下标
- 当 v[t]<0 时,令 v=−v
- 方差比例按样本个数平均,不做无偏修正(ddof=0)
- 总方差:E=n1i=1∑n∥xi−μ∥22
- 这条方向上的方差由最大奇异值给出:E1=nσ12
- 比例:ratio=EE1
输入描述
输入是单独的一行 JSON 文本:
{"train":[[...],[...],...],"test":[[...],[...],...]}
- train:共 n 条训练记录,一条里面放 d 个特征数,1<n<20,1<d<10
- test:另有 m 条待测记录,一条里面同样放 d 个特征数,1<m<20
- 各个位置都有数值,不会空缺
输出描述
输出也是单独的一行 JSON。三个键必须按 component、ratio、proj 这个次序出现,冒号紧后面和逗号紧后面都不要留空白:
{"component":[...],"ratio":0.123456,"proj":[...]}
- component:方向 v,长度是 d,每个数保留 6 位小数
- ratio:方差比例,保留 6 位小数
- proj:测试投影,长度是 m,每个数保留 6 位小数
补充说明
评测只接受 numpy,不要调用现成的主成分接口。每个小数先用 round 收到 6 位,再写入这一行 JSON。
样例1
输入
{"train":[[1,1],[2,2],[3,3],[4,4]],"test":[[0,0],[2.5,2.5],[5,5]]}
输出
{"component":[0.707107,0.707107],"ratio":1.000000,"proj":[-3.535534,0.000000,3.535534]}
说明
四条训练样本是 (1,1)、(2,2)、(3,3)、(4,4),均值 μ=(2.5,2.5)。去掉均值后,四点落在同一条对角线上,方向是单位向量 (22,22),收到六位小数就是 0.707107,0.707107。两个分量绝对值相同,更靠前的下标是 0,而且该分量为正,不用取反。
到均值的平方距离之和是 4.5+0.5+0.5+4.5=10,总方差为 10/4=2.5,并且全部落在这条方向上,所以 ratio=1.000000。
测试样本 (0,0)、(2.5,2.5)、(5,5) 减去均值后,与方向点乘再收到六位小数,得到 −3.535534、0.000000、3.535534。
样例2
输入
{"train":[[0,0],[4,1],[0,8],[4,9]],"test":[[2,4],[0,9]]}
输出
{"component":[0.080830,0.996728],"ratio":0.806474,"proj":[-0.498364,4.323615]}
说明
这四条训练样本的均值是 (2,4.5)。第二维从 0 摆到 9,第一维只在 0 与 4 之间,所以方向几乎贴着第二维。四点并不共线,ratio=0.806474。
(2,4) 减去均值后是 (0,−0.5),点乘再收到六位小数为 −0.498364。(0,9) 减去均值后是 (−2,4.5),点乘再收到六位小数为 4.323615。