统计学习方法第六章:逻辑斯谛回归与最大熵模型

本文详细介绍了逻辑斯谛回归模型的基本概念、逻辑斯谛分布、二项逻辑斯谛回归的特点、模型参数估计方法,以及最大熵模型的原理、应用和学习过程,包括sklearn中的实现。通过实例和算法分析,展示了模型在分类问题中的应用和优化求解策略。
摘要由CSDN通过智能技术生成

目录

逻辑斯谛回归模型基本知识点

逻辑斯谛回归(Logistic Regression)

逻辑斯谛分布

二项逻辑斯谛回归模型

 逻辑斯谛回归模型的特点

模型参数估计

多项式逻辑斯谛回归

最大熵模型

最大熵原理

最大熵原理例子 

最大熵模型的定义

最大熵模型

最大熵模型的学习

最大熵模型学习的例子

​编辑 

极大似然估计

模型学习的最优化算法

改进的迭代尺度法(IIS) 

拟牛顿法(BFGS算法)

逻辑斯谛回归代码分析

sklearn.linear_model.LogisticRegression 代码分析


工大菜凯,希望通过做笔记记录自己学的知识,也希望能帮助到同样在入门的同学 ❥侵权立删~

逻辑斯谛回归模型基本知识点

  • 最大熵是概率模型学习的一个准则,将其推广到分类问题得到最大熵模型
  • 逻辑斯谛回归模型与最大熵模型都属于对数线性模型
  • 逻辑斯谛回归模型与最大熵模型一般采用极大似然估计或正则化的极大似然估计,可以形式化为无约束最优化问题,求解最优化问题的算法有改进的迭代尺度法、梯度下降法、拟牛顿法

逻辑斯谛回归(Logistic Regression)

逻辑斯谛分布

  • 分布函数图形是一条S形曲线,该曲线以点(\mu\frac{1}{2})为中心对称,满足下面式子

  •  逻辑斯谛回归分布函数曲线在中心附近增长的较快,在两端增长速度较慢,形状参数\gamma的值越小,曲线在中心附近增长的越快

二项逻辑斯谛回归模型

  • 一种分类模型,由条件概率分布P(Y|X)表示,形式为参数化的逻辑斯谛分布
  • 二类分类  Y的取值为0 1

  • 比较 P(Y=1|X)和P(Y=0|X)的大小,将实例X分到概率值较大的那一类

 逻辑斯谛回归模型的特点
  • 一个事件的几率(odds):是指该事件发生的概率与该事件不发生的概率的比值

 

  • 线性函数\omega x越接近正无穷, P(Y=1|X)的概率值就越接近1
  • 线性函数\omega x越接近负无穷, P(Y=1|X)的概率值就越接近0
  • 此结论正好和逻辑斯谛回归模型的分布函数对应,称这样的模型为逻辑斯谛回归模型

模型参数估计

  • 逻辑斯谛回归模型在学习的过程中,我们可以通过应用极大似然估计模型,从而得到逻辑回归模型

  • 对L(\omega) 求极大值,得到\omega的估计值

多项式逻辑斯谛回归

最大熵模型

最大熵原理

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

最大熵原理例子 

最大熵模型的定义

  • 最大熵原理是统计学习的一般原理,将它应用到分类 得到最大熵模型

 

  •  我们将E_{\tilde{p}}\left ( f \right )E_{p}\left ( f \right )作为模型学习的约束条件
最大熵模型

最大熵模型的学习
  • 最大熵模型的学习等价于最优化问题

 

 

 

最大熵模型学习的例子

 

 

极大似然估计

  • 这样,最大熵模型的学习问题就转换为具体求解对数似然函数极大化或对偶函数极大化的问题

模型学习的最优化算法

改进的迭代尺度法(IIS) 

  • IIS是一种最大熵模型学习的最优化算法,目标是通过极大似然估计学习模型参数,即求对数似然函数的极大值\hat{\omega }

 

 

 

  • 这就给出了一种求\omega的最优解的迭代算法,即改进的迭代尺度算法IIS

拟牛顿法(BFGS算法)

逻辑斯谛回归代码分析

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 create_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]])
    # print(data)
    return data[:,:2], data[:,-1]
# X是样本的特征数据 y是样本的目标标签
X, y = create_data()
# 将整个训练数据集分成70% 训练数据 和 30%测试数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

