Logistic回归

1. Logistic回归

1.1 基本原理

Logistic Regression 是一种分类模型,其基本思路是寻找超平面把数据区分开,因此其基本思想就是寻找超平面,也就求多元系数的问题,这里采取了梯度下降法来求系数。逻辑回归步骤如下:

列出回归方程,估计回归系数

回归方程:Y=WX

1.2 Sigmoid函数

Sigmoid函数是阈值函数,什么作用呢?一般对于分类问题,总以结果大于零或者小于0来分是属于哪一类,但是在实际问题中,二元类一般划分为0类或者1类,也就是数据集的标签为0或者1。那么直接使用结果来划分类别,以小于0为0类,以大于0为1类,这样处理的话,不利于后面的求解损失函数,因此需要将其转换,最后转化后的结果能落在0,1之间,因此我们就使用了阈值函数,f(t) = 1/(1+e-t),其值域为(0, 1)。该阈值函数使用后,结果如下

1.3 梯度下降法

梯度下降法,只需要求解一阶导数,因此计算的成本比较小,这在大规模的数据集上应用比较广泛。梯度下降法的含义是通过当前点的梯度方向寻找新的迭代点,并从当前点移动到新的迭代点继续重复此过程,一直到寻找到最优解,或者到最大迭代次数。

梯度下降法的流程如下:

1.4 代码实现

定义了一个logisticregression类,类中定义如下:

定义了一个参数数组self.W,训练数据得到的参数就存放于该数组;

定义了sigmoid函数def sig(self, t)

定义了一个训练函数train(self,X,y,alpha, iters),其中将偏置也合并到W数组中,X为输入数据,不过其在fit函数中经过处理,在最后一列添加了一列全为1的常数项,目的是为了将偏置也一并归到W中去,alpha为训练步长,iters为最大迭代次数。

定义了拟合函数fit(self, X, y),其中X为原始输入数据,y为标签,X经过处理,添加了一列全为1的常数项。fit中调用了train()函数进行拟合。

定义了预测函数predict(self, X),这里X也要添加常数项,然后与训练得出的参数进行矩阵运算,得出结果。(代码很简单,就不写注解了)

class LogisticRegression:
    def __init__(self):
        self.W = []

    def sig(self, t):
            return 1/(1 + np.exp(-t))

    def train(self, X, y, alpha, iters):
        w = np.random.rand(X.shape[1])
        w = w.reshape(-1, 1)

        for i in range(iters):
            h = self.sig(X*w)
            err = y - h
            delta = X.T * err
            w += alpha * delta
            if i % 100 == 0:
                print('error is ', self.error_rate(h, y))
        return w

    def error_rate(self, h, y):
        sum_err = 0
        sum_err -= y.T * np.log(h) + (1 - y.T)*np.log(1 - h)
        return sum_err

    def fit(self, X, y):
        X = np.c_[X, np.ones(X.shape[0])]
        X = np.mat(X)
        y = np.mat(y.reshape(-1, 1))
        self.W = self.train(X, y, 0.01, 1000)

    def predict(self, X):
        X = np.c_[X, np.ones(X.shape[0])]
        X = np.mat(X)
        h = self.sig(X * self.W)
        h = map(lambda x:0 if x<0.5 else 1, h)
        h = list(h)
        return h

1.5 测试代码

def load_data():
    data = load_iris()
    x = data.data
    y = data.target
    x = x[y < 2]
    y = y[y < 2]
    return x, y
if __name__ == '__main__':
    x, y = load_data()
    model = LogisticRegression()
    model.fit(x, y)
    y_pred = model.predict(x)

    label = np.c_[y, y_pred]
    print(label)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值