In [10]:
import numpy as np
import perceptron
import matplotlib.pyplot as plt

# 数据是二维的,在二维平面上用直线y=x分开

# 生成正样本的训练和测试数据集
postive_X = np.random.random(1000)*10
postive_Y = np.random.random(1000)*10
index = (postive_Y - postive_X) > 1
postive_X = postive_X[index]
postive_Y = postive_Y[index]
postive_dat = np.vstack((postive_X, postive_Y)).T
pos_test, pos_train = np.vsplit(postive_dat, [int(postive_dat.shape[0]*0.1)])

#生成负样本的训练和测试数据集
negtive_X = np.random.random(1000)*10
negtive_Y = np.random.random(1000)*10
index = (negtive_Y - negtive_X) < -1
negtive_X = negtive_X[index]
negtive_Y = negtive_Y[index]
negtive_dat = np.vstack((negtive_X, negtive_Y)).T
neg_test, neg_train = np.vsplit(negtive_dat, [int(negtive_dat.shape[0]*0.1)])

# 显示数据的分布
plt.scatter(postive_X, postive_Y, marker='+', c='b')
plt.scatter(negtive_X, negtive_Y, marker='_', c='r')
truth_X = np.arange(0, 10, 0.5)
plt.plot(truth_X, truth_X, c='g')
#plt.show()

# 生成训练和测试数据集
train_feature = np.vstack((pos_train, neg_train))
train_label = np.vstack((np.ones((pos_train.shape[0], 1)),
                        -np.ones((neg_train.shape[0], 1))))
print("训练样本个数:%d。其中正样本: %d, 负样本:%d."%
      (train_label.shape[0], pos_train.shape[0],
       neg_train.shape[0]))
test_feature = np.vstack((pos_test, neg_test))
test_label = np.vstack((np.ones((pos_test.shape[0], 1)),
                       -np.ones((neg_test.shape[0], 1))))
print("测试样本个数:%d。其中正样本:%d,负样本:%d。"%
      (test_label.shape[0], pos_test.shape[0],
       neg_test.shape[0]))

# 训练和测试
model = perceptron.Perceptron(eta=0.01)
model.fit(train_feature, train_label)
print("训练结束。")
pred = model.predict(test_feature)
acc = np.sum(test_label == pred)/pred.shape[0]
print("准确率: %f."%acc)

# 绘制模型拟合的分界线
w, b = model.get_params()
a, c = w[0,0], w[1, 0]
b = b[0, 0]
a = -a/c
b = b/c
fit_X = np.arange(0, 10, 0.5)
fit_Y = np.array(fit_X)*a+b
plt.plot(fit_X, fit_Y, c='y')
plt.show()


训练样本个数:737。其中正样本: 353, 负样本:384.
测试样本个数:81。其中正样本:39,负样本:42。
训练结束。
准确率: 1.000000.

In [ ]:


In [ ]: