基于Python的非线性回归(Logistic Regression)模型分析与应用

一、概率

1.定义:概率(P)robability ,衡量一件事情发生的可能性

2.范围:0<=P<=1

3.计算方法: 根据个人置信

                      根据历史数据

                      根据模拟数据

4.条件概率

P\left ( A|B \right )=\frac{P\left ( A\bigcap B \right )}{P\left ( B \right )}

二、Logistic Regression(逻辑回归)

1.由于现实中的具体事例的发生较为复杂,并不能应用线性的模型进行分析,如果要使用的话,就会再每次调整参数得时候同时要调整阈值的范围,那模型的普适性就会变差。因此,针对上述会出现的问题,我们选择了了逻辑回归模型进行分析。

2.逻辑回归的基本模型

假设要测试的数据为X(x0,x1,x2……xn)

对应上述测试数据要学习的参数为:

\Theta \left ( \Theta _{0} ,\Theta _{1},\Theta _{2}......\Theta _{n}\right )

则得到如下的模型:Z=\Theta _{0}x_{0}+\Theta _{1}x_{1}+.......\Theta _{n}x_{n}

对应的向量表示为:Z=\Theta ^{T}X

其中\Theta ^{T}表示学习的参数的一维行向量,X为测试数据的一维行向量。

为了更好的处理上述的数据,我们引入了Sigmoid函数,这样可以使得我们的函数曲线变得平滑,即:

g\left ( Z \right )=\frac{1}{1+e^{-Z}}

 

 如上图所示为Sigmoid函数的图像,函数的值域范围为(0,1),且在自变量z取到0时,因变量g(Z)的值为1/2。

 则预测函数:h_{\Theta }\left ( X \right )=g\left (\Theta ^{T} X \right )=\frac{1}{1+e^{-\Theta ^{T}X}}

其中X为自变量,即预测数据值。\Theta为要学习的参数值。

与此同时,我们也可以将上述的函数改写为概率形式:

当所选的例子为正例(y=1):

h_{\Theta }\left ( X \right )=P\left ( y=1|X;\Theta \right )

当所选的例子为反例(y=0):

1-h_{\Theta }\left ( X \right )=P\left ( y=0|X;\Theta \right )

 3.构造目标函数(Cost函数)

3.1线性回归

\sum_{i=1}^{m}(h_{\Theta }(x^{(i)})-y^{(i)})^{2}

即总共有m个实例,y^{\left ( i \right )}代表实例的真实值,h_{\Theta }(x^{(i)})代表预测值 。

h_{\Theta }(x^{(i)})=\Theta _{0}+\Theta _{1}x^{(i)}

即找到满足上式最小的两个参数值。

3.2 Logistic regression

3.2.1Cost函数

Cost(h_{\Theta }(X,y))=\left\{\begin{matrix} -log(h_{\Theta }(X) )Wheny=1& \\ -log(1-h_{\Theta }(X))Wheny=0 & \end{matrix}\right.

J(\Theta )=\frac{1}{m}Cost(h_{\Theta }(x^{(i)}),y^{(i)})=-\frac{1}{m}[\sum_{i=1}^{m}y^{(i)}log(h_{\Theta }(x^{(i)}))+(1-y^{(i)}log(1-h_{\Theta }x^{(i)}))]

3.2.2函数目标是找到满足上式最小的两个参数值

3.4解决方案:梯度下降法(gradient decent)

梯度下降法(Gradient descent,简称GD)是一阶最优化算法。 要使用梯度下降法找到一个函数的局部极小值,必须向函数上当前点对应梯度(或者是近似梯度)的反方向的规定步长距离点进行迭代搜索。如果相反地向梯度正方向迭代进行搜索,则会接近函数的局部极大值点,这个过程则被称为梯度上升法。

梯度下降法是迭代法的一种,可以用于求解最小二乘问题(线性和非线性都可以)。在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降法和最小二乘法是最常采用的方法。在求解损失函数的最小值时,可以通过梯度下降法来迭代求解,得到最小化的损失函数和模型参数值。反过来,如果我们需要求解损失函数的最大值,这时就需要用梯度上升法来迭代了。在机器学习中,基于基本的梯度下降法发展了两种常用梯度下降方法,分别为随机梯度下降法和批量梯度下降法。

如上图所示就是一个梯度下降法的具体图示。即从某一点开始,选择对应的步长和方向进行,不断的下降,直到到达最终的最小值(可能是局部最小也可能是全局最小)为止。

\Theta _{j}=\Theta _{j}-\alpha \frac{\partial }{\partial \Theta _{j}}J(\Theta )                                (j=0,......,n)

更新法则:

\Theta _{j}=\Theta _{j}-\alpha \sum_{i=1}^{m}(h_{\Theta }(x^{(i)})-y^{(i)})x_{j}^{(i)}                  (j=0,......,n)

其中\alpha为学习率,通过更新法则对所有的\Theta进行更新,重复更新直到所求结果达到提前设置的阈值或者更新值收敛为止。

4.应用实例

import numpy as np
import random  #生成随机数包

def genData(numPoints, bias, variance): #定义测试数据genData,实例,偏差,方差
    x = np.zeros(shape=(numPoints, 2)) #行为numPonints,列为2
    y = np.zeros(shape=(numPoints))
    for i in range(0, numPoints): #等价于(0,numPoints-1)
        x[i][0] = 1 #第一行都为1
        x[i][1] = i #第二行的第几列就为几
        y[i] = (i+bias)+random.uniform(0, 1)+variance #random.unoform(0,1)表示在(0,1)之间随机产生一个数
    return x, y

def gradientDescent(x, y, theta, alpha, m, numIterations): #定义梯度下降法
    xTran = np.transpose(x) #求解X的转置矩阵
    for i in range(numIterations):
        hypothesis = np.dot(x, theta)
        loss = hypothesis-y
        cost = np.sum(loss**2)/(2*m) #所使用的是最简单的Cost函数表达式,并非这节内容中的Cost函数表达式
        gradient=np.dot(xTran, loss)/m #求解梯度函数
        theta = theta-alpha*gradient
        print("Iteration %d | cost :%f" % (i, cost))
    return theta
x,y = genData(80, 20, 10) #生成一个2行80列,每列偏差为20,方差为10的一组测试数据
print("x:")
print(x)
print("y:")
print(y)

m, n = np.shape(x)
n_y = np.shape(y)

print("m:"+str(m)+" n:"+str(n)+" n_y:"+str(n_y))

numIterations = 100000
alpha = 0.0005
theta = np.ones(n)
theta = gradientDescent(x, y, theta, alpha, m, numIterations)
print(theta)

运行结果:

[30.54631528  0.99893825]

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值