Python中的正则化逻辑回归[numpy]给出了错误的结果

2024-05-19 09:15:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用python和numpy编写logistic回归程序(使用sklearn.datasets生成数据集)。代码如下:

import numpy as np
import numpy.linalg as la

def sigmoid(x):
    return 1.0/(np.exp(-x) + 1)

def Cost(X,y,w,Lambda):
    #return regularised least squares cost function
    m = y.size
    cost = -sum(y*(np.log(sigmoid(np.dot(X,w)))) + (1-y)*(np.log(1-sigmoid(np.dot(X,w)))))/(m) + Lambda*sum(w[1:].T.dot(w[1:]))/(2*m);
    return cost[0]

def gradient(X,y,w,Lambda):
    #return gradient vector of cost function
    m = y.size
    grad = ((X.T).dot(sigmoid(X.dot(w) - y)))/m + Lambda*w/m
    grad[0] = grad[0] - Lambda*w[0]/m
    return grad

def gd(X,y,w,alpha,num_iters,Lambda):
    #perform gradient descent
    Cost_history = np.zeros((num_iters,1))
    for i in range(num_iters):
        Cost_history[i] = Cost(X,y,w,Lambda)
        w = w - alpha*gradient(X,y,w,Lambda)
    return w, Cost_history

def sgd(X,y,w,alpha,num_iters,Lambda):
    pass

def fit(X,y,Lambda=None,alpha=None,num_iters=None):
    if Lambda == None:
        Lambda = 0;
    if alpha == None:
        alpha = 0.03
    if num_iters == None:
        num_iters = 50
    m = X.shape[0]
    D = X.size//X.shape[0]
    X = np.c_[np.ones((m,1)),X]
    #w = np.random.rand(D,1)
    w = np.zeros((D+1,1))
    #w = np.r_[(np.arange(1)+1).reshape(1,1),w]
    w, Cost_history = gd(X,y,w,alpha,num_iters,Lambda)
    return w, Cost_history

def predict(X,w):
    m = X.shape[0]
    X = np.c_[np.ones((m,1)), X]
    y = X.dot(w)
    for i in range(m):
        if y[i]>=0:
            y[i] = 1
        else:
            y[i] = 0

    return y

我用来生成数据集的脚本是:

^{pr2}$

培训由以下人员完成:

w, cost_history = fit(X,y,alpha=0.001,num_iters=1000)

决策边界图如下:

Decision boundary and the 2 classes' scatterplot

成本历史图如下所示(vs epochs): J vs epochs

为什么会这样?因为成本函数看起来是正确的,梯度函数也是正确的,我似乎不明白为什么成本是发散的,而同样的代码修改为线性回归和正则化工作良好。在

绘图代码为:

from matplotlib import pyplot as plt
plt.scatter(X[:,0],X[:,1],marker='o',c=y)
plt.plot(linspace(-10,10),-w[0]/w[2] + w[1]*linspace(-10,10)/w[2],'k-')
plt.show()

[基本上,我只是一个学习者,我正在尝试从零开始制作一个小型的ML技术库来获得一种感觉。我做得对吗?或者我只是使用sklearn的基本工具和从那里继续学习更复杂的东西?另外,很抱歉我的问题结构不好,因为我只是一个初学者。]


Tags: lambdaalphanonereturndefnphistorynum

热门问题