本文介绍了Logistic回归梯度下降的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我必须使用批量梯度下降进行Logistic回归。
import numpy as np
X = np.asarray([
[0.50],[0.75],[1.00],[1.25],[1.50],[1.75],[1.75],
[2.00],[2.25],[2.50],[2.75],[3.00],[3.25],[3.50],
[4.00],[4.25],[4.50],[4.75],[5.00],[5.50]])
y = np.asarray([0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1])
m = len(X)
def sigmoid(a):
return 1.0 / (1 + np.exp(-a))
def gradient_Descent(theta, alpha, X , y):
for i in range(0,m):
cost = ((-y) * np.log(sigmoid(X[i]))) - ((1 - y) * np.log(1 - sigmoid(X[i])))
grad = theta - alpha * (1.0/m) * (np.dot(cost,X[i]))
theta = theta - alpha * grad
return
gradient_Descent(0.1,0.005,X,y)
我必须这样做,但我似乎不明白如何使它工作。
推荐答案
看起来您在这里搞混了一些东西。在执行此操作时,跟踪向量的形状并确保获得合理的结果是至关重要的。例如,您使用:
计算成本cost = ((-y) * np.log(sigmoid(X[i]))) - ((1 - y) * np.log(1 - sigmoid(X[i])))
在您的例子中y
是具有20个项的向量,而X[i]是单个值。这使得您的成本计算是一个20个项目的矢量,这是没有意义的。你的成本应该是单一价值。(在您的梯度下降函数中,您还无缘无故地多次计算这一成本)。
X
添加偏倚项。那么让我们从这里开始吧。
X = np.asarray([
[0.50],[0.75],[1.00],[1.25],[1.50],[1.75],[1.75],
[2.00],[2.25],[2.50],[2.75],[3.00],[3.25],[3.50],
[4.00],[4.25],[4.50],[4.75],[5.00],[5.50]])
ones = np.ones(X.shape)
X = np.hstack([ones, X])
# X.shape is now (20, 2)
Theta现在每个X需要2个值。因此初始化该值和Y:
Y = np.array([0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1]).reshape([-1, 1])
# reshape Y so it's column vector so matrix multiplication is easier
Theta = np.array([[0], [0]])
你的乙状结肠功能很好。让我们也做一个向量化的成本函数:
def sigmoid(a):
return 1.0 / (1 + np.exp(-a))
def cost(x, y, theta):
m = x.shape[0]
h = sigmoid(np.matmul(x, theta))
cost = (np.matmul(-y.T, np.log(h)) - np.matmul((1 -y.T), np.log(1 - h)))/m
return cost
成本函数之所以有效,是因为Theta
的形状为(2,1),X
的形状为(20,2),因此matmul(X, Theta)
将为(20,1)形状。然后矩阵乘以Y的转置(y.T
形状是(1,20)),得到单个值,我们的成本给定了特定值Theta。
然后我们可以编写一个函数来执行批处理梯度下降的单个步骤:
def gradient_Descent(theta, alpha, x , y):
m = x.shape[0]
h = sigmoid(np.matmul(x, theta))
grad = np.matmul(X.T, (h - y)) / m;
theta = theta - alpha * grad
return theta
请注意,np.matmul(X.T, (h - y))
将形状(2,20)和(20,1)相乘,得到的形状为(2,1)-与Theta
的形状相同,这是您希望从渐变中获得的形状。这让你可以用你的学习速度乘以IS,然后从初始的Theta中减去它,这就是梯度下降应该做的事情。
所以现在您只需编写一个循环进行多次迭代,并更新Theta,直到它看起来收敛:
n_iterations = 500
learning_rate = 0.5
for i in range(n_iterations):
Theta = gradient_Descent(Theta, learning_rate, X, Y)
if i % 50 == 0:
print(cost(X, Y, Theta))
这将每50次打印一次成本,导致成本稳步下降,这正是您所希望的:
[[ 0.6410409]]
[[ 0.44766253]]
[[ 0.41593581]]
[[ 0.40697167]]
[[ 0.40377785]]
[[ 0.4024982]]
[[ 0.40195]]
[[ 0.40170533]]
[[ 0.40159325]]
[[ 0.40154101]]
您可以尝试Theta
的不同初始值,您将看到它总是收敛到同一个项。
现在您可以使用新找到的Theta
值进行预测:
h = sigmoid(np.matmul(X, Theta))
print((h > .5).astype(int) )
这将打印您对数据的线性拟合所期望的结果:
[[0]
[0]
[0]
[0]
[0]
[0]
[0]
[0]
[0]
[0]
[1]
[1]
[1]
[1]
[1]
[1]
[1]
[1]
[1]
[1]]
这篇关于Logistic回归梯度下降的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!