逻辑梯度下降在Python中使用fmin_tnc不收敛

我一直在按照一个教程在Python中实现逻辑梯度下降。
这是链接:http://www.johnwittenauer.net/machine-learning-exercises-in-python-part-3/

他关于这个特定练习的ipython笔记本的GitHub链接如下:
https://github.com/jdwittenauer/ipython-notebooks/blob/master/notebooks/ml/ML-Exercise2.ipynb

这是我针对这个问题的代码:

import pandas as pdimport matplotlib.pylab as pltimport numpy as npimport scipy.optimize as opt  def sigmoid(Z):    '''计算sigmoid函数'''    return 1.0 / (1.0 + np.exp( -1.0 * Z))###########################################def compute_cost(theta,X,y, learningRate):   '''计算给定成本'''    theta = np.matrix(theta)    X = np.matrix(X)    y = np.matrix(y)    m = y.size    theta0 = np.zeros((1,X.shape[1]))    theta0[0,1:] = theta[0,1:]        reg = np.dot((learningRate/2*m),(theta0.T.dot(theta0)))     Z = X.dot(theta.T)    hypothesis = sigmoid(Z)      exp1 = (-y.T.dot(np.log(hypothesis)))    exp2 = ((1.0 - y).T.dot(np.log(1.0 - hypothesis)))        J = (exp1  - exp2).dot(1/m)     return J.sum() + reg.sum() def grad(theta,X,y,learningRate):        theta = theta.T              X = np.matrix(X)    y = np.matrix(y)    m = y.shape[0]    theta0 = np.zeros(X.shape[1])          theta0[1:] = theta[1:]        theta = np.matrix(theta)        theta0 = np.matrix(theta0)    reg = np.dot(learningRate / m, theta)    Z = X.dot(theta.T)        hypothesis = sigmoid(Z)          error = hypothesis - y            grad =  np.dot((X.T.dot(error).flatten()),1/m)  + reg    grad= grad.flatten()      grad          ##def predict(theta, X):        probability = sigmoid(X * theta.T)    return [1 if (x >= 0.5) else 0 for x in probability]  

这是代码的调用方式:
data2 = pd.read_csv(‘ex2data2.txt’, header=None, names=[‘Test 1’, ‘Test 2’, ‘Accepted’])

y = data2[data2.columns[-1]].as_matrix()m = len(y)y = y.reshape(m, 1)X = data2[data2.columns[:-1]]X = X.as_matrix()_lambda = 1from sklearn.preprocessing import PolynomialFeatures#获取所有高阶参数feature_mapper = PolynomialFeatures(degree=6)X = feature_mapper.fit_transform(X)#转换为numpy数组并初始化参数数组theta theta = np.zeros(X.shape[1])learningRate = 1compute_cost(theta, X, y, learningRate)        result = opt.fmin_tnc(func=compute_cost,x0=theta,fprime=grad,args=    (X,y,learningRate))

对于一个变量,一切正常,但对于更多特征(练习2)效果不佳。直到使用优化的梯度下降函数(fmin_tnc)之前,一切都完全相同。
不知为何,即使是他的代码也没有收敛到预期的值。他在他的博客中展示了fmin_tnc应该得到的结果
他的调用和fmin_tnc的预期结果

但如果你按照他代码的每一步,你会得到以下结果:
他的代码给出的结果

如你所见,结果有点不同。但我在他的代码中发现了不同之处。他删除了’Test 1’和’Test 2’两列,只保留了高阶参数。这感觉有点奇怪,因为在Andrew Ng的解决方案中,他没有删除表格的任何列,而是使用了28个特征。这个只使用了11个特征。我找到了其他代码,我希望我的成本函数和梯度函数能正常工作。我认为它们卡在某个局部最小值上,没有收敛。
我的最后尝试是像Andrew的数据框一样使用所有28个特征。可惜我得到了不同的结果,如下图所示:
最终结果
如你所见,我的准确率更高,但我的成本仍然高于预期值,即:0.52900
我的意图不是贬低博客的代码质量。我仍然在其他教程中按照他的步骤进行,看起来这是一个不错的资源。
下面是我的代码链接,我使用fmin_tnc就像他做的那样。我只是创建了一个更向量化的梯度函数。文件名为Logistic Regression Regularized.py

GitHub: https://github.com/vinipachecov/Machine-Learning/tree/master/Logistic%20Regression


回答:

问题是我使用的是Python 3.6,而作者使用的是Python 2.7.X。将版本更改为Python 2.7.13解决了这个问题。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注