Я слежу за учебным пособием по внедрению логического градиентного спуска в python.
Вот ссылка: http://www.johnwittenauer.net/machine-learning-exercises-in-python-part-3/
Его IPython ноутбук GitHub для этого especific упражнения здесь:
https://github.com/jdwittenauer/ipython-notebooks/blob/master/notebooks/ml/ML-Exercise2.ipynb
Вот мой код для этой проблемы:
Логистический градиент Спуск не сходится в Python fmin_tnc
import pandas as pd
import matplotlib.pylab as plt
import numpy as np
import scipy.optimize as opt
def sigmoid(Z):
'''Compute the sigmoid function '''
return 1.0/(1.0 + np.exp(-1.0 * Z))
###########################################
def compute_cost(theta,X,y, learningRate):
'''compute cost given '''
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', заголовка = нет, имена = [ 'Тест 1', 'Тест 2', 'Принято'])
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 = 1
from sklearn.preprocessing import PolynomialFeatures
#Get all high order parameters
feature_mapper = PolynomialFeatures(degree=6)
X = feature_mapper.fit_transform(X)
# convert to numpy arrays and initalize the parameter array theta
theta = np.zeros(X.shape[1])
learningRate = 1
compute_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
Но если вы будете следовать каждый шаг своего кода вы получите следующий результат:
Ну, как вы можете это немного отличается. Но в его коде я заметил другую вещь. Он сбросил 2 столбца «Тест 1» и «Тест 2» и сохранил только параметры высокого порядка. Это кажется странным, потому что в решении Эндрю Нг он не оставляет ни одного столбца таблицы, но использует 28 функций. В этом используется только 11 функций. Я нашел другие коды, и я хотел, чтобы моя функция cost_function и gradient работала. Я считаю, что они застряли на местном минимуме, и они не сходятся.
Моя последняя попытка, которую я сделал со всеми 28 функциями, такими же, как данные DataFrame от Andrew. К сожалению, у меня есть другой результат, как вы можете увидеть ниже:
Как вы можете видеть, у меня есть более высокую точность, но моя стоимость остается выше, чем ожидалось, что: 0,52900
Мои намерение не умалять качество кода блога. Я все еще следую его шагам по другим учебникам и кажется хорошим источником.
Ниже приведена ссылка на мой код, я использую fmin_tnc так же, как он делает. Я просто создал более векторную функцию gradient_function. Имя файла логистической регрессия Regularized.py
Github: https://github.com/vinipachecov/Machine-Learning/tree/master/Logistic%20Regression