class LogisticReressionClassifier:
    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))

    # 将输入数据集X转换为矩阵形式的数据,其中每个数据项前面添加一个额外的元素1.0
    # *是Python中的可变参数语法,表示将一个可迭代对象展开成多个独立的元素
    # 举个例子,如果d的值是[2, 3],那么data_mat.append([1.0, *d]) 
    # 就相当data_mat.append([1.0, 2, 3])
    def data_matrix(self, X):
        data_mat = []
        for d in X:
            data_mat.append([1.0, *d])
        return data_mat

    # 接受数据集X和对应的标签y作为输入
    def fit(self, X, y):

        # 将数据集X转换成矩阵形式的数据data_mat
        data_mat = self.data_matrix(X) # m*n
        # len(data_mat[0])表示数据集第一个样本的特征个数 也就是数据集的列数
        # 创建一个行数=数据集列数 列数为1 的全零数组
        # 全零数组的目的就是初始化模型的权重参数,并在训练过程中逐步更新这些参数
        self.weights = np.zeros((len(data_mat[0]),1), dtype=np.float32)
        
        # 外层循环iter_控制迭代次数,内层循环i遍及数据集中的每个样本
        for iter_ in range(self.max_iter):
            for i in range(len(X)):
                # 将回归模型对样本的预测结果保存在result变量中
                result = self.sigmoid(np.dot(data_mat[i], self.weights))
                # 计算预测结果与真实标签之间的误差
                error = y[i] - result 
                # 更新权重参数 np.transpose 转置 将原本的行向量转为列向量 便于后续的矩阵计算
                self.weights += self.learning_rate * error * np.transpose([data_mat[i]])

        # 输出学习率和最大迭代次数
        print('LogisticRegression 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)
        # zip 的作用是 将x_test 和对应的标签y_text进行打包,以便同时遍历它们的元素 
        for x, y in zip(X_test, y_test):
            # 一般情况下逻辑回归模型的预测结果可以通过线性函数和sigmoid函数组合得到
            # 这里直接使用线性函数的结果作为预测值,是因为这里只关注预测结果的正负性
            # 如果希望在预测结果上应用sigmoid函数并得到概率值
            # result = self.sigmoid(np.dot(data_mat[i], self.weights))
            # 这样预测结果经过sigmoid函数处理,将其映射到(0,1)的概率范围内
            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 = LogisticReressionClassifier()
lr_clf.fit(X_train, y_train)

x_ponits = np.arange(4, 8)

# w0 + w1*X1 + w2*X2 = 0 得X2=-(w0+w1*x1)/w2  x2为数据集的第二个特征的值,这里把它看作了y来处理 
y_ = -(lr_clf.weights[1]*x_ponits + lr_clf.weights[0])/lr_clf.weights[2]

# 画出可以区分 类别0 的特征(x1,x2) 和类别1 的特征(x1,x2)的分割线
plt.plot(x_ponits, y_)

#lr_clf.show_graph()
# 特征(x1,x2)的分布情况
plt.scatter(X[:50,0],X[:50,1], label='0')
plt.scatter(X[50:,0],X[50:,1], label='1')
plt.legend()

sklearn.linear_model.LogisticRegression 代码分析

from sklearn.linear_model import LogisticRegression
clf = LogisticRegression(max_iter=200)
clf.fit(X_train, y_train)
clf.score(X_test, y_test)
# clf.coef_ :训练得到每个特征所对应的权重系数 如果训练集有n个特征则clf.coef_返回的是(1,n)的数组
# clf.intercept_ :逻辑回归模型的截距
# clf.intercept :在二元逻辑回归模型中,clf.intercept_ 是一个标量,表示决策边界与 y 轴的交点
# clf.intercept_ 是一个形状为 (k, ) 的向量
print(clf.coef_, clf.intercept_)

x_ponits = np.arange(4, 8)
y_ = -(clf.coef_[0][0]*x_ponits + clf.intercept_)/clf.coef_[0][1]
plt.plot(x_ponits, y_)

plt.plot(X[:50, 0], X[:50, 1], 'o', color='blue', label='0')
plt.plot(X[50:, 0], X[50:, 1], 'o', color='orange', label='1')
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.legend()

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

工大凯K

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值