项目 | 内容 |
---|---|
这个作业属于哪个课程 | 人工智能实战2019 |
这个作业的要求在哪里 | 第五次作业:实现逻辑与门、逻辑或门 |
我在这个课程的目标是 | 了解人工智能,提高编程能力 |
这个作业在哪个具体方面帮助我实现目标 | 理解线性二分类 |
代码
import numpy as np
import matplotlib.pyplot as plt
def ReadData():
X = np.array([0,0,1,1,0,1,0,1]).reshape(2,4)
Y = np.array([0,0,0,1]) #逻辑与门
Y = np.array([0,1,1,1]) #逻辑或门
return X,Y
def Initialize(num_features):
W = np.zeros((1,num_features))
B = np.zeros((1,1))
eta = 0.1
max_epoch = 10000
return W,B,eta,max_epoch
def Sigmoid(z):
s=1/(1+np.exp(-z))
return s
def ForwardCalculationBatch(W, B, X):
Z = np.dot(W, X) + B
A = Sigmoid(Z)
return A
def CheckLoss(Y, A, num_example):
p1 = 1 - Y
p2 = np.log(1-A)
p3 = np.log(A)
p4 = np.multiply(p1 ,p2)
p5 = np.multiply(Y, p3)
LOSS = np.sum(-(p4 + p5))
loss = LOSS / num_example
return loss
def BackPropagationBatch(X, Y, A, m):
dZ = A - Y
dB = dZ.sum(axis = 1, keepdims = True)/m
dW = np.dot(dZ, X.T)/m
return dW, dB
def UpdateWeights(eta, dW, dB, W, B):
W = W - eta*dW
B = B - eta*dB
return W, B
def ShowResult(X,Y,W,B):
for i in range(X.shape[1]):
if Y[i] == 0:
plt.plot(X[0,i], X[1,i], '.', c='r')
elif Y[i] == 1:
plt.plot(X[0,i], X[1,i], 'x', c='g')
w12 = -W[0,0]/W[0,1]
b12 = -B[0,0]/W[0,1]
x = np.linspace(0,1,10)
y = w12 * x + b12
plt.plot(x,y)
plt.axis([-0.1,1.1,-0.1,1.1])
plt.show()
if __name__ == '__main__':
X,Y = ReadData()
num_features = X.shape[0]
num_example = X.shape[1]
W,B,eta,max_epoch = Initialize(num_features)
for epoch in range(max_epoch):
for k in range(num_example):
A = ForwardCalculationBatch(W, B, X)
dW,dB = BackPropagationBatch(X, Y, A, num_example)
W,B = UpdateWeights(eta, dW, dB, W, B)
loss = CheckLoss(Y, A, num_example)
if loss <= 1e-2:
break
print('W=',W)
print("B=",B)
print('loss=',loss)
print("epcoh=",epoch)
ShowResult(X,Y,W,B)
输出结果
逻辑与门
W= [[8.53453131 8.53453131]]
B= [[-12.97250432]]
loss= 0.009999415617868365
逻辑或门
W= [[8.51552387 8.51552387]]
B= [[-3.79206528]]
loss= 0.009998201724120605