神经网络
- 分层
- 层与层之间有连接
- 神经元模型
激活函数:
AND运算
特征一 | 特征二 | 分类 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
线性函数:
y=x1w1+x2w2+b
- x1和x2为特征值
- w1和w2为权重 随机生成 不为0但是无限接近0的正态分布(0均值,标准差为0~1之间的小数)
- b 阈值 随机生成 不为0但是无限接近0的正态分布(0均值,标准差为0~1之间的小数)
代码步骤:
- 倒入库
- 数据预处理:加载数据,分割数据,数据可视化
- 构建神经网络
- 训练模型
- 优化
- 性能评估
import numpy as np
import tensorflow as tf
x = [[0, 0], [1, 0], [0, 1], [1, 1], [1, 1], [0, 0]]
y = [0, 0, 0, 1, 1, 0]
层:指的是输入和输出之间的一次运算,几次运算
分析
weights = np.random.normal(0, 0.001, size=[np.array(x).shape[1], 1])
bias = np.random.normal(0,0.001,size=1)
阈值:可以赋值为1或0.5
激活函数
优化
- 反向传播算法:通过预测结果计算预测的误差,根据误差反向调整权重参数和阈值
- T度下降 山顶 到 山底 找到 最优的路径 速度不能太慢 下降的步子不能太大
- 步子的大小用学习速率rate
调整weights和阈值的正确性
def update_theta(pred, y_true, rate, vec):
'''
:param pred: 预测结果
:param y_true: 正确标签值
:param rate: 学习速率,优化速度
:param vec: 输入值
:param theta: weights
:param b: 阈值
:return:
'''
loss = y_true - pred
global weights
weights = list(map(lambda x1: x1[0] + x1[1] * loss * rate,
list(zip(weights, vec))
))
# for x1 in list(zip(weights,vec)):
# print(x1[0],x1[1])
global bias
bias = bias + loss * rate
# print(list(zip(weights, vec)))
# print(vec)
线性函数:
def f(lin_r):
return 1 if lin_r > 0 else 0
def predict(vec, theta, b):
'''
:param vec: 输入的特征向量
:param theta: 权重
:param b: 阈值
:return: 预测结果
'''
return f(np.dot(vec, theta) + b)
训练数据
def one_iter():
samples = zip(x, y)
for v, lbl in samples:
pred = predict(v, weights, bias)
update_theta(pred, lbl, 0.1, v)
for i in range(1000):
one_iter()
测试数据
# 测试
input_x = [1, 0]
output_y = predict(input_x, weights, bias)
print(output_y)