逻辑回归算法

5 篇文章 0 订阅
5 篇文章 0 订阅
import numpy as np
import math


# 逻辑回归算法
class LogisticRegression:

    def __init__(self):
        """初始化loigistic regression模型"""
        self.coef_ = None  # 维度
        self.intercept_ = None  # 截距
        self._theta = None

    # sigmoid函数
    def _sigmoid(self, x):
        y = 1 / (1 + np.exp(-x))
        return y

    def fit(self, x_train, y_train, eta=0.01, n_iters=1 * math.e * 4):
        assert x_train.shape[0] == y_train.shape[0]  # 训练长度与标签长度一致

        # 计算损失函数
        def J(theta, x_b, y):
            p_predict = self._sigmoid(x_b.dot(theta))
            try:
                return -np.sum(y*np.log(p_predict) + (1 - y)* np.log(1 - p_predict)) / len(y)
            except:
                return float('inf')

        # 求sigmoid梯度的导数
        def dJ(theta, x_b, y):
            x = self._sigmoid(x_b.dot(theta))
            return x_b.T.dot(x-y) / len(x_b)
        def gradient_descent(x_b, y, initial_theta, eta, n_iters= 1*math.e*4, epsilion=1 * math.e - 8):
            theta = initial_theta
            i_iter = 0
            while i_iter < n_iters:
                gradient = dJ(theta, x_b, y)
                last_theta = theta
                theta = theta - eta * gradient
                i_iter += 1
                if abs(J(theta, x_b, y)) - J(last_theta, x_b, y) < epsilion:
                    break
            return theta
        x_b = np.hstack([np.ones((len(x_train), 1)), x_train])
        initial_theta = np.zeros((x_b.shape[1]))
        self._theta = gradient_descent(x_b, y_train, initial_theta, eta, n_iters)
        self.intercept_ = self._theta[0]
        self.coef_ = self._theta[1:]
        return self
    
    def predict_proba(self, x_predict):
        x_b = np.hstack([np.ones((len(x_predict),1)),x_predict])
        return  self._sigmoid(x_b.dot(self._theta))

    def predict(self, x_predict):
        proba = self.predict_proba(x_predict)
        return np.array(proba > 0.5, dtype= 'int')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值