SPSS与Python中Linear Discriminant Analysis系数结果不一致求助
SPSS与Python LDA结果差异问题及解决办法
问题背景
使用SPSS和Python(sklearn)对同一数据集执行线性判别分析(LDA)时,特征值与典型判别函数系数结果存在明显差异,但组均值相等检验结果一致,需明确差异原因并对齐结果。
相关代码与输出
SPSS部分
执行语法
DATASET ACTIVATE DataSet1. DISCRIMINANT /GROUPS=Gender(0 1) /VARIABLES=Height Width Div_Depth /ANALYSIS ALL /SAVE=CLASS PROBS /PRIORS EQUAL /STATISTICS=MEAN STDDEV UNIVF BOXM COEFF RAW CORR TABLE CROSSVALID /CLASSIFY=NONMISSING POOLED.
典型判别函数系数输出
- Height: 8.376
- Width: -.564
- Div_Depth: -6.201
- (Constant): -29.031
Python部分
执行代码
import pandas as pd from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA data = pd.read_excel("data.xlsx") X = data[["Height", "Width", "Div_Depth"]] y = data["Gender"] lda = LDA() lda_model = lda.fit(X, y) print("Canonical Discriminant Function Coefficients:", lda.coef_) print("Canonical Discriminant Function Constant:", lda.intercept_)
输出结果
- 典型判别函数系数:
[[-101.85246698 6.86029024 75.4023029 ]] - 常数项:
[353.00578148]
差异原因
SPSS与sklearn的LDA实现存在核心差异:
- 系数缩放规则不同:SPSS的典型判别函数系数会做标准化缩放(使函数的组间方差为1),而sklearn的
coef_直接基于类均值差与协方差矩阵的逆计算,未做额外缩放。 - 判别函数方向可反转:两者系数符号相反,是因为判别函数的方向不影响分类结果——反转符号后只需调整分类阈值,最终分类逻辑完全一致。
通过计算可验证:sklearn的系数与SPSS的系数呈固定比例关系(约为-12.16倍),说明仅为缩放与符号差异,本质判别逻辑一致。
解决方案
- 无需对齐的场景:若仅关注分类结果或判别函数的相对权重,无需调整——两者的分类准确率、组间区分能力完全一致。
- 需对齐SPSS结果的场景:将sklearn的系数与常数项除以比例系数(约-12.16),即可得到与SPSS完全一致的典型判别函数系数:
# 计算缩放比例(以Height系数为例) scale_factor = lda_model.coef_[0][0] / 8.376 # 缩放系数与常数项 aligned_coef = lda_model.coef_ / scale_factor aligned_intercept = lda_model.intercept_ / scale_factor print("对齐SPSS后的系数:", aligned_coef) print("对齐SPSS后的常数项:", aligned_intercept) - 验证分类一致性:可对比SPSS生成的分类结果(
/SAVE=CLASS)与sklearn的lda_model.predict(X),确认分类完全一致。
内容的提问来源于stack exchange,提问作者mdiramali
相关产品推荐
相关产品推荐

