• 第六节--逻辑斯谛回归与最大熵模型


    第六节–逻辑斯谛回归与最大熵模型

    逻辑斯谛回归(logistic regression)是统计学习中的经典分类方法.最大熵是概率模型学习的一个准则.将其推广到分类问题得到最大熵模型(maximum entropy model).逻辑斯谛回归模型与最大熵模型都属于对数线性模型

    一.逻辑斯谛回归模型

    1.逻辑斯谛分布

    首先介绍逻辑斯谛分布(logistic distribution)
    逻辑斯谛分布:设XX是连续随机变量,XX服从逻辑斯谛分布是指XX具有下列分布函数和密度函数:
    F(x)=P(Xx)=11+e(xμ)/γf(x)=F(x)=e(xμ)/γγ(1+e(xμ)/γ)2 egin{array}{l}{F(x)=P(X leqslant x)=frac{1}{1+mathrm{e}^{-(x-mu) / gamma}}} \ {f(x)=F^{prime}(x)=frac{mathrm{e}^{-(x-mu) / gamma}}{gammaleft(1+mathrm{e}^{-(x-mu) / gamma} ight)^{2}}}end{array}

    式中,μmu为位置参数,γ>0gamma>0为形状参数

    逻辑斯谛分布的密度函数f(x)f(x)和分布函数F(x)F(x)的图形如下图所示.分布函数属于逻辑斯谛函数,其图形是一条S形曲线(sigmoid curve).该曲线以点(μ,12)left(mu, frac{1}{2} ight)为中心对称,即满足:
    F(x+μ)12=F(xμ)+12 F(-x+mu)-frac{1}{2}=-F(x-mu)+frac{1}{2}

    from IPython.display import Image
    
    Image(filename="./data/6_1.png",width=500)
    

    在这里插入图片描述

    曲线在中心附近增长速度较快,在两端增长速度较慢.形状参数γgamma的值越小,曲线在中心附近增长得越快

    2.二项逻辑斯谛回归模型

    二项逻辑斯谛回归模型(binomial logistic regression model)是一种分类模型,由条件概率分布P(YX)P(Y | X)表示,形式为参数化的逻辑斯谛分布.这里随机变量X取值为实数,随机变量Y取值为1或0.我们通过监督学习的方法来估计模型参数

    逻辑斯谛回归模型:二项逻辑斯谛回归模型是如下的条件概率分布:
    P(Y=1x)=exp(wx+b)1+exp(wx+b)P(Y=0x)=11+exp(wx+b) egin{array}{l}{P(Y=1 | x)=frac{exp (w cdot x+b)}{1+exp (w cdot x+b)}} \ {P(Y=0 | x)=frac{1}{1+exp (w cdot x+b)}}end{array}

    这里,xRnx in mathbf{R}^{n}是输入,Y{0,1}Y in{0,1}是输出,wRnw in mathbf{R}^{n}bRb in mathbf{R}是参数,w称为权值向量,b称为偏置,wxw cdot x为w和x的内积

    对于给定的输入实例x,按照公式可以求得P(Y=1x)P(Y=1 | x)P(Y=0x)P(Y=0 | x).逻辑斯谛回归比较两个条件概率值的大小,将实例x分到概率值较大的那一类

    有时为了方便,将权值向量和输入下来给你加以扩充,仍记作w,x.即w=(w(1),w(2), ,w(n),b)T(w^{(1)},w^{(2)}, cdots, w^{(n)}, b )^{mathrm{T}},x=(x(1),x(2), ,x(n),1)Tx=left(x^{(1)}, x^{(2)}, cdots, x^{(n)}, 1 ight)^{mathrm{T}}.这时逻辑斯谛回归模型如下:
    P(Y=1x)=exp(wx)1+exp(wx)P(Y=0x)=11+exp(wx) egin{array}{l}{P(Y=1 | x)=frac{exp (w cdot x)}{1+exp (w cdot x)}} \ {P(Y=0 | x)=frac{1}{1+exp (w cdot x)}}end{array}

    现在考查逻辑斯谛回归模型的特点,一个事件的几率(odds)是指该事件发生的概率与该事件不发生的概率的比值.如果事件发生的概率是p,那么该事件的几率是p1pfrac{p}{1-p},该事件的对数几率(log odds)或logit函数是:
    logit(p)=logp1p operatorname{logit}(p)=log frac{p}{1-p}

    对逻辑斯谛回归而言得:
    logP(Y=1x)1P(Y=1x)=wx log frac{P(Y=1 | x)}{1-P(Y=1 | x)}=w cdot x

    这就是说,在逻辑斯谛回归模型中,输出Y=1Y=1的对数几率是输入x的线性函数,或者说,输出Y=1Y=1的对数几率是由输入x的线性函数表示的模型,即逻辑斯谛回归模型

    换一个角度看,考虑对输入x进行分类的线性函数w,x,其值域为实数域.注意这里xRn+1,wRn+1x in mathbf{R}^{n+1}, w in mathbf{R}^{n+1}.通过逻辑斯谛回归模型将线性函数w,x转换为概率:
    P(Y=1x)=exp(wx)1+exp(wx) P(Y=1 | x)=frac{exp (w cdot x)}{1+exp (w cdot x)}

    这时,线性函数的值越接近正无穷,概率值就越接近1;线性函数的值越接近负无穷,概率值就越接近0.这样的模型就是逻辑斯谛回归模型

    3.多项逻辑斯谛回归

    上面介绍的逻辑斯谛回归模型是二项分类模型,用于二类分类.可以将其推广为多项逻辑斯谛回归模型(multi-nominal logistic regression model),用于多类分类.假设离散型随机变量YY的取值集合是{1,2, ,K}{1,2, cdots, K},那么多项逻辑斯谛high模型是:
    P(Y=kx)=exp(wkx)1+k=1K1exp(wkx),k=1,2, ,K1 P(Y=k | x)=frac{exp left(w_{k} cdot x ight)}{1+sum_{k=1}^{K-1} exp left(w_{k} cdot x ight)}, quad k=1,2, cdots, K-1

    P(Y=Kx)=11+k=1K1exp(wkx) P(Y=K | x)=frac{1}{1+sum_{k=1}^{K-1} exp left(w_{k} cdot x ight)}

    这里,xRn+1,wkRn+1x in mathbf{R}^{n+1}, w_{k} in mathbf{R}^{n+1}

    二项逻辑斯谛回归的参数估计法也可以推广到多项逻辑斯谛回归

    二.最大熵模型

    最大熵模型(maximum entropy model)有最大熵原理推导实现

    最大熵原理是概率模型学习的一个准则.最大熵原理认为,学习概率模型时,在所有可能的概率模型(分布)中,熵最大的模型是最好的模型.通常用约束条件来确定概率模型的集合,所以最大熵原理也可以表述为在满足约束条件的模型集合中选取最大的模型

    假设离散随机变量X的概率分布是P(X)P(X),则其熵是:
    H(P)=xP(x)logP(x) H(P)=-sum_{x} P(x) log P(x)

    熵满足下列不等式:
    0H(P)logX 0 leqslant H(P) leqslant log |X|

    式中,X|X|是X的取值个数,当且仅当X的分布是均匀分布时右边的等号成立.这就是说,当X服从均匀分布时,熵最大

    实例:假设随机变量X有5个取值{A,B,C,D,E}{A, B, C, D, E},要估计取各个值的概率P(A),P(B),P(C),P(D),P(E)P(A), P(B), P(C), P(D), P(E)

    Image(filename="./data/6_2.png",width=500)
    

    在这里插入图片描述

    可以继续按照满足约束条件下求等概率的方法估计概率分布.这里不再继续讨论.以上概率模型学习的方法正是遵循了最大熵原理

    下图提供了用最大熵原理进行概率模型选择的几何解释.概率模型集合Pmathcal{P}可由欧式空间中的单纯形表示.左图的三角形,一个点代表一个模型,整个单纯形代表模型集合.右图上的一条直线对应于一个约束条件,直线的交集相应于满足约束条件的模型集合.一般地这样的模型仍有无穷多个.学习的目的是在可能的模型集合中选择最优模型,而最大熵原理则给出最优模型选择的一个准则

    Image(filename="./data/6_3.png",width=500)
    

    在这里插入图片描述

    2.最大熵模型的定义

    假设分类模型是一个条件概率分布P(YX)P(Y | X),XXRnX in mathcal{X} subseteq mathbf{R}^{n}表示输入,YYY in mathcal{Y}表示输出,Xmathcal{X}Ymathcal{Y}分别是输入和输出的集合,这个模型的是对于给定的输入XX,以条件概率P(YX)P(Y | X)输出YY

    给定一个训练数据集:
    T={(x1,y1),(x2,y2), ,(xN,yN)} T=left{left(x_{1}, y_{1} ight),left(x_{2}, y_{2} ight), cdots,left(x_{N}, y_{N} ight) ight}

    学习的目标是用最大熵原理选择最好的分类模型

    最大熵模型:假设满足所有约束条件的模型集合为
    C{PPEP(fi)=Ep~(fi),i=1,2, ,n} mathcal{C} equivleft{P in mathcal{P} | E_{P}left(f_{i} ight)=E_{ ilde{p}}left(f_{i} ight), quad i=1,2, cdots, n ight}

    定义在条件概率分布P(YX)P(Y | X)上的条件熵为:
    H(P)=x,yP~(x)P(yx)logP(yx) H(P)=-sum_{x, y} ilde{P}(x) P(y | x) log P(y | x)

    则模型集合CC中条件熵H(P)H(P)最大的模型称为最大熵模型,式中的对数为自然对数

    三.代码实现

    LR是经典的分类方法.回归模型:f(x)=11+ewxf(x)=frac{1}{1+e^{-w x}}
    其中wx线性函数:wx=w0x0+w1x1+w2x2++wnxn,(x0=1)w x=w_{0} * x_{0}+w_{1} * x_{1}+w_{2} * x_{2}+ldots+w_{n} * x_{n},left(x_{0}=1 ight)

    1.数据加载

    %matplotlib inline
    from math import exp
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    
    from sklearn.datasets import load_iris
    from sklearn.model_selection import train_test_split
    
    # data
    def load_data():
        iris=load_iris()
        df=pd.DataFrame(iris.data,columns=iris.feature_names)
        df["label"]=iris.target
        df.columns=["sepal length","sepal width","petal length","petal width","label"]
        data=np.array(df.iloc[:100,[0,1,-1]])
        return data[:,:2],data[:,-1]
    
    X,y=load_data()
    X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3)
    

    2.自定义 LR

    class LogisticRegressionClassifier(object):
        def __init__(self,max_iter=200,learning_rate=0.01):
            self.max_iter=max_iter
            self.learning_rate=learning_rate
            
        def sigmoid(self,x):
            return 1/(1+exp(-x))
        
        def data_matrix(self,X):
            data_mat=[]
            for d in X:
                data_mat.append([1.0,*d])
            return data_mat
        
        def fit(self,X,y):
            # label=np.mat(y)
            data_mat=self.data_matrix(X)
            self.weights=np.zeros((len(data_mat[0]),1),dtype=np.float32)
            
            for iter_ in range(self.max_iter):
                for i in range(len(X)):
                    result=self.sigmoid(np.dot(data_mat[i],self.weights))
                    error=y[i]-result
                    self.weights+=self.learning_rate*error*np.transpose([data_mat[i]])
            print("LR Model(learning_rate={},max_iter={})".format(self.learning_rate,self.max_iter))
            
        def score(self,X_test,y_test):
            right=0
            X_test=self.data_matrix(X_test)
            for x,y in zip(X_test,y_test):
                result=np.dot(x,self.weights)
                if (result>0 and y==1) or (result<0 and y==0):
                    right+=1
            return right/len(X_test)
    
    lr_clf=LogisticRegressionClassifier()
    lr_clf.fit(X_train,y_train)
    
    LR Model(learning_rate=0.01,max_iter=200)
    
    lr_clf.score(X_test,y_test)
    
    1.0
    
    x_points=np.arange(4,8)
    y_=-(lr_clf.weights[1]*x_points+lr_clf.weights[0])/lr_clf.weights[2]
    plt.plot(x_points,y_)
    
    plt.scatter(X[:50,0],X[:50,1],label="0")
    plt.scatter(X[50:,0],X[50:,1],label="1")
    plt.legend()
    
    <matplotlib.legend.Legend at 0x1178a9bc860>
    

    在这里插入图片描述

    3.sklearn实现LR

    sklearn.linear_model.LogisticRegression的参数solver参数决定了我们对逻辑回归损失函数的优化方法,有四种算法可以选择(sag与saga相似).分别是:

    • newton-cg:牛顿法家族的一种.利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数
    • lbfgs:拟牛顿法的一种.利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数
    • liblinear:使用了开源的liblinear库实现.内部使用了坐标轴下降法来迭代优化损失函数
    • sag:随随机平均梯度下降,是梯度下降法的变种,和普通下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据集多的时候
    Image(filename="./data/6_4.png",width=500)
    

    在这里插入图片描述

    from sklearn.linear_model import LogisticRegression
    
    clf=LogisticRegression(max_iter=200)
    
    clf.fit(X_train,y_train)
    
    E:Anacondaenvsmytensorflowlibsite-packagessklearnlinear_modellogistic.py:433: FutureWarning: Default solver will be changed to 'lbfgs' in 0.22. Specify a solver to silence this warning.
      FutureWarning)
    
    
    
    
    
    LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
              intercept_scaling=1, max_iter=200, multi_class='warn',
              n_jobs=None, penalty='l2', random_state=None, solver='warn',
              tol=0.0001, verbose=0, warm_start=False)
    
    clf.score(X_test,y_test)
    
    1.0
    
    x_points=np.arange(4,8)
    y_=-(clf.coef_[0][0]*x_points+clf.intercept_)/clf.coef_[0][1]
    plt.plot(x_points,y_)
    
    plt.plot(X[:50,0],X[:50,1],"bo",color="blue",label="0")
    plt.plot(X[50:,0],X[50:,1],"bo",color="orange",label="1")
    
    plt.xlabel("sepal length")
    plt.ylabel("sepal width")
    plt.legend()
    
    <matplotlib.legend.Legend at 0x1178aca8b00>
    

    在这里插入图片描述

  • 相关阅读:
    避免scrollview内部控件输入时被键盘遮挡,监听键盘弹起,配合做滚动
    红包功能的开发总结
    App启动时间分析
    第三方动画库 Lottie嵌入记录
    加入一个新的团队需要做什么
    OC 面向对象的特性
    为什么说OC是运行时语言?什么是动态类型、动态绑定、动态加载?
    adb pull 和 adb push
    《重构:改善既有代码的设计》重构的方法整理
    《重构:改善既有代码的设计》(二) 代码的坏味道
  • 原文地址:https://www.cnblogs.com/LQ6H/p/12940584.html
Copyright © 2020-2023  润新知