import numpy as np
import matplotlib.pyplot as plt
def generate_data(seed,data_size1,data_size2):
np.random.seed(seed)
# class 1
datas_size_1 = data_size1
# feature 1
x1_1 = np.random.normal(loc = 5.0,scale = 1.0, size = datas_size_1)
# feature 2
x2_1 = np.random.normal(loc = 4.0,scale=1.0,size = datas_size_1)
y_1 = [0 for i in range(datas_size_1)]
# class 2
datas_size_2 = data_size2
# feature 1
x1_2 = np.random.normal(loc = 5.0,scale=2.0,size=datas_size_2)
# feature 2
x2_2 = np.random.normal(loc = 4.0,scale = 2.0,size=datas_size_2)
y_2 = [1 for i in range(datas_size_2)]
#concatenate
# 得到所有样本的第一个特征
x1 = np.concatenate((x1_1,x1_2),axis = 0)
# 所有样本的第二个特征
x2 = np.concatenate((x2_1,x2_2),axis = 0)
#合成为一个整的数据集,变为二维矩阵
x = np.hstack((x1.reshape(-1,1),x2.reshape(-1,1)))
y = np.concatenate((y_1,y_2),axis = 0)
#总的数据
data_size_all = datas_size_1+datas_size_2
# 打乱数据
shuffle_index = np.random.permutation(data_size_all)
x = x[shuffle_index]
y = y[shuffle_index]
return x,y
# 计算梯度
def cal_gradient(X,Y,W,b):
predict = 1/(1+np.exp(-(X.dot(W)+b)))
w_gradient = (predict-Y).dot(X)
b_gradient = (predict-Y).sum()
return w_gradient,b_gradient
# 生成训练样本和测试样本
train_data,train_target = generate_data(321,300,400)
test_data,test_target = generate_data(432,200,100)
itermax = 1000
Loss = 0
W = np.zeros((2))
b = 0.5
error = 1e-6
lr = 0.001
Loss_his = []
for i in range(itermax):
predict = 1/(1+np.exp(-(train_data.dot(W)+b)))
w_g = np.zeros(W.shape)
b_g = np.zeros((1))
w_g,b_g = cal_gradient(train_data,train_target,W,b)
W = W - lr * w_g
b = b - lr * b_g
test_result = 1/(1+np.exp(-(test_data.dot(W)+b)))
test_predict = np.zeros(test_result.shape)
for i in range(len(test_result)):
if(test_result[i] >= 0.5):
test_predict[i] = 1
else:
test_predict[i] = 0
score = 0
for i in range(len(test_predict)):
if(test_predict[i] == test_target[i]):
score += 1
plt.plot(test_data[:][0],test_data[:][1],'r')
plt.show()
precise = score/len(test_predict)
print(precise)