import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
Num = 100 #共100个点
# X(x1,x2) y 0/1
# y = 1
x_1 = np.random.normal(6,1,size=(Num))#6是中心点,1是方差
x_2 = np.random.normal(3,1,size=(Num))
y = np.ones(Num)
c_1 = np.array([x_1,x_2,y])
c_1.shape
(3, 100)
# y = 0
# y = 1
x_1 = np.random.normal(3,1,size=(Num))
x_2 = np.random.normal(6,1,size=(Num))
y = np.zeros(Num)
c_0 = np.array([x_1,x_2,y])
c_0.shape
(3, 100)
c_1 = c_1.T
c_0 = c_0.T
plt.scatter(c_1[:,0],c_1[:,1])
plt.scatter(c_0[:,0],c_0[:,1],marker='+')
<matplotlib.collections.PathCollection at 0x21813734ac8>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-94mCM4mX-1588587870627)(output_5_1.png)]
All_data = np.concatenate((c_1,c_0))
All_data.shape
(200, 3)
np.random.shuffle(All_data)
train_data_X = All_data[:150,:2] # [)
train_data_y = All_data[:150,-1]
test_data_X = All_data[150:,:2]
test_data_y = All_data[150:,-1]
train_data_X.shape,train_data_y.shape
((150, 2), (150,))
# y = w1*x1+w2*x2
W = np.random.rand(2,1)
W
array([[0.86686091],
[0.81615075]])
# y = w1*x1+w2*x2 = 0
# w1*x+w2*y=0
plt.scatter(c_1[:,0],c_1[:,1])
plt.scatter(c_0[:,0],c_0[:,1],marker='+')
x = np.arange(10)
y = -(W[0]*x)/W[1]
plt.plot(x,y)
[<matplotlib.lines.Line2D at 0x21814304408>]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xadlUaPy-1588587870639)(output_10_1.png)]
# 定义损失函数 交叉熵
def cross_entropy(y,y_hat):
return -np.mean(y*np.log(y_hat) + (1-y)*np.log(1-y_hat))
# y_hat = sigmoid(w*x)
def sigmoid(z):
return 1./(1+np.exp(-z))
W.shape,train_data_X.shape
((2, 1), (150, 2))
lr = 0.001
loss_list = []
for i in range(1000):
# 计算loss
y_hat = sigmoid(np.dot(W.T,train_data_X.T))
loss = cross_entropy(train_data_y,y_hat)
# 计算梯度
grad = -np.mean((train_data_X*(train_data_y-y_hat).T),axis=0)
# 更新w
W = W-(lr*grad).reshape(2,1)
loss_list.append(loss)
# 输出
if i%10 == 1:
print("i: %d,loss: %f"%(i,loss))
if loss<0.1:
break
i: 1,loss: 0.217137
i: 11,loss: 0.216047
i: 21,loss: 0.214970
i: 31,loss: 0.213906
i: 41,loss: 0.212855
i: 51,loss: 0.211816
i: 61,loss: 0.210789
i: 71,loss: 0.209774
i: 81,loss: 0.208771
i: 91,loss: 0.207779
i: 101,loss: 0.206799
i: 111,loss: 0.205830
i: 121,loss: 0.204871
i: 131,loss: 0.203924
i: 141,loss: 0.202987
i: 151,loss: 0.202060
i: 161,loss: 0.201144
i: 171,loss: 0.200238
i: 181,loss: 0.199341
i: 191,loss: 0.198455
i: 201,loss: 0.197578
i: 211,loss: 0.196710
i: 221,loss: 0.195851
i: 231,loss: 0.195002
i: 241,loss: 0.194162
i: 251,loss: 0.193330
i: 261,loss: 0.192507
i: 271,loss: 0.191693
i: 281,loss: 0.190887
i: 291,loss: 0.190089
i: 301,loss: 0.189299
i: 311,loss: 0.188518
i: 321,loss: 0.187744
i: 331,loss: 0.186978
i: 341,loss: 0.186220
i: 351,loss: 0.185469
i: 361,loss: 0.184725
i: 371,loss: 0.183989
i: 381,loss: 0.183261
i: 391,loss: 0.182539
i: 401,loss: 0.181824
i: 411,loss: 0.181116
i: 421,loss: 0.180415
i: 431,loss: 0.179721
i: 441,loss: 0.179033
i: 451,loss: 0.178351
i: 461,loss: 0.177676
i: 471,loss: 0.177008
i: 481,loss: 0.176345
i: 491,loss: 0.175689
i: 501,loss: 0.175039
i: 511,loss: 0.174395
i: 521,loss: 0.173756
i: 531,loss: 0.173123
i: 541,loss: 0.172497
i: 551,loss: 0.171875
i: 561,loss: 0.171260
i: 571,loss: 0.170649
i: 581,loss: 0.170045
i: 591,loss: 0.169445
i: 601,loss: 0.168851
i: 611,loss: 0.168262
i: 621,loss: 0.167678
i: 631,loss: 0.167099
i: 641,loss: 0.166525
i: 651,loss: 0.165956
i: 661,loss: 0.165392
i: 671,loss: 0.164833
i: 681,loss: 0.164278
i: 691,loss: 0.163728
i: 701,loss: 0.163183
i: 711,loss: 0.162642
i: 721,loss: 0.162106
i: 731,loss: 0.161574
i: 741,loss: 0.161046
i: 751,loss: 0.160523
i: 761,loss: 0.160004
i: 771,loss: 0.159490
i: 781,loss: 0.158979
i: 791,loss: 0.158473
i: 801,loss: 0.157971
i: 811,loss: 0.157472
i: 821,loss: 0.156978
i: 831,loss: 0.156488
i: 841,loss: 0.156001
i: 851,loss: 0.155518
i: 861,loss: 0.155039
i: 871,loss: 0.154564
i: 881,loss: 0.154092
i: 891,loss: 0.153624
i: 901,loss: 0.153160
i: 911,loss: 0.152699
i: 921,loss: 0.152242
i: 931,loss: 0.151788
i: 941,loss: 0.151338
i: 951,loss: 0.150891
i: 961,loss: 0.150447
i: 971,loss: 0.150007
i: 981,loss: 0.149570
i: 991,loss: 0.149136
plt.plot(loss_list)
[<matplotlib.lines.Line2D at 0x218148e0e08>]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sghKQitC-1588587870645)(output_15_1.png)]
plt.scatter(c_1[:,0],c_1[:,1])
plt.scatter(c_0[:,0],c_0[:,1],marker='+')
x = np.arange(10)
y = -(W[0]*x)/W[1]
plt.plot(x,y)
[<matplotlib.lines.Line2D at 0x21815346d48>]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iXal7ngM-1588587870654)(output_16_1.png)]
# 预测
# y_hat=w1*x1+w2*x2
test_data_X.shape
(50, 2)
y_hat = np.dot(W.T,test_data_X.T)
y_pred = np.array(y_hat>0,dtype=int).flatten()
y_pred.shape
test_acc = np.sum(test_data_y==y_pred)/len(y_pred)
test_acc
1.0