php-ml 逻辑回归,分类算法----逻辑回归预测

逻辑回归的用途

逻辑回归常用于预测疾病发生的概率,例如因变量是是否恶性肿瘤,自变量是肿瘤的大小、位置、硬度、患者性别、年龄、职业等等(很多文章里举了这个例子,但现代医学发达,可以通过病理检查,即获取标本放到显微镜下观察是否恶变来判断);广告界中也常用于预测点击率或者转化率(cvr/ctr),例如因变量是是否点击,自变量是物料的长、宽、广告的位置、类型、用户的性别、爱好等等。

逻辑回归原理

bff63ba8ad2407fb962b4e742666ab41.png

122b9b703d9556ed810b0c4fcd518618.png

逻辑回归是一个形式是Y=1/(1+E(-X))的函数,它的特点是:

1   当X>0,随着X增大,Y很快的接近1;

2   当x<0,随着X的减小,Y很快的接近0;

3   当X=0时,Y=1/2;

由于逻辑回归的这种特性(在0-1之间连续),它被用来判断一个学习算法是否正确。

除了正确和不正确的结果之外,使用逻辑回归的好处在于,它还能告诉你,你离正确的结果还差多少,从而引导你向正确的方向前进。因此它常常和梯度上升的算法结合起来。

逻辑回归的预测模型

2e71cfa1e04d70418d2e2965b0c040c8.png

逻辑回归不是回归问题,而是二分类问题,因变量不是0就是1,那么我们很自然的认为概率函数服从伯努利分布,而伯努利分布的指数形式就是个sigmoid 函数。

函数hθ(x)表示结果取1的概率,那么对于分类1和0的概率分别为:

524fb32c79c55c66d2021f9c78188a40.png

逻辑回归多分类问题

由于逻辑回归常用于二分类问题,但也存在多分类情况:

多类分类问题举例: 电子邮件分类/标注: 工作邮件,朋友邮件,家庭邮件,爱好邮件  ; 医疗图表(medical diagrams): 没有生病,着凉,流感; 天气:晴天,多云,雨,雪

多类分类问题如下所示:

c5e004411045f6c2f8e47dedbf8eec4b.png

对于多类分类问题,可以将其看做成二类分类问题:保留其中的一类,剩下的作为另一类。

c56932465088b459e2878074f400a14d.png

对于每一个类 i 训练一个逻辑回归模型的分类器h(i)θ(x),并且预测 y = i时的概率;

对于一个新的输入变量x, 分别对每一个类别进行预测,取概率最大的那个类作为分类结果:

a14630e05e9b518d05e8bc2116878211.png

逻辑回归参数求解

一般回归问题的步骤是:

1. 寻找预测函数(h函数,hypothesis)

2. 构造损失函数(J函数)

3. 使损失函数最小,获得回归系数θ

而第三步中常见的算法有:

1. 梯度下降

2. 牛顿迭代算法

3. 拟牛顿迭代算法(BFGS算法和L-BFGS算法)

其中随机梯度下降和L-BFGS在spark mllib中已经实现,梯度下降是最简单和容易理解的。

预测函数上面已经给出了,现在需要构造损失函数J

02661c6072df11474ebb58c710e33763.png

推导过程可以参看:

最终梯度迭代公式如下:

8c2e2e27c7d364ab01958dfe2fc79c00.png

theata初始化为向量[1,1........1],迭代上面公式,让theata收敛,得到最后结果。

逻辑回归训练模型伪代码

#输入参数1是100行,2列的矩阵 dataMatIn;

#输入参数2是100行,1列的矩阵,取值都是0或1 classLabels;

def gradAscent(dataMatIn, classLabels):

# (以下两行)转换为NumPy矩阵数据类型

dataMatrix = mat(dataMatIn)

labelMat = mat(classLabels).transpose()

m,n = shape(dataMatrix)

alpha = 0.001

maxCycles = 500 #迭500找到

weights = ones((n,1)) #初始化成n行1列的全为1的矩阵

for k in range(maxCycles):

#(以下三行)矩阵相乘

h = sigmoid(dataMatrix*weights) #矩阵相乘,得到100行,1列的矩阵,利用逻辑回归把它变成100行1列的矩阵,每个值介于0到1之间,h是对label的一个估计

error = (labelMat - h) #估计与实际值之间差距为error,error也是一个100行1列的矩阵;

weights = weights + alpha * dataMatrix.transpose()* error #后面3项乘的结果是2行1列的矩阵,代表了估算的结果与实际结果是超了还是低了,从而修改weights。

return weights

由于每次迭代都会导致weights朝labelMat的方向靠近,因此经过500次的循环,最终能得到较好的结果,能很好的确定weights的两个参数。

逻辑回归代码python实现

Spark Java实现

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值