Python Coursera ML-优化算法的选择是否影响多类逻辑回归的准确性?

Python Coursera ML-优化算法的选择是否影响多类逻辑回归的准确性?,python,optimization,machine-learning,scipy,logistic-regression,Python,Optimization,Machine Learning,Scipy,Logistic Regression,我最近完成了 在最初完成练习的第1.4到1.4.1部分时,我遇到了一些困难,无法确保我训练的模型具有与预期的94.9%匹配的准确性。即使在调试并确保我的成本和梯度函数没有bug,并且预测器代码正常工作之后,我仍然只能获得90.3%的准确率。我在scipy.optimize.minimize中使用共轭梯度(CG)算法 出于好奇,我决定尝试另一种算法,并使用Broyden–Fletcher–Goldfarb–Shannon(BFGS)。令我惊讶的是,准确率大幅提高到96.5%,因此超出了预期。CG和

我最近完成了

在最初完成练习的第1.4到1.4.1部分时,我遇到了一些困难,无法确保我训练的模型具有与预期的94.9%匹配的准确性。即使在调试并确保我的成本和梯度函数没有bug,并且预测器代码正常工作之后,我仍然只能获得90.3%的准确率。我在scipy.optimize.minimize中使用共轭梯度(CG)算法

出于好奇,我决定尝试另一种算法,并使用Broyden–Fletcher–Goldfarb–Shannon(BFGS)。令我惊讶的是,准确率大幅提高到96.5%,因此超出了预期。CG和BFGS之间这两个不同结果的比较可以在我的标题下看到,由于优化算法不同,精度不同

这种精度差异的原因是由于优化算法的选择不同吗?如果是,那么有人能解释一下原因吗

此外,我非常感谢您对我的代码进行任何检查,以确保我的任何函数中没有导致此问题的bug。我还怀疑可能有bug对此负责

多谢各位

编辑:我在下面添加了问题所涉及的代码,以便于任何人在不参考我的Jupyter笔记本的情况下帮助我

模型成本函数:

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

def compute_cost_regularized(theta, X, y, lda):
    reg =lda/(2*len(y)) * np.sum(theta[1:]**2) 
    return 1/len(y) * np.sum(-y @ np.log(sigmoid(X@theta)) 
                             - (1-y) @ np.log(1-sigmoid(X@theta))) + reg

def compute_gradient_regularized(theta, X, y, lda):
    gradient = np.zeros(len(theta))
    XT = X.T
    beta = sigmoid(X@theta) - y
    regterm = lda/len(y) * theta
    # theta_0 does not get regularized, so a 0 is substituted in its place
    regterm[0] = 0 
    gradient = (1/len(y) * XT@beta).T + regterm
    return gradient
实施一对所有分类培训的功能:

from scipy.optimize import minimize

def train_one_vs_all(X, y, opt_method):
    theta_all = np.zeros((y.max()-y.min()+1, X.shape[1]))
    for k in range(y.min(),y.max()+1):
        grdtruth = np.where(y==k, 1,0)
        results = minimize(compute_cost_regularized, theta_all[k-1,:], 
                           args = (X,grdtruth,0.1),
                           method = opt_method, 
                           jac = compute_gradient_regularized)
        # optimized parameters are accessible through the x attribute
        theta_optimized = results.x
        # Assign thetheta_optimized vector to the appropriate row in the 
        # theta_all matrix
        theta_all[k-1,:] = theta_optimized
    return theta_all
调用函数以使用不同的优化方法训练模型:

theta_all_optimized_cg = train_one_vs_all(X_bias, y, 'CG')  # Optimization performed using Conjugate Gradient
theta_all_optimized_bfgs = train_one_vs_all(X_bias, y, 'BFGS') # optimization performed using Broyden–Fletcher–Goldfarb–Shanno
我们发现,预测结果因使用的算法而异:

def predict_one_vs_all(X, theta):
    return np.mean(np.argmax(sigmoid(X@theta.T), axis=1)+1 == y)*100

In[16]: predict_one_vs_all(X_bias, theta_all_optimized_cg)
Out[16]: 90.319999999999993

In[17]: predict_one_vs_all(X_bias, theta_all_optimized_bfgs)
Out[17]: 96.480000000000004

对于任何想要获取任何数据来尝试代码的人,他们可以在我的Github中找到它,如本文中的链接所示

我曾经发现一个bug,它使我的MNIST数字识别神经网络的准确率提高了15%。那个bug是什么?我想知道这是否与我的实现有关……啊,这与我在卷积层执行反向传播的方式有关。我没有转动过滤器,我明白了。在下一个练习4中,我将实现一个神经网络,但这是一个不使用卷积的简单网络。我现在会不会太麻烦你了,你能不能看看我笔记本上的代码?