sigmoid函数定义:
def sigmoid(z):
# your code here (appro ~ 1 lines)
gz = 1/(1+np.exp(-z))
return gz
绘图:
fig, ax = plt.subplots(figsize=(8, 6))
ax.plot(np.arange(-10, 10, step=0.01),
sigmoid(np.arange(-10, 10, step=0.01)))
ax.set_ylim((-0.1,1.1))
ax.set_xlabel('z', fontsize=18)
ax.set_ylabel('g(z)', fontsize=18)
ax.set_title('sigmoid function', fontsize=18)
plt.show()
代码实现:
初始化thetatheta=np.zeros(n)
(这里X为m * n 所以theta 是n * 1,注意这里n需要根据x的列来修改)
def cost(theta, X, y):
cost1 = np.log(1-sigmoid(X.dot(theta))).dot(-y)
cost2 = np.log(1-sigmoid(X.dot(theta))).dot(1-y)
costf = (cost1-cost2)/len(X)
return costf
注意X.dot(theta)与X*theta的区别
x的每一行表示一组数据,每一列表示一个特征
z = x.dot(theta) 为类似与线性回归中的预测值
经过sigmoid函数映射为值在(-1,1)
代码实现:
def gradient(theta, X, y):
grad = X.T.dot((sigmoid(X.dot(theta)-y)))/len(X)
return grad
参数拟合:
这里我使用 scipy.optimize.minimize 去寻找参数
import scipy.optimize as opt
res = opt.minimize(fun=cost, x0=theta, args=(X, y), method='Newton-CG', jac=gradient)