梯度下降不是';t在python中用logistic概率求最大似然

梯度下降不是';t在python中用logistic概率求最大似然,python,optimization,statistics,gradient-descent,log-likelihood,Python,Optimization,Statistics,Gradient Descent,Log Likelihood,所以我一直在尝试使用python运行一个基于梯度的算法,但没有得到收敛的结果。我将拍摄我正试图将其转化为代码的图片: 我的代码如下: #base packages #import sympy as sp #from sympy import * import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LogisticRegression x = np.array([0,0,0,0

所以我一直在尝试使用python运行一个基于梯度的算法,但没有得到收敛的结果。我将拍摄我正试图将其转化为代码的图片:

我的代码如下:

#base packages
#import sympy as sp
#from sympy import *
import numpy as np 
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression

x = np.array([0,0,0,0.1,0.1,0.3,0.3,0.9,0.9,0.9])
y = np.array([0.,0.,1.,0.,1.,1.,1.,0.,1.,1.])


def f(b0,b1,x,y):
    vec = [y[i]*np.log(1/(1+np.exp(-b0-b1*x[i]))) + (1-y[i])*np.log(1 - (1/(1+np.exp(-b0-b1*x[i])))) for i in range(len(y))]
    return sum(vec)

def dervf0(b0,b1,x,y):
    vec = [-y[i] + (1/(1+np.exp(-b0-b1*x[i]))) for i in range(len(x))]
    return np.sum(vec)
def dervf1(b0,b1,x,y):
    vec = [-x[i]*(y[i]-(1/(1+np.exp(-b0-b1*x[i])))) for i in range(len(x))]
    return sum(vec)



def G(f1,f2,b0,b1,x,y,tol,maxiter):
    v = np.array([b0,b1]) 
    theta_new  = v
    for i in range(maxiter):
        theta_new = v - 0.001*np.array([f1(b0,b1,x,y),f2(b0,b1,x,y)])
        if np.linalg.norm(theta_new - v) < tol: 
            break
        else:
            v = theta_new     
    return theta_new,i
#基本包
#将sympy作为sp导入
#从sympy进口*
将numpy作为np导入
将matplotlib.pyplot作为plt导入
从sklearn.linear_模型导入逻辑回归
x=np.数组([0,0,0,0.1,0.1,0.3,0.3,0.9,0.9])
y=np.数组([0,0,1,0,1,1,1,0,1,1.]))
def f(b0、b1、x、y):
向量=[y[i]*np.log(1/(1+np.exp(-b0-b1*x[i]))+(1-y[i])*np.log(1-(1/(1+np.exp(-b0-b1*x[i]))表示范围内的i(len(y))]
回报总额(vec)
def dervf0(b0、b1、x、y):
向量=[-y[i]+(1/(1+np.exp(-b0-b1*x[i]))表示范围(len(x))]
返回np.和(向量)
def dervf1(b0、b1、x、y):
向量=[-x[i]*(y[i]-(1/(1+np.exp(-b0-b1*x[i]))表示范围内的i(len(x))]
回报总额(vec)
def G(f1、f2、b0、b1、x、y、tol、maxiter):
v=np.数组([b0,b1])
θ_新=v
对于范围内的i(最大值):
theta_new=v-0.001*np.数组([f1(b0,b1,x,y),f2(b0,b1,x,y)])
如果np.linalg.norm(theta_new-v)
结果应该是一个向量[-0.009,1.263]'。然而,我没有得到一个收敛的结果。有什么想法吗?
Y

我不明白为什么定义了
f1
f2
。 问题是您没有在下一次迭代中使用更新的参数
b0、b1
。您正在更新
v
,但不是
b0、b1
为每个迭代添加这个

b0 = v[0]
b1 = v[1]
试试这个矢量化的实现。 矢量化的实现速度更快。 最后的新θ是
[-0.00923525 1.26245957]


import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression

x = np.array([0, 0, 0, 0.1, 0.1, 0.3, 0.3, 0.9, 0.9, 0.9])
y = np.array([0., 0., 1., 0., 1., 1., 1., 0., 1., 1.])


def f(b0, b1, x, y):
    return np.sum(
        np.multiply(y, np.log(1 / (1 + np.exp(-b0 - b1 * x)))) +
        np.multiply(1 - y, np.log(1 - (1 / (1 + np.exp(-b0 - b1 * x))))))


def dervf0(b0, b1, x, y):
    return np.sum(-1 * y + (1 / (1 + np.exp(-b0 - b1 * x))))


def dervf1(b0, b1, x, y):
    return np.sum(np.multiply(-1 * x, y - (1 / (1 + np.exp(-b0 - b1 * x)))))


def G(v, x, y, tol, maxiter):
    theta_new = v
    for i in range(maxiter):
        theta_new = v - 0.001 * np.array(
            [dervf0(v[0], v[1], x, y),
             dervf1(v[0], v[1], x, y)])
        if np.linalg.norm(theta_new - v) < tol:
            break
        else:
            v = theta_new
        print('i\t{}\tv\t{}\ttheta_new\t{}'.format(i, v, theta_new))
    return theta_new, i


tol = 0.0000001
maxiter = 1000000
v = np.random.normal(0, 1, 2)
theta_new, i = G(v, x, y, tol, maxiter)


将numpy作为np导入
将matplotlib.pyplot作为plt导入
从sklearn.linear_模型导入逻辑回归
x=np.数组([0,0,0,0.1,0.1,0.3,0.3,0.9,0.9])
y=np.数组([0,0,1,0,1,1,1,0,1,1.]))
def f(b0、b1、x、y):
返回np.sum(
np.multiply(y,np.log(1/(1+np.exp(-b0-b1*x)))+
np.multiply(1-y,np.log(1-(1/(1+np.exp(-b0-b1*xщщщ))))
def dervf0(b0、b1、x、y):
返回np.sum(-1*y+(1/(1+np.exp(-b0-b1*x)))
def dervf1(b0、b1、x、y):
返回np.sum(np.multiply(-1*x,y-(1/(1+np.exp(-b0-b1*xщ);)
def G(v、x、y、tol、maxiter):
θ_新=v
对于范围内的i(最大值):
θ_new=v-0.001*np.array(
[dervf0(v[0],v[1],x,y),
dervf1(v[0],v[1],x,y)])
如果np.linalg.norm(theta_new-v)