吳恩達 machine learning 編程作業 python實現 ex2

# -*- coding: utf-8 -*-
"""
Created on Tue Jun 30 16:41:10 2020

@author: cheetah023
"""


import numpy as np
import matplotlib.pyplot as plt
import scipy.optimize as opt

#函數定義
def sigmoid(X):
    return 1 /(1 + np.exp(-X))
def costFunction(theta, X, y, lamda):
    theta = np.reshape(theta,(X.shape[1],1))
    sig = sigmoid(np.dot(X,theta))
    m = X.shape[0]
    #不能用theta[0]=0來算,會出錯
    #theta[0] = 0
    cost = (np.dot(-y.T,np.log(sig)) - np.dot(1-y.T,np.log(1-sig))) / m
    cost = cost + np.dot(theta.T[0,1:],theta[1:,0]) * lamda / (2 * m)
    return cost
def gradient(theta, X, y, lamda):
    theta = np.reshape(theta,(X.shape[1],1))
    m = X.shape[0]
    sig = sigmoid(np.dot(X,theta))
    #這裏不reshape的話,執行opt.minimize
    #會報錯ValueError: tnc: invalid gradient vector from minimized function.
    #sig = np.reshape(sig,(m,1))
    theta[0] = 0
    grad = np.zeros([X.shape[1],1])
    grad = np.dot(X.T,(sig - y)) / m 
    grad = grad + theta * lamda / m
    return grad
def plotDecisionBoundary(theta, X, y):
    x1_min = np.min(X[:,1])
    x1_max = np.max(X[:,1])
    x1 = np.arange(x1_min, x1_max,0.5)
    x2 = -(theta[0] + theta[1] * x1) / theta[2]
    plt.plot(x1,x2,'-')
    plt.legend(['decision boundary','Admitted','not Admitted'],loc='upper right')
def plotdata(X, y):
    postive = np.where(y > 0.5)
    negtive = np.where(y < 0.5)
    #postive和negtive包含兩個元組,取第一個元組postive[0]和negtive[0]
    plt.scatter(X[postive[0],0],X[postive[0],1],marker='o',c='g')
    plt.scatter(X[negtive[0],0],X[negtive[0],1],marker='x',c='r')
    
#Part 1: Plotting
data = np.loadtxt('ex2data1.txt',delimiter=',')
X = data[:,0:2]
y = data[:,2:3]
print('X:',X.shape)
print('y:',y.shape)

plotdata(X, y)
plt.xlabel('exam 1 score')
plt.ylabel('exam 2 score')
plt.legend(['Admitted','not Admitted'],loc='upper right')

#Part 2: Compute Cost and Gradient
[m,n] = X.shape
ones = np.ones((m,1))
X = np.column_stack((ones,X))
initial_theta = np.zeros((n+1,1))
lamda = 0
cost = costFunction(initial_theta, X, y,lamda)
grad = gradient(initial_theta, X, y,lamda)
print("Cost at initial theta (zeros):",cost)
print('Expected cost (approx): 0.693')
print('Gradient at initial theta (zeros):\n',grad)
print('Expected gradients (approx):\n -0.1000\n -12.0092\n -11.2628')


test_theta =[[-24],[0.2],[0.2]]
cost = costFunction(test_theta, X, y, lamda)
grad = gradient(test_theta, X, y, lamda)
print('Cost at test theta:',cost)
print('Expected cost (approx): 0.218')
print('Gradient at test theta:\n',grad)
print('Expected gradients (approx):\n 0.043\n 2.566\n 2.647')
#Part 3: Optimizing using fminunc

result = opt.minimize(fun=costFunction,
                      x0=initial_theta,
                      args=(X,y,lamda), 
                      method='TNC', 
                      jac=gradient)
print('Cost at theta found by fminunc:',result.fun)
print('Expected cost (approx): 0.203')
print('theta:',result.x)
print('Expected theta (approx):')
print('-25.161\n 0.206\n 0.201')
#Plot Boundary
theta = result.x
plotDecisionBoundary(theta, X, y)
plt.legend(['decision boundary','Admitted','not Admitted'],loc='upper right')
#Part 4: Predict and Accuracies
prob = sigmoid(np.dot([1,45,85],theta))
print('For a student with scores 45 and 85, we predict an admission')
print('probability of',prob)

h = sigmoid(np.dot(X,theta))
index = np.where(h >= 0.5)
p = np.zeros([m,1])
p[index] = 1
prob = np.mean(np.double(p==y)) * 100
print('Train Accuracy:',prob)
print('Expected accuracy (approx): 89.0')


運行結果:

X: (100, 2)
y: (100, 1)
Cost at initial theta (zeros): [[0.69314718]]
Expected cost (approx): 0.693
Gradient at initial theta (zeros):
 [[ -0.1       ]
 [-12.00921659]
 [-11.26284221]]
Expected gradients (approx):
 -0.1000
 -12.0092
 -11.2628
Cost at test theta: [[0.21833019]]
Expected cost (approx): 0.218
Gradient at test theta:
 [[0.04290299]
 [2.56623412]
 [2.64679737]]
Expected gradients (approx):
 0.043
 2.566
 2.647
Cost at theta found by fminunc: [[0.2034977]]
Expected cost (approx): 0.203
theta: [-25.16131857   0.20623159   0.20147149]
Expected theta (approx):
-25.161
 0.206
 0.201
For a student with scores 45 and 85, we predict an admission
probability of 0.7762906213164001
Train Accuracy: 89.0
Expected accuracy (approx): 89.0

參考資料:

https://blog.csdn.net/lccflccf/category_8379707.html

https://blog.csdn.net/Cowry5/article/details/83302646

https://blog.csdn.net/weixin_44027820/category_9754493.html
 

總結:

1、遇到的最大的坑是opt.minimize報錯ValueError: tnc: invalid gradient vector from minimized function.通過reshape解決

2、cost的計算結果錯誤,theta[0]=0帶進去計算導致的,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章