logistic 回归

1.什么是logistic?

        Logistic指的是逻辑回归(Logistic Regression),它是一种用于解决分类问题的机器学习算法。尽管名字中包含"回归"一词,但逻辑回归实际上是一种分类算法,用于预测输入变量与一个或多个类别之间的关系。

        逻辑回归的主要思想是通过将输入特征的线性组合映射到一个概率范围(通常是0到1之间),然后根据这个概率进行分类。它使用逻辑函数(也称为Sigmoid函数)将连续的输入转换为0或1,从而实现二元分类。

        逻辑回归在许多领域得到广泛应用,如医学、生物统计学、社会科学等。它易于实现和解释,通常被用作分类问题的基准模型。虽然逻辑回归最初是为二元分类设计的,但它也可以扩展到多类别分类(multinomial logistic regression)。

2.logistic的数学原理

        1.基本假设:逻辑回归的基本假设是因变量(输出变量)与自变量(输入变量)之间存在一个线性关系。

        2.线性组合:通过对输入特征进行线性组合,得到一个分数(score),表示自变量对因变量的影响。线性组合可以表示为:
        Score = w0 + w1x1 + w2x2 + ... + wn*xn
        其中,w0, w1, w2, ..., wn 是权重(或系数),x1, x2, ..., xn 是输入特征。

        3.逻辑函数(Sigmoid函数):线性组合得到的分数需要经过逻辑函数(也称为Sigmoid函数)转换,将其映射到(0, 1)的概率范围内。Sigmoid函数的公式如下:
sigmoid(x) = 1 / (1 + exp(-x))
其中,exp(x) 表示e的x次方,e是自然对数的底数。

        4.预测概率:通过将线性组合的分数输入逻辑函数,得到一个在0到1之间的概率值。通常,大于等于0.5的概率值被认为属于正类(类别1),小于0.5的概率值被认为属于负类(类别0)。

       5.损失函数:为了训练模型,需要定义一个损失函数来衡量预测值与实际值之间的差异。逻辑回归中常用的损失函数是对数损失函数(Log Loss),也称为交叉熵损失函数。

        6.参数估计:通过最小化损失函数,使用梯度下降等优化算法来估计权重(系数)的值,使得模型能够更好地拟合训练数据,从而提高预测的准确性。

3.如何实现Sigmoid函数

       

         在logistic回归中,我们使用的激活函数如上图,使用这个函数的目的是将回归的结构把他映射到一个概率范围内,以便来做分类问题。

        用代码实现sigmoid函数

        

def sigmoid(x):
    return np.where(x > 0, 1.0 / (1.0 + np.exp(-x)), np.exp(x) / (1.0 + np.exp(x)))

 4.如何实现梯度下降

        先上代码!!!(下面提到的权重其实就是线性状态下的系数)

       for _ in range(self.num_iterations):
            linear_model = np.dot(X, self.weights) + self.bias
            y_pred = 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

        1.num_samples, num_features = X.shape:获取输入特征矩阵 X 的样本数和特征数。

        2.self.weights = np.zeros(num_features) 和 self.bias = 0:初始化权重和偏置项。在梯度下降算法中,需要从初始值开始迭代地更新参数。

        3.for _ in range(self.num_iterations)::进行指定次数的迭代,即执行梯度下降算法的更新步骤。

        4.linear_model = np.dot(X, self.weights) + self.bias:计算线性模型,即输入特征矩阵 X 与权重向量的点积,再加上偏置项。这一步得到的结果表示模型对样本的预测结果。

        5.y_pred = sigmoid(linear_model):将线性模型的结果通过 Sigmoid 函数进行转换,得到预测的概率值。

        6.dw = (1 / num_samples) * np.dot(X.T, (y_pred - y)):计算权重的梯度。这里利用了梯度下降算法中的损失函数关于权重的导数,根据导数的方向和大小来更新权重。

        7.db = (1 / num_samples) * np.sum(y_pred - y):计算偏置项的梯度。类似地,这里计算了损失函数关于偏置项的导数,用于更新偏置项。

        8.self.weights -= self.learning_rate * dw 和 self.bias -= self.learning_rate * db:根据梯度下降算法,利用计算得到的梯度信息,按照梯度的反方向更新模型的权重和偏置项。这里乘以学习率(learning rate)是为了控制每次参数更新的步长大小。

5.实现预测

        

    def predict_prob(self, X):
        linear_model = np.dot(X, self.weights) + self.bias
        y_pred = sigmoid(linear_model)
        return y_pred

    def predict(self, X, threshold=0.5):
        y_pred_prob = self.predict_prob(X)
        y_pred = np.zeros_like(y_pred_prob)
        y_pred[y_pred_prob >= threshold] = 1
        return y_pred

        predict_prob(self, X) 方法:这个方法用于对输入的特征矩阵 X 进行预测,并返回预测的概率值。具体步骤包括:

        1.计算线性模型:通过将输入特征矩阵 X 与权重向量相乘,再加上偏置项,得到线性模型的结果。

        2.将线性模型的结果通过 Sigmoid 函数进行转换,得到预测的概率值。
       

        predict(self, X, threshold=0.5) 方法:这个方法用于对输入的特征矩阵 X 进行预测,并返回最终的分类结果。具体步骤包括:

        1.调用 predict_prob 方法得到预测的概率值。
        2.根据设定的阈值(默认为 0.5),将预测的概率值转换为最终的分类结果。如果预测的概率值大于等于阈值,则将分类结果设为 1;否则设为 0。

6.总结

        通过完成这个小demo,我了解到了从0开始训练一个模型,从线性变非线性,从0开始的权重。这一整个过程让我对学习这一概念又有许多深入的了解

7.完整代码

        

import numpy as np
import matplotlib.pyplot as plt

def sigmoid(x):
    return np.where(x > 0, 1.0 / (1.0 + np.exp(-x)), np.exp(x) / (1.0 + np.exp(x)))

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 = 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_prob(self, X):
        linear_model = np.dot(X, self.weights) + self.bias
        y_pred = sigmoid(linear_model)
        return y_pred

    def predict(self, X, threshold=0.5):
        y_pred_prob = self.predict_prob(X)
        y_pred = np.zeros_like(y_pred_prob)
        y_pred[y_pred_prob >= threshold] = 1
        return y_pred



# 设置随机种子,以便结果可复现
np.random.seed(42)

# 生成随机数据
# 两个特征的均值和方差
mean_1 = [2, 2]
cov_1 = [[2, 0], [0, 2]]
mean_2 = [-2, -2]
cov_2 = [[1, 0], [0, 1]]

# 生成类别1的样本
X1 = np.random.multivariate_normal(mean_1, cov_1, 50)
y1 = np.zeros(50)

# 生成类别2的样本
X2 = np.random.multivariate_normal(mean_2, cov_2, 50)
y2 = np.ones(50)

# 合并样本和标签
X = np.concatenate((X1, X2), axis=0)
y = np.concatenate((y1, y2))
# 绘制散点图
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Set1, edgecolor='k')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Logistic Regression Dataset')
plt.show()

# 创建 Logistic 回归模型
logreg = LogisticRegression()

# 训练模型
logreg.fit(X, y)

# 预测样本
X_new = np.array([[2.5, 2.5], [-6.0, -4.0]])
y_pred_prob = logreg.predict_prob(X_new)
y_pred = logreg.predict(X_new)

print("Predicted Probabilities:", y_pred_prob)
print("Predicted Labels:", y_pred)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值