w
,让两类在这条线上分得更开。[0,1,...]
的列表输出。import sys
import json
import numpy as np
def main():
# 读取整行 JSON
raw = sys.stdin.read().strip()
data = json.loads(raw)
train = np.asarray(data["train"], dtype=float)
test = np.asarray(data["test"], dtype=float)
# 切分特征与标签
X = train[:, :-1]
y = train[:, -1].astype(int)
# ---- 1) 计算两类的均值向量 μ0, μ1 ----
X0 = X[y == 0]
X1 = X[y == 1]
mu0 = X0.mean(axis=0)
mu1 = X1.mean(axis=0)
# ---- 2) 类内散度矩阵 S_w 并做正则化 ----
# S_w = sum_i (x_i - μ_c)(x_i - μ_c)^T, c∈{0,1}
def scatter(Xc, muc):
D = Xc - muc # [n_c, d]
return D.T @ D
Sw = scatter(X0, mu0) + scatter(X1, mu1)
# 微正则化,避免奇异
eps = 1e-6
d = X.shape[1]
Sw_reg = Sw + eps * np.eye(d)
# ---- 3) 投影方向 w ----
# w = (Sw_reg)^(-1) (μ1 - μ0)
w = np.linalg.solve(Sw_reg, (mu1 - mu0))
# ---- 4) 预测规则 ----
# 先把训练两类的投影均值当作阈值参照
z0_mean = (X0 @ w).mean()
z1_mean = (X1 @ w).mean()
# 对测试样本:z = w^T x,谁更近就判为谁
z_test = test @ w
pred = (np.abs(z_test - z1_mean) < np.abs(z_test - z0_mean)).astype(int)
# ---- 5) 输出 ----
print(json.dumps(pred.tolist(), ensure_ascii=False))
if __name__ == "__main__":
main()
在仅使用 numpy/pandas 的前提下,手写实现 Flsher 线性判别分析 (Linear Dscrimlnant Analysis, LDA) 用于二分类;并对调试样本输出预测标签。
1.读取数据
train:二维列表;最后一列为标签 y∈[0,1],前m 列为数值待征,m≥1
test:二维列表;仅含特征,与训练集同维度
2.参数估计
设
类别均值 μc=Nc1∑vi=cXi
类内散度矩阵 SW=∑c=01∑vi=c(Xi−μc)(Xi−μc)T
为避免奇异,使用 SWreg=SW+10−6I
3.投影向量
W=(SWreg)−1(μ1−μ0)
4.分类准则
将样本投影到一维:z=WTX0
计算训练集中两类投影均值 m0,m1。
对任一样本 x ,预测规则固定为
yˊ={1,∣z−m1∣<∣z−m0∣}
yˊ={0,otherwise}
(即“谁更近选谁”,可消除 W 方向符号的不确定性。)
标准输入仅 1 行 JSON ,示例
{
"train":[[1,1,0]],
[1.1,1.2,0],
[5,5,1],
[5.2,5.1,1]],
"test":[[1,1]],
[5,5]]
}
- 训练集 n≥4 ,列数 m≥1
- 所有数值为整数/浮点数,无空行
仅输出一行:
[0,1]1
- 长度等于测试样本数
- 合法 JSON ,逗号后加空格
1.正则项 10−6I 必须加入 SW 对角以避免奇异
2.为确保通过测试用例,仅使用 numpy/pandas
输入
{"train":[[1,1,0],[1.1,1.2,0],[5,5,1],[5.2,5.1,1]],"test":[[1,1],[5,5]]}
输出
[0, 1]