最大熵阈值python_第六章-逻辑斯蒂回归和最大熵模型
逻辑斯谛回归是统计学习中的经典分类方法,和最大熵模型相比,具有以下的共同点和区别:共同点都属于概率模型,该模型要寻找的是给定一个x,得到输出变量Y的概率分布P(Y|x),如果是二分类,Y取值为0或1,如果是多分类,Y有K个不同的类别。
都属于对数线性模型,对概率分布P(Y|x)取对数,可得lnP(Y|x)=w * x关于x的线性函数。
两个模型之前的区别是Logistic回归属于判别模型,最大熵模型属于生成模型。在最大熵模型中,不仅x有随机性,Y也具有随机性,是一个随机变量。
Logistic回归模型(Logistic Regression Model)
给定输入变量
,输出变量为
,将
的概率记作
,上述已经介绍了,这个模型是一个线性模型,可以用
线性 函数来表示,由于
,那么要如何将
对应起来呢?这就需要用到一个变换,该变换称为Logit变换。
Logit变换:
这个就是Logistic回归模型的一个形式。
,其中
就是给定
的条件下,
的概率。所以可得下面两个公式:
有了这个模型之后,需要求解参数
,一旦求出
,那么任意给定一个输入变量
,就可以得到
的概率,如果该概率值大于0.5,就将该类判定为1,如果小于0.5,将该类判定为0。
求解
使用的方法是极大似然估计,给定参数
,求样本的联合概率密度,最大化该联合概率,从而求出参数
。
最大熵模型(Maximum Entropy Model)
最大熵模型主要是在自然语言处理中应用的比较广泛。最大熵模型是由最大熵原理推导实现的。而最大熵原理指的是在满足约束条件的模型集合中选择熵最大的模型。那么我们为何需要选择熵最大的模型呢?在决策树中,我们已经提到熵的概念,熵其实表示的是数据的混乱程度。在我们不知道任何信息的情况下,我们就只能假设数据在各个取值上比较平均,比较散乱,即比较数据的混乱程度。这样描述,可能不太清楚,直接看下面的一个例题:假设随机变量X由5个取值{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) =1
根据最大熵原理,取值随机且平均,那么P(A)=P(B)=P(C)=P(D)=P(E)=1/5。
当然有时候我们也能得到一些先验条件,比如:P(A)+P(B)=3/10。对于这种问题,我们在问题中就出现了一些约束条件,此时的熵就是条件熵,即:
对于一个训练数据集样本,我们可以确定联合分布P(X,Y)的经验分布和边缘分布P(X)的经验分布,但是求解条件熵仍然存在困难,因为在所有数据集中x的取值是不一样的,而且不固定。此时,我们可以采用经验分布的期望来进行比较。为何可以这样说呢?这就需要我们了解一个二值函数——特征函数(Feature Function)。该函数描述的是输入x和输出y之间的某一个事实,可以定义为:
直观的看,比较难以理解。可以举个例子,比如我们在做一个机器英译汉的翻译的时候,如果你输入一句话中带有take单词的英文句子I take a lot of money to buy a house.,此时take的含义表示花费,但是如果你输入She decided to take a bus to work since yesterday.,此时take的含义表示乘坐。take单词后面跟着不同单词,就需要翻译成不同的意思,此时next word是一个条件,在这种条件下,take翻译成不同的含义,满足这一个事实。由此,可以得到特征函数关于经验分布P(X,Y)和P(Y|X)与P(X)的期望值如下表述:
如果模型能够获取训练数据集中的信息,那么可以假设两个期望相等。得到以下最大熵模型。
最大熵模型的数学推导
最大熵模型学习过程中,最重要的是最大熵模型的学习,也就是求解约束条件下的最优化问题。
按照最优化的习惯问题,如果需要求H(P)的最大值,可以转化成求-H(P)的最小值。
此处可以将约束最优化问题转换成无约束最优化的对偶问题,通过求解对偶问题来求解原始问题。第一步,首先针对原始问题定义拉格朗日乘子w0,w1...wn,拉格朗日函数为:
由于拉格朗日函数是凸函数,因此原始问题的解和对偶问题的解是等价的,即求解原始问题的极小极大值可以转换成极大极小值。对L(P,w)求偏导。
求解对偶问题的外部的极大值问题。
即:是学习到的最优化模型,也就是最大熵模型。
Python实现
自编程实现
## 使用梯度下降法实现逻辑斯蒂回归算法
import numpy as np
import time
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
class LogisticRegression:
def __init__(self,learn_rate=0.1,max_iter=10000,tol=1e-2):
self.learn_rate=learn_rate #学习率
self.max_iter=max_iter #迭代次数
self.tol=tol #迭代停止阈值
self.w=None #权重
def preprocessing(self,X):
"""将原始X末尾加上一列,该列数值全部为1"""
row=X.shape[0]
y=np.ones(row).reshape(row, 1)
X_prepro =np.hstack((X,y))
return X_prepro
def sigmod(self,x):
return 1/(1+np.exp(-x))
def fit(self,X_train,y_train):
X=self.preprocessing(X_train)
y=y_train.T
#初始化权重w
self.w=np.array([[0]*X.shape[1]],dtype=np.float)
k=0
for loop in range(self.max_iter):
# 计算梯度
z=np.dot(X,self.w.T)
grad=X*(y-self.sigmod(z))
grad=grad.sum(axis=0)
# 利用梯度的绝对值作为迭代中止的条件
if (np.abs(grad)<=self.tol).all():
break
else:
# 更新权重w 梯度上升——求极大值
self.w+=self.learn_rate*grad
k+=1
print("迭代次数:{}次".format(k))
print("最终梯度:{}".format(grad))
print("最终权重:{}".format(self.w[0]))
def predict(self,x):
p=self.sigmod(np.dot(self.preprocessing(x),self.w.T))
print("Y=1的概率被估计为:{:.2%}".format(p[0][0])) #调用score时,注释掉
p[np.where(p>0.5)]=1
p[np.where(p<0.5)]=0
return p
def score(self,X,y):
y_c=self.predict(X)
error_rate=np.sum(np.abs(y_c-y.T))/y_c.shape[0]
return 1-error_rate
def draw(self,X,y):
# 分离正负实例点
y=y[0]
X_po=X[np.where(y==1)]
X_ne=X[np.where(y==0)]
# 绘制数据集散点图
ax=plt.axes(projection='3d')
x_1=X_po[0,:]
y_1=X_po[1,:]
z_1=X_po[2,:]
x_2=X_ne[0,:]
y_2=X_ne[1,:]
z_2=X_ne[2,:]
ax.scatter(x_1,y_1,z_1,c="r",label="正实例")
ax.scatter(x_2,y_2,z_2,c="b",label="负实例")
ax.legend(loc='best')
# 绘制p=0.5的区分平面
x = np.linspace(-3,3,3)
y = np.linspace(-3,3,3)
x_3, y_3 = np.meshgrid(x,y)
a,b,c,d=self.w[0]
z_3 =-(a*x_3+b*y_3+d)/c
ax.plot_surface(x_3,y_3,z_3,alpha=0.5) #调节透明度
plt.show()
Sklearn库实现
from sklearn.linear_model import LogisticRegression
import numpy as np
def main():
# 训练数据集
X_train=np.array([[3,3,3],[4,3,2],[2,1,2],[1,1,1],[-1,0,1],[2,-2,1]])
y_train=np.array([1,1,1,0,0,0])
# 选择不同solver,构建实例,进行训练、测试
methodes=["liblinear","newton-cg","lbfgs","sag","saga"]
res=[]
X_new = np.array([[1, 2, -2]])
for method in methodes:
clf=LogisticRegression(solver=method,intercept_scaling=2,max_iter=1000)
clf.fit(X_train,y_train)
# 预测新数据
y_predict=clf.predict(X_new)
#利用已有数据对训练模型进行评价
X_test=X_train
y_test=y_train
correct_rate=clf.score(X_test,y_test)
res.append((y_predict,correct_rate))
实现结果图:
最大熵阈值python_第六章-逻辑斯蒂回归和最大熵模型相关推荐
- 统计学习方法读书笔记(六)-逻辑斯蒂回归与最大熵模型(迭代尺度法(IIS))
全部笔记的汇总贴:统计学习方法读书笔记汇总贴 逻辑斯谛回归 (logistic regression )是统计学习中的经典分类方法.最大熵是概率模型学习的一个准则,将其推广到分类问题得到最大熵模型(m ...
- 学习笔记——逻辑斯蒂回归与最大熵模型
逻辑斯蒂回归(logistic regression)是统计学习中的经典分类方法.最大熵是概率模型学习的一个准则,将其推广到分类问题得到最大熵模型(maximum entropy).都属于对数线性模型 ...
- 逻辑斯蒂回归与最大熵模型---最大熵模型
为什么80%的码农都做不了架构师?>>> 最大熵原理 最大熵模型的定义 最大熵模型的学习 极大似然估计 转载于:https://my.oschina.net/liyangke/ ...
- 逻辑斯蒂回归模型——逻辑斯蒂分布、二项逻辑斯蒂回归模型、参数估计与多项逻辑斯蒂回归
本笔记整理自李航老师<统计学习方法>第二版 第六章 逻辑斯蒂回归是统计学习中经典的分类方法. 逻辑斯蒂分布 F(x)=P(X≤x)=11+e−(x−μ)/γF(x) = P(X\leq x ...
- 李航统计学习方法 Chapter6 逻辑斯蒂回归
第6章 逻辑斯蒂回归和最大熵模型 逻辑斯谛回归(LR)是经典的分类方法 1.逻辑斯谛回归模型是由以下条件概率分布表示的分类模型.逻辑斯谛回归模型可以用于二类或多类分类. P(Y=k∣x)=exp(w ...
- 逻辑斯蒂回归(logistic regression)原理小结
逻辑斯蒂回归(logistic regression)原理小结 1. 模型函数 2. 损失函数 3. 学习算法 4. 加正则项的逻辑斯蒂回归 5. 多项逻辑斯蒂回归 6. 模型综合评价 7. 二分类 ...
- 逻辑斯蒂回归 - 多项式回归
文章目录 一.预期结果 二.实验步骤 1)生成数据 2)算法实现 算法步骤: 1.获取规格化数据(系数矩阵.标签) 2.梯度上升法拟合系数 3.画图,看看拟合的准不准 结果 完整代码实现: 一.预期结 ...
- 细讲逻辑斯蒂回归与朴素贝叶斯、最大熵原理的爱恨交织(长文)
好早之前就发现逻辑斯蒂回归好像和朴素贝叶斯里面的后验概率公式还有最大似然.信息熵.交叉熵.伯努利分布.回归分析.几率(odds)等等有着千丝万缕CZFZ(错综复杂).PSML(扑朔迷离)的关系.一直感 ...
- 细讲逻辑斯蒂回归与朴素贝叶斯、最大熵原理的爱恨交织(五)
第五节:分类器中的天真小弟 -- 朴素贝叶斯 朴素贝叶斯文本分类模型 考虑如下文本分类模型:P(yi,di)P(y_i, d_i)P(yi,di) 表示一篇文章以及它的 label 的联合概率.d ...
最新文章
- R语言:绘制知识图谱
- 大数据搜索:Python编码实战
- 1.5 使用new创建动态结构和自动, 静态, 动态三种存储方式
- 第10章:项目沟通管理和干系人管理-章节重点
- Docker中运行命令时提示:Cannot connect to the Docker daemony...以及设置docker开机启动
- 2.Redis数据库(搭建redis主从的必要性)以及主从搭建(Windows为例)
- SQLServer之创建辅助XML索引
- java rsa 117_java实现RSA非对称加密解密
- 关于jQuery获取html标签自定义属性值或data值
- 代码生成的思考:MyMeta提供数据库架构,反射、Emit提供构建的提供动态创建的环境...
- mysql 前缀索引_MySQL前缀索引
- java jsonobject_Java调用groovy及如何使用springBean
- node 压缩图片_6大免费图片压缩神器你值得拥有!
- 最强升级系统的锚点连接
- JZOJ5444. 【NOIP2017提高A组冲刺11.2】救赎
- VTN系列多通道振弦采集仪数据查看和参数修改
- 520表白神器-教你用微信每天给TA说晚安
- 音圈电机模组选择直线导轨还是交叉导轨?
- 单片机六位抢答器c语言程序,单片机八人抢答器程序设计
- C++ / Opencv 简单实现美颜效果(瘦脸、大眼、磨皮等)
热门文章
- java parallel.for作用_“Parallel.For”for Java?
- python中tf.abs_python – Tensorflow:替换tf.nn.rnn_cell._linear(输入,大小,0,范围)
- 菜鸟学习笔记:Java提升篇1(容器1——List)
- 协程是什么?怎么来的?它有什么作用?
- 【Java数据结构与算法】第十五章 B树、B+树和B*树
- Linux流量监控工具 - iftop
- 关于Action模型驱动无法获取属性的问题
- 《深入分析Linux内核源代码》读书、私藏笔记大放送
- C++学习札记(1)
- Computer - 电脑硬件知识