# -*- coding: utf-8 -*-
"""
Created on Mon Dec  9 15:43:11 2019

@author: 64054
"""

import numpy as np
from keras.models import Sequential 
from keras.layers import Dense
import matplotlib.pyplot as plt

print('Data -----------')
#构建训练数据和测试数据 (100个点)
number=100

list_x = []
list_y = []

for i in range(number):
    #返回[0,1)的随机x,不给维度就是数字,给维度就是返回对应维度的随机值
    x = np.random.randn()
    #这里构建的数据的分布满足y=2*x+3 增加了一些噪点
    y = 2*x+3+np.random.randn()*1
    list_x.append(x)
    list_y.append(y)
print(list_x)
print('\n')
print(list_y)

plt.scatter(list_x, list_y)
plt.show()

print('Model -----------')
 # 把前80个数据放到训练集
X_train, Y_train = list_x[:80], list_y[:80] 
# 把后20个点放到测试集   
X_test, Y_test = list_x[80:], list_y[80:]   

# 定义一个模型
# Keras 单输入单输出的线性序列模型 Sequential,
model = Sequential () 
#设置模型
#通过add()方法一层层添加模型,Dense是全连接层,第一层需要定义输入,
model.add(Dense(output_dim=1, input_dim=1)) 

#选择损失函数和优化器
model.compile(loss='mse', optimizer='sgd')
# 开始训练
print('Training -----------')
for step in range(200):
    cost = model.train_on_batch(X_train, Y_train) # Keras有很多开始训练的函数,这里用train_on_batch()
    if step % 20 == 0:
        print('train cost: ', cost)
# 查看训练出的网络参数:权重和偏移
W, b = model.layers[0].get_weights()   
print('Weights=', W, '\nbiases=', b)

# 测试训练好的模型
print('\nTesting ------------')
cost = model.evaluate(X_test, Y_test, batch_size=20)
print('test cost:', cost)
#预测值
Y_pred = model.predict(X_test)
#画图(蓝点,红线)
plt.scatter(X_test, Y_test, c='b', marker='o', label='real data')
plt.plot(X_test, Y_pred, c='r', label='predicted data')
plt.show()