import numpy as np
import random
# 激活函数
def activation(activationType, x):
if activationType == "sigmoid":
return 1 / (1 + np.exp(-x))
elif activationType == "tanh":
return np.tanh(x)
else:
print("暂无其他激活函数,请重新选择")
# 求导
def derivativeOfActivation(activationType, y):
# y=activation(activation,x)
if activationType == "sigmoid":
return y * (1 - y)
elif activationType == "tanh":
return 1 - np.power(y, 2)
else:
print("暂无其他激活函数导数,请重新选择")
def activation_derivative(activationType, x):
if activationType == "sigmoid":
return sigmoid(x) * (1 - sigmoid(x)) # sigmoid 函数的导数
elif activationType == "tanh":
return 1 - np.tanh(x) ** 2 # tanh 函数的导数
else:
raise ValueError("Unknown activation type: %s" % (activationType))
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# 构建3层BP的弱分类器
# 输入->隐藏层->输出层
class BPNN(object):
def __init__(self, iN, wHN, oN, activationType="sigmoid", eta=0.01, n_iter=10):
'''
eta:学习率
n_iter:迭代次数
iN:输入层结点数目
wHN:隐藏层结点的数目
oN:输出层结点的数目
'''
self.eta = eta # 0.01
self.activationType = activationType
self.n_iter = n_iter
self.iN_ = iN;
self.wHN_ = wHN;
self.oN_ = oN;
random.seed(10)
self.weightIToH_ = 0.1 * np.random.randn(self.wHN_, self.iN_) # 输入层到隐藏层的权重矩阵hidden*input h*i
self.weightHToO_ = 0.1 * np.random.randn(self.oN_, self.wHN_) # 隐藏层到输出层的权重矩阵output*hidden o*h
self.b1 = np.zeros((1, self.wHN_)) # 存放输入层到隐藏层的偏移b1,1*hidden 1*h
self.b2 = np.zeros((1, self.oN_)) # 存放隐藏层到输出层的偏移b2,1*output 1*o
def loss(self, x, y, lamba=0):
'''
x:m,n
y:m,1
'''
n_train, n_features = x.shape
# 前向传播
t = (np.dot(x, self.weightIToH_.T) + self.b1) # 输入层到隐藏层的结果
a1 = activation(self.activationType, t) # 隐藏层的输出结果
a2 = activation(self.activationType, np.dot(a1, self.weightHToO_.T) + self.b2) # 输出层的输出结果
loss = 0.5 * np.sum((a2 - y) ** 2) / n_train
loss += 0.5 * lamba * (
np.sum(self.weightIToH_ * self.weightIToH_) + np.sum(self.weightHToO_ * self.weightHToO_)) / n_train
# backward后向传播过程
delta2 = (a2 - y) * activation_derivative(self.activationType,
np.dot(a1, self.weightHToO_.T) + self.b2) # 输出层的误差
dWeightHToO = np.dot(delta2.T, a1) # 隐藏层到输出层的权重矩阵的梯度
db2 = np.sum(delta2, axis=0) # 隐藏层到输出层的偏移的梯度
delta1 = np.dot(delta2, self.weightHToO_) * activation_derivative(self.activationType, t) # 隐藏层的误差
dWeightIToH = np.dot(delta1.T, x) # 输入层到隐藏层的权重矩阵的梯度
db1 = np.sum(delta1, axis=0) # 输入层到隐藏层的偏移的梯度
dWeightIToH /= n_train
dWeightHToO /= n_train
db1 /= n_train
db2 /= n_train
return loss, dWeightIToH, dWeightHToO, db1, db2
def train(self, x, y):
loss_list = [] # 存放损失函数
errors_samples = [] # 存放分类错误的样本数据
errors_labels = [] # 存放分类错误的样本数据的正确值的标签
true_samples = [] # 存放分类正确的样本数据
true_labels = [] # 存放分类正确的样本数据的正确值的标签
for i in range(self.n_iter):
loss, dw1, dw2, db1, db2 = self.loss(x, y)
loss_list.append(loss)
self.weightIToH_ += -self.eta * dw1
self.weightHToO_ += -self.eta * dw2
self.b1 += -self.eta * db1
self.b2 += -self.eta * db2
if i % 10 == 0:
print("i=%d,loss=%f" % (i, loss))
for i in range(x.shape[0]):
if y[i, :] != self.generatePredictYMul(x)[i, :]:
errors_samples.append(x[i, :])
errors_labels.append(y[i, :])
else:
true_samples.append(x[i, :])
true_labels.append(y[i, :])
return loss_list, errors_samples, true_samples, errors_labels, true_labels
def generatePredictYMul(self, x):
mulIToH = activation(self.activationType, (np.dot(x, self.weightIToH_.T) + self.b1)) # 隐藏层输出结果m*hidden
mulHToO = activation(self.activationType, (np.dot(mulIToH, self.weightHToO_.T) + self.b2)) # 输出层输出结果m*output
return np.sign(mulHToO)
from sklearn.datasets import load_iris, load_breast_cancer
from sklearn.model_selection import train_test_split
data = load_breast_cancer()
x = data.data
y = data.target
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=888)
print(X_train.shape, X_test.shape)
bp = BPNN(30, 100, 1, eta=0.01, n_iter=100)
loss_list, errors_samples, true_samples, errors_labels, true_labels = bp.train(X_train,
y_train.reshape(y_train.shape[0], 1))
import matplotlib.pyplot as plt
plt.plot(loss_list, label='train_loss')
plt.title('loss')
plt.xlabel('iters')
plt.ylabel('loss')
plt.legend()
plt.show()
机器学习-十大人工智能算法
需积分: 1 3 浏览量
2024-04-05
11:15:19
上传
评论
收藏 343KB RAR 举报
张謹礧
- 粉丝: 1w+
- 资源: 24
最新资源
- 基于matlab实现夜间车牌识别程序(1).rar
- 基于matlab实现图像处理,本程序使用背景差分法对来往车辆进行检测和跟踪.rar
- 基于matlab实现视频监控中车型识别代码,自己写的,希望和大家多多交流.rar
- sdk.config
- 基于matlab实现配电网三相潮流计算方法,对几种常用的配电网潮流计算方法进行了对比分析.rar
- 基于matlab实现配电网潮流 经典33节点 前推回代法潮流计算 回代电流 前推电压 带注释.rar
- 基于matlab实现模拟退火遗传算法的车辆调度问题研究,用MATLAB语言加以实现.rar
- 基于matlab实现蒙特卡洛的的移动传感器节点定位算法仿真代码.rar
- 华中数控系统818用户说明书
- 基于matlab实现卡尔曼滤波器完成多传感器数据融合 对多个机器人的不同传感器数据进行融合估计足球精确位置.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