告别调包依赖:从零实现线性回归与逻辑回归模型
你是否还在依赖机器学习库(Machine Learning Library, MLL)的黑盒模型?是否想真正理解线性模型的数学原理与代码实现?本文将带你从零开始,用不到200行代码实现线性回归(Linear Regression)和逻辑回归(Logistic Regression),让你彻底掌握这两个基础但强大的算法。读完本文,你将能够:
- 理解线性模型的核心数学原理
- 掌握梯度下降(Gradient Descent)优化算法
- 实现带正则化的线性回归与逻辑回归
- 解决实际的回归与分类问题
线性模型:从数学公式到代码实现
线性模型是机器学习中最基础也最常用的模型之一,它通过对输入特征进行线性组合来预测输出结果。MLAlgorithms项目中的mla/linear_models.py文件提供了清晰简洁的实现,我们将以此为基础进行讲解。
核心架构:BasicRegression基类
项目采用面向对象的设计思想,将线性回归和逻辑回归的共同功能抽象到BasicRegression基类中。这个基类实现了梯度下降优化、正则化等核心功能,让代码更加简洁和可维护。
class BasicRegression(BaseEstimator):
def __init__(self, lr=0.001, penalty="None", C=0.01, tolerance=0.0001, max_iters=1000):
self.C = C # 正则化系数
self.penalty = penalty # 正则化类型:'l1'、'l2'或None
self.tolerance = tolerance # 收敛容忍度
self.lr = lr # 学习率
self.max_iters = max_iters # 最大迭代次数
self.errors = [] # 记录训练过程中的误差
self.theta = [] # 模型参数
# ... 其他初始化代码
线性回归:预测连续值
线性回归用于预测连续型输出变量,它的核心是最小化均方误差(Mean Squared Error, MSE)。在MLAlgorithms中,LinearRegression类继承自BasicRegression,并实现了相应的损失函数:
class LinearRegression(BasicRegression):
"""Linear regression with gradient descent optimizer."""
def _loss(self, w):
loss = self.cost_func(self.y, np.dot(self.X, w))
return self._add_penalty(loss, w)
def init_cost(self):
self.cost_func = mean_squared_error # 使用均方误差作为损失函数
逻辑回归:处理分类问题
逻辑回归虽然名字中带有"回归",但实际上是一种分类算法。它通过sigmoid函数将线性输出转换为概率值,适用于二分类问题:
class LogisticRegression(BasicRegression):
"""Binary logistic regression with gradient descent optimizer."""
def init_cost(self):
self.cost_func = binary_crossentropy # 使用交叉熵作为损失函数
def _loss(self, w):
loss = self.cost_func(self.y, self.sigmoid(np.dot(self.X, w)))
return self._add_penalty(loss, w)
@staticmethod
def sigmoid(x):
return 0.5 * (np.tanh(0.5 * x) + 1) # 数值稳定的sigmoid实现
实战指南:使用线性模型解决实际问题
了解了线性模型的实现原理后,让我们看看如何使用MLAlgorithms中的线性模型解决实际问题。项目的examples/linear_models.py文件提供了完整的使用示例。
线性回归:预测房价
下面是使用线性回归解决回归问题的示例代码:
def regression():
# 生成随机回归问题数据
X, y = make_regression(
n_samples=10000, n_features=100, n_informative=75,
noise=0.05, random_state=1111, bias=0.5
)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.25, random_state=1111
)
# 创建并训练模型
model = LinearRegression(lr=0.01, max_iters=2000, penalty="l2", C=0.03)
model.fit(X_train, y_train)
# 预测并评估
predictions = model.predict(X_test)
print("回归问题MSE:", mean_squared_error(y_test, predictions))
逻辑回归:客户流失预测
下面是使用逻辑回归解决分类问题的示例代码:
def classification():
# 生成随机分类问题数据
X, y = make_classification(
n_samples=1000, n_features=100, n_informative=75,
random_state=1111, n_classes=2, class_sep=2.5
)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.1, random_state=1111
)
# 创建并训练模型
model = LogisticRegression(lr=0.01, max_iters=500, penalty="l1", C=0.01)
model.fit(X_train, y_train)
# 预测并评估
predictions = model.predict(X_test)
print("分类问题准确率:", accuracy(y_test, predictions))
正则化:解决过拟合问题
在实际应用中,我们经常会遇到过拟合问题。MLAlgorithms提供了L1和L2两种正则化方法来解决这个问题:
def _add_penalty(self, loss, w):
"""Apply regularization to the loss."""
if self.penalty == "l1": # L1正则化(Lasso)
loss += self.C * np.abs(w[1:]).sum()
elif self.penalty == "l2": # L2正则化(Ridge)
loss += (0.5 * self.C) * (w[1:] ** 2).sum()
return loss
- L1正则化(Lasso):会产生稀疏权重,可用于特征选择
- L2正则化(Ridge):会使权重值普遍较小,提高模型泛化能力
梯度下降:优化模型参数
梯度下降是训练线性模型的核心算法,MLAlgorithms实现了标准的梯度下降过程:
def _gradient_descent(self):
theta = self.theta
errors = [self._cost(self.X, self.y, theta)]
cost_d = grad(self._loss) # 使用autograd计算梯度
for i in range(1, self.max_iters + 1):
delta = cost_d(theta) # 计算梯度
theta -= self.lr * delta # 更新参数
errors.append(self._cost(self.X, self.y, theta))
logging.info("Iteration %s, error %s" % (i, errors[i]))
# 检查收敛条件
error_diff = np.linalg.norm(errors[i - 1] - errors[i])
if error_diff < self.tolerance:
logging.info("Convergence has reached.")
break
return theta, errors
如何开始使用MLAlgorithms
要开始使用MLAlgorithms中的线性模型,只需按照以下步骤操作:
- 克隆项目仓库:
git clone https://gitcode.com/gh_mirrors/ml/MLAlgorithms
cd MLAlgorithms
- 安装依赖:
pip install -r requirements.txt
- 运行线性模型示例:
python examples/linear_models.py
总结与展望
线性模型虽然简单,但却是机器学习的基础。通过本文的讲解,你应该已经掌握了线性回归和逻辑回归的原理与实现。MLAlgorithms项目提供的实现不仅简洁易懂,而且包含了正则化、梯度下降等关键技术,能够解决实际问题。
未来,你可以尝试:
- 实现更多类型的线性模型(如弹性网络)
- 优化梯度下降算法(如使用动量法、自适应学习率)
- 将线性模型应用到自己的数据集上
希望本文能帮助你更好地理解线性模型,并启发你深入探索机器学习的更多领域!如果你觉得这篇文章有帮助,请点赞、收藏并关注,我们将持续推出更多机器学习算法的详解。
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00- QQwen3-Coder-Next2026年2月4日,正式发布的Qwen3-Coder-Next,一款专为编码智能体和本地开发场景设计的开源语言模型。Python00
xw-cli实现国产算力大模型零门槛部署,一键跑通 Qwen、GLM-4.7、Minimax-2.1、DeepSeek-OCR 等模型Go06
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin08
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00