逻辑回归

class LogisticRegression:
    """使用Python语言来实现逻辑回归算法。"""
    
    def __init__(self, alpha, times):
        """初始化方法。
        
        Parameters
        -----
        alpha : float
            学习率。
            
        times : int
            迭代次数。
        """
        
        self.alpha = alpha
        self.times = times
        
    def sigmoid(self, z):
        """sigmoid函数的实现
        
        Parameters
        -----
        z : float
            自变量,值为z = w.T * x
            
        Returns
        -----
        p : float, 值为[0, 1]之间。
            返回样本属于类别1的概率值,用来作为结果的预测。
            当s >= 0.5(z >= 0)时,判定为类别1, 否则判定为类别0。
        """
        return 1.0 / (1.0 + np.exp(-z))
    
    def fit(self, X, y):
        """根据提供的训练数据, 对模型进行训练。
        
        Parameters
        -----
        X : 类数组类型。形状为:[样本数量, 特征数量]
            待训练的样本特征属性。
            
        y : 类数组类型。形状为:[样本数量]
            每个样本的目标值。(标签)
        """
        
        X = np.asarray(X)
        y = np.asarray(y)
        # 创建权重的向量,初始值为0,长度比特征数多1。(多出来的一个是截距)
        self.w_ = np.zeros(1 + X.shape[1])
        # 创建损失列表,用来保存每次迭代后的损失值。
        self.loss_ = []
        
        for i in range(self.times):
            z = np.dot(X, self.w_[1:]) + self.w_[0]
            # 计算概率值(结果判定为1的概率值)
            p = self.sigmoid(z)
            # 根据逻辑回归的代价函数(目标函数),计算损失值。
            # 逻辑回归的代价函数(目标函数):
            # J(w) = -sum(yi * log(s(zi)) + (1 - yi) * log(1 - s(zi))) [i从1到n,n为样本的数量]
            cost = -np.sum(y * np.log(p)+ (1 - y) * np.log(1 - p))
            self.loss_.append(cost)
            
            # 调整权重值, 根据公式:调整为:  权重(j列) = 权重(j列) + 学习率 * sum( (y - s(z)) * x(j))
            self.w_[0] += self.alpha * np.sum(y - p)
            self.w_[1:] += self.alpha * np.dot(X.T, y - p)
            
    def predict_proba(self, X):
        """根据参数传递的样本,对样本数据进行预测。
        
        Parameters
        -----
        X : 类数组类型。 形状为[样本数量, 特征数量]
            待测试的样本特征(属性)
            
        Returns
        -----
        result : 数组类型
            预测的结果(概率值)
        """
        
        X = np.asarray(X)
        z = np.dot(X, self.w_[1:]) + self.w_[0]
        p = self.sigmoid(z)
        # 将预测结果变成二维数组(结构)。便于后续的拼接。
        p = p.reshape(-1, 1)
        # 将两个数组进行拼接。方向为横向拼接。
        return np.concatenate([1 - p, p], axis=1)
    
    def predict(self, X):
        """根据参数传递的样本,对样本数据进行预测。
        
        Parameters
        -----
        X : 类数组类型。 [样本数量, 特征数量]
            待测试的样本特征(属性)
            
        Returns
        -----
        result : 数组类型。
            预测的结果(分类值)
        
        """
        return np.argmax(self.predict_proba(X), axis=1)
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在线性回归的基础上,如果因变量不是连续变量,而是0-1变量,怎么办呢?这里我们需要一个阈值函数,将因变量的取值做一...
    九天朱雀阅读 3,655评论 0 0
  • 关于线回归、逻辑回归,各位大神总结的很精辟了,下面收藏几个好的讲解,以备忘。 逻辑回归三部曲 机器学习系列(1)_...
    RookieDay阅读 3,251评论 0 2
  • 今天学习了线性回归和逻辑回归 主要运用到sklearn.linear_model库中的LinearRegressi...
    deeann1993阅读 3,051评论 0 3
  • 逻辑回归是回归系列中一个分类模型,而且是一个二分类模型。逻辑回归模型简单但应用广泛,本文从模型介绍、适用场景以及优...
    wujustin阅读 10,420评论 0 6
  • 站得越高,看得越远,但细节就离你越远。
    杨颖的笔记阅读 1,238评论 0 0

友情链接更多精彩内容