# regression **Repository Path**: lilihli/regression ## Basic Information - **Project Name**: regression - **Description**: 多元线性回归 - **Primary Language**: Go - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-10-16 - **Last Updated**: 2025-10-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # GO语言的多元线性回归库(Regression) 本库参考 https://github.com/sajari/regression 实现的一个基于 [Gonum](https://gonum.org/) 的轻量级线性回归分析 Go 库,支持普通最小二乘法(OLS)回归,并提供残差、统计指标(如 R²、调整 R²、标准误、t 值)以及方差膨胀因子(VIF)等诊断信息。 --- ## 功能特性 - ✅ 普通最小二乘法(OLS)线性回归 - ✅ 自动添加截距项(常数项) - ✅ 残差与预测值计算 - ✅ 回归统计量: - 决定系数(R²) - 调整后的 R² - 回归系数的标准误 - t 统计量 - ✅ 多重共线性诊断:方差膨胀因子(VIF) - ✅ 支持输入数据为行主序(每行一个样本)或列主序(每列一个变量) - ✅ 基于 QR 分解,数值稳定性高 --- ## 安装 确保已安装 Go 1.19+,然后运行: ```bash go get gonum.org/v1/gonum go get gitee.com/lilihli/regression ``` > 注意:本库依赖 `gonum.org/v1/gonum`,请确保已正确引入。 --- ## 快速开始 ### 1. 基础回归(仅系数) ```go package main import ( "fmt" "gitee.com/lilihli/regression" ) func main() { X := [][]float64{ {1.0, 2.0}, {2.0, 3.0}, {3.0, 4.0}, {4.0, 5.0}, } y := []float64{2.1, 3.9, 6.0, 8.1} result, err := regression.New(X, y).Run() if err != nil { panic(err) } fmt.Printf("截距: %.4f\n", result.Intercept) fmt.Printf("系数: %v\n", result.Coefficients) } ``` 输出示例: ``` 截距: -0.1000 系数: [1.0000 1.0000] ``` --- ### 2. 获取残差与预测值 ```go residual := ®ression.Residual{} result, err := regression.New(X, y).SetResidual(residual).Run() if err != nil { panic(err) } fmt.Println("预测值:", residual.Predictions) fmt.Println("残差:", residual.Residuals) ``` --- ### 3. 获取完整统计信息 ```go residual := ®ression.Residual{} stat := ®ression.Statistic{} result, err:= regression.New(X, y). SetResidual(residual). SetStatistic(stat).Run() if err != nil { panic(err) } fmt.Printf("R²: %.4f\n", stat.RSquared) fmt.Printf("调整 R²: %.4f\n", stat.AdjustedRSq) fmt.Printf("标准误: %v\n", stat.StdErrors) fmt.Printf("t 值: %v\n", stat.TValues) ``` --- ### 4. 计算 VIF(多重共线性诊断) ```go residual := ®ression.Residual{} stat := ®ression.Statistic{} vif := ®ression.VIF{} result, err := regression.New(X, y). SetResidual(residual). SetStatistic(stat). SetVIF(vif).Run() if err != nil { panic(err) } fmt.Printf("VIF: %v\n", vif.VIFs) // 注意:VIF 仅对自变量(不含截距)计算 ``` > ⚠️ VIF 值 > 10 通常表示存在严重多重共线性。 --- ## 输入数据格式说明 本库支持两种输入格式: ### 行主序(推荐):每行一个样本 ```go X := [][]float64{ {x11, x12, ..., x1p}, // 样本 1 {x21, x22, ..., x2p}, // 样本 2 ... } y := []float64{y1, y2, ..., yn} ``` 要求:`len(X) == len(y)` ### 列主序:每列一个变量(适用于从 CSV 或 DataFrame 转置后) ```go X := [][]float64{ {x11, x21, ..., xn1}, // 变量 1 的所有观测 {x12, x22, ..., xn2}, // 变量 2 的所有观测 ... } y := []float64{y1, y2, ..., yn} ``` 要求:`len(X[0]) == len(y)` 库会自动检测格式并正确处理。 --- ## 设计说明 - 采用 **Builder 模式**(链式调用)按需计算诊断信息,避免不必要的开销。 - 核心回归使用 **QR 分解**,比正规方程更稳定,能处理接近奇异的矩阵。 - VIF 计算通过 **协方差矩阵对角元** 优化,避免多次辅助回归,效率更高。 - 所有计算基于 Gonum,性能与数值精度有保障。 --- ## 错误处理 所有 `Run()` 方法均返回 `error`,常见错误包括: - `X` 或 `y` 为空 - 维度不匹配 - 设计矩阵秩亏(如完全共线性) - R 矩阵不可逆(内部 QR 分解失败) 建议始终检查 `err`。 --- ## 依赖 - [Gonum v1](https://github.com/gonum/gonum): 用于矩阵运算与统计函数 --- ## 许可证 MIT License