0

Я слежу за учебным пособием по внедрению логического градиентного спуска в 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
his call and expected result for fmin_tnc

Но если вы будете следовать каждый шаг своего кода вы получите следующий результат:
Result giving by his code


Ну, как вы можете это немного отличается. Но в его коде я заметил другую вещь. Он сбросил 2 столбца «Тест 1» и «Тест 2» и сохранил только параметры высокого порядка. Это кажется странным, потому что в решении Эндрю Нг он не оставляет ни одного столбца таблицы, но использует 28 функций. В этом используется только 11 функций. Я нашел другие коды, и я хотел, чтобы моя функция cost_function и gradient работала. Я считаю, что они застряли на местном минимуме, и они не сходятся.
Моя последняя попытка, которую я сделал со всеми 28 функциями, такими же, как данные DataFrame от Andrew. К сожалению, у меня есть другой результат, как вы можете увидеть ниже:
FInal Result
Как вы можете видеть, у меня есть более высокую точность, но моя стоимость остается выше, чем ожидалось, что: 0,52900
Мои намерение не умалять качество кода блога. Я все еще следую его шагам по другим учебникам и кажется хорошим источником.
Ниже приведена ссылка на мой код, я использую fmin_tnc так же, как он делает. Я просто создал более векторную функцию gradient_function. Имя файла логистической регрессия Regularized.py

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

ответ

0

Проблема заключается в том, что я использую питон 3.6 и Автор использует питон 2.7.X. Изменение версии на python 2.7.13 решило эту проблему.

 Смежные вопросы

  • Нет связанных вопросов^_^