LR原理及Python实现

1. 什么是LR算法

LR(Logistic Regression)算法是一种经典的分类算法,属于监督学习的范畴。它是一种线性模型,用于估计某个事件发生的概率。

LR算法的核心思想是通过构建一个线性模型,将特征与目标变量之间的关系进行建模,然后利用该模型进行预测和分类。

2. LR算法的原理

LR算法的核心是逻辑函数(Logistic Function),也称为Sigmoid函数。逻辑函数将输入值映射到[0, 1]之间的概率值,可以表示为:

$$P(y=1|X) = \frac{1}{1+e^{-X}}$$

其中,$y$为目标变量,$X$为特征向量。

LR算法的目标是找到一组权重$W$,使得逻辑函数输出的概率与实际的目标变量值尽可能接近。具体来说,LR算法通过最大似然估计方法,利用训练数据集来估计模型的参数,使得带入模型的特征向量所对应的概率与实际的目标变量值的概率之间的差距最小。

3. LR算法的Python实现

下面我们通过一个实例来演示LR算法的实现过程。

首先,我们导入所需要的Python库:

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

接着,我们加载鸢尾花数据集并进行预处理:

iris = load_iris()
X = iris.data
y = (iris.target != 0)  # 将目标变量转换为二分类问题

然后,我们将数据集拆分为训练集和测试集:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

接下来,我们定义LR算法的模型类:

class LogisticRegression:
    def __init__(self, learning_rate=0.01, num_iterations=1000):
        self.learning_rate = learning_rate
        self.num_iterations = num_iterations
        self.weights = None
        self.bias = None

    def fit(self, X, y):
        num_samples, num_features = X.shape

        # 初始化权重和偏置
        self.weights = np.zeros(num_features)
        self.bias = 0

        # 梯度下降训练模型
        for _ in range(self.num_iterations):
            linear_model = np.dot(X, self.weights) + self.bias
            y_pred = self._sigmoid(linear_model)

            dw = (1 / num_samples) * np.dot(X.T, (y_pred - y))
            db = (1 / num_samples) * np.sum(y_pred - y)

            # 更新权重和偏置
            self.weights -= self.learning_rate * dw
            self.bias -= self.learning_rate * db

    def predict(self, X):
        linear_model = np.dot(X, self.weights) + self.bias
        y_pred = self._sigmoid(linear_model)
        y_pred_class = [1 if pred > 0.5 else 0 for pred in y_pred]
        return y_pred_class

    def _sigmoid(self, x):
        return 1 / (1 + np.exp(-x))

最后,我们使用训练集进行模型训练,并使用测试集进行模型评估:

model = LogisticRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)

accuracy = np.mean(y_pred == y_test)
print("Accuracy:", accuracy)

4. 类图

下面是LR算法的类图:

classDiagram
    class LogisticRegression {
        - learning_rate: float
        - num_iterations: int
        - weights: np.ndarray
        - bias: float
        + fit(X: np.ndarray, y: np.ndarray) : None
        + predict(X: np.ndarray) : np.ndarray
        - _sigmoid(x: np.ndarray) : np.ndarray
    }

5. 总结

LR算法是一种经典的分类算法,通过构建逻辑函数模型来估计目标变量的概率。LR算法的核心思想是通过最大似然