在人工智能的奇妙世界里,多层感知器就像是一个智慧的 “大脑”,发挥着至关重要的作用。接下来,就让我们一起揭开它的神秘面纱。
从生物神经元到人工神经元
大家都知道,我们人类的大脑中有数以亿计的神经元,它们相互连接,构成了一个超级复杂的网络。当我们看到一朵花时,眼睛接收到花的图像信息,这些信息就会通过神经元之间的连接,在大脑中进行处理,最终让我们识别出这是一朵花。
科学家们受到生物神经元的启发,创造出了人工神经元。人工神经元就像是一个小小的信息处理单元,它会接收多个输入信息,然后根据一定的规则对这些信息进行处理,最后输出一个结果。我们可以把它想象成一个小法官,根据不同的证据(输入信息)来做出判决(输出结果)。
单层感知器:简单的分类器
多个人工神经元组合在一起,就形成了单层感知器。单层感知器可以完成一些简单的分类任务。比如说,我们有一堆水果,有苹果和香蕉,单层感知器可以根据水果的颜色、形状等特征,把它们分成苹果和香蕉两类。
想象一下,单层感知器就像是一个小团队,团队里的每个成员(人工神经元)都有自己的判断标准。当一个水果的信息传过来时,每个成员都会根据自己的标准给出一个判断,然后整个团队综合这些判断,得出最终的分类结果。
不过,单层感知器也有它的局限性。它只能处理一些比较简单的分类问题,对于那些复杂的、不能用简单规则分开的问题,它就无能为力了。就好比,如果水果堆里还有一些长得既像苹果又像香蕉的杂交品种,单层感知器可能就会 “犯迷糊”。
多层感知器:强大的信息处理大师
为了解决单层感知器的局限性,科学家们又发明了多层感知器。多层感知器就像是一个多层的信息处理大楼。最下面一层是输入层,它负责接收外界的信息,就像大楼的入口,把各种信息放进来。中间有一层或多层是隐藏层,这是信息处理的核心区域,就像大楼里的加工车间,对输入的信息进行深入的分析和处理。最上面一层是输出层,它会给出最终的处理结果,就像大楼的出口,把处理好的信息送出去。
当我们把一张图片输入到多层感知器中时,输入层会把图片的像素信息接收进来,然后传递给隐藏层。隐藏层里的神经元会对这些像素信息进行各种复杂的分析,提取出图片中的特征,比如物体的轮廓、颜色等。最后,输出层会根据这些特征,判断图片里是什么物体。
多层感知器之所以强大,是因为它有隐藏层。隐藏层可以对输入的信息进行多次加工和转换,就像一个神奇的魔术师,可以把复杂的信息变得有条理,从而让多层感知器能够处理各种复杂的问题,比如图像识别、语音识别等。
多层感知器的训练:不断学习进步
多层感知器就像一个学生,一开始它并不知道如何准确地处理信息。所以,我们需要对它进行训练。训练的过程就像是给学生做练习题。我们会给多层感知器一些已知答案的信息,让它进行处理,然后把它的处理结果和真实答案进行比较。如果有差距,我们就会调整多层感知器里神经元的判断标准,让它下次能做得更好。
通过不断地训练,多层感知器会越来越聪明,处理信息的能力也会越来越强。在实际应用中,经过良好训练的多层感知器可以在很多领域发挥重要作用,比如帮助医生诊断疾病、预测股票走势等。
多层感知器是人工智能领域的一个重要成果,它让计算机能够像人类一样处理复杂的信息。随着科技的不断发展,多层感知器也会不断地进化和完善,为我们的生活带来更多的便利和惊喜。
(1)打开Spyder软件,在目录D:\zwPython\zwrk\1_Quant_TensorFlow,新建文件
# -*- coding: utf-8 -*-
"""
Created on Sun Feb 16 22:08:35 2025
@author: Administrator
"""
import sys, os
sys.path.append("topqt/")
import numpy as np
import pandas as pd
import tushare as ts
import plotly as py
import plotly.figure_factory as pyff
import math
import arrow
import ffn
import pypinyin
import pandas_datareader as pdr
import matplotlib.pyplot as plt
import zsys2025 # 20250213
import ztools2025 as zt
import ztools_str as zstr
import ztools_data2025 as zdat
import ztools_draw2025 as zdr
import ztools_tq2025 as ztq # 20250213
import zai_keras2025 as zks
import tensorflow as tf
from tensorflow.keras.models import Sequential, load_model
from tensorflow.keras.layers import Dense, Input, Dropout
from tensorflow.keras.optimizers import RMSprop
from tensorflow.keras.utils import plot_model
from tensorflow.keras.callbacks import TensorBoard
import tensorlayer as tl
# 1
print('\n#1,set.sys')
pd.set_option('display.width', 450)
pd.set_option('display.float_format', zt.xfloat3)
rlog = os.path.join('tmp', 'log_tmp')
# 注意:tf.gfile.DeleteRecursively 在 TensorFlow 2.x 中已被弃用,使用 tf.io.gfile.rmtree 替代
if os.path.exists(rlog):
tf.io.gfile.rmtree(rlog)
# 2
print('\n#2,读取数据')
rss, fsgn, ksgn = 'tmp1/', 'TDS2_sz50', 'avg'
xlst = zsys2025.TDS_xlst9
zt.prx('xlst', xlst)
#
df_train, df_test, x_train, y_train, x_test, y_test = zdat.frd_TDS(rss, fsgn, ksgn, xlst)
print('\ndf_test.tail()')
print(df_test.tail())
print('\nx_train.shape,', x_train.shape)
print('\ntype(x_train),', type(x_train))
# 3
print('\n#3,model建立神经网络模型')
num_in, num_out = len(xlst), 1
print('\nnum_in,num_out:', num_in, num_out)
mx = zks.mlp010(num_in, num_out)
#
mx.summary()
plot_model(mx, to_file=os.path.join('tmp1', 'mx001_45.png'))
# 4 模型训练
print('\n#4 模型训练 fit')
# 设置 profile_batch=0 禁用性能分析
tbCallBack = TensorBoard(log_dir=rlog, write_graph=True, write_images=True, profile_batch=0)
tn0 = arrow.now()
mx.fit(x_train, y_train, epochs=500, batch_size=512, callbacks=[tbCallBack])
tn = zt.timNSec('', tn0, True)
# 确保保存模型的目录存在
model_save_dir = os.path.join('tmp1')
if not os.path.exists(model_save_dir):
os.makedirs(model_save_dir)
model_save_path = os.path.join(model_save_dir, 'mx001_45.dat')
mx.save(model_save_path)
# 5 利用模型进行预测 predict
print('\n#5 模型预测 predict')
tn0 = arrow.now()
y_pred = mx.predict(x_test)
tn = zt.timNSec('', tn0, True)
df_test['y_pred'] = zdat.ds4x(y_pred, df_test.index, True)
df_test.to_csv(os.path.join('tmp1', 'df_tst_45.csv'), index=False)
(2)程序输出结果
runfile('D:/zwPython/zwrk/1_Quant_TensorFlow/44-MultilayerPerceptronStockPrediction-1.py', wdir='D:/zwPython/zwrk/1_Quant_TensorFlow')
Reloaded modules: zsys2025, ztools2025, zsys, ztools_str, ztools, ztools_web, ztools_data, ztools_tq, zpd_talib, ztools_data2025, zpd_talib2025, ztools_draw2025, ztools_tq2025, zai_keras2025, zai_tools2025
#1,set.sys
#2,读取数据
xlst
['open', 'high', 'low', 'close', 'volume', 'avg', 'ma_2', 'ma_3', 'ma_5', 'ma_10', 'ma_15', 'ma_20', 'ma_25', 'ma_30', 'ma_50', 'ma_100', 'xyear', 'xmonth', 'xday', 'xday_week', 'xday_year', 'xweek_year']
df_test.tail()
open high low close ... y price price_next price_change
94939 4.390 4.510 4.380 4.510 ... 4.580 4.450 4.580 102.921
94940 4.490 4.490 4.420 4.430 ... 4.580 4.460 4.580 102.691
94941 4.440 4.530 4.420 4.500 ... 4.580 4.470 4.580 102.461
94942 4.490 4.510 4.460 4.480 ... 4.590 4.490 4.590 102.227
94943 4.490 4.530 4.490 4.520 ... 4.590 4.510 4.590 101.774
[5 rows x 26 columns]
x_train.shape, (116761, 22)
type(x_train), <class 'numpy.ndarray'>
#3,model建立神经网络模型
num_in,num_out: 22 1
Model: "sequential_5"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_10 (Dense) (None, 88) 2024
_________________________________________________________________
dense_11 (Dense) (None, 1) 89
=================================================================
Total params: 2,113
Trainable params: 2,113
Non-trainable params: 0
_________________________________________________________________
#4 模型训练 fit
137.33 s, 11:35:23 ,t0, 11:33:06
WARNING:tensorflow:AutoGraph could not transform <function canonicalize_signatures.<locals>.signature_wrapper at 0x0000025A001B7048> and will run it as-is.
Please report this to the TensorFlow team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output.
Cause: Bad argument number for Name: 3, expecting 4
WARNING: AutoGraph could not transform <function canonicalize_signatures.<locals>.signature_wrapper at 0x0000025A001B7048> and will run it as-is.
Please report this to the TensorFlow team. When filing the bug, set the verbosity to 10 (on Linux, `export AUTOGRAPH_VERBOSITY=10`) and attach the full output.
Cause: Bad argument number for Name: 3, expecting 4
INFO:tensorflow:Assets written to: tmp1\mx001_45.dat\assets
#5 模型预测 predict
1.1 s, 11:35:25 ,t0, 11:35:23
(3)程序代码注释
# -*- coding: utf-8 -*-
"""
Created on Sun Feb 16 22:08:35 2025
#多层感知器股票预测
@author: Administrator
"""
# 导入 sys 和 os 模块
# sys 模块提供了一些与 Python 解释器相关的变量和函数,可用于操作解释器的运行时环境
# os 模块提供了与操作系统进行交互的功能,例如文件和目录操作
import sys, os
# 将 'topqt/' 目录添加到 Python 的模块搜索路径中
# 这样在后续导入模块时,Python 解释器会在该目录下查找对应的模块
sys.path.append("topqt/")
# 导入 numpy 库,它是 Python 中用于科学计算的基础库
# 提供了高效的多维数组对象和各种数学函数,可用于处理大规模的数值数据
import numpy as np
# 导入 pandas 库,它是用于数据处理和分析的强大工具
# 提供了 DataFrame 和 Series 等数据结构,方便进行数据的读取、清洗、转换和分析
import pandas as pd
# 导入 tushare 库,这是一个免费、开源的 python 财经数据接口包
# 可用于获取各类金融数据,如股票行情、财务报表等
import tushare as ts
# 导入 plotly 库,它是一个用于创建交互式可视化图表的库
# 可以生成各种类型的图表,并且支持在网页上进行交互操作
import plotly as py
# 导入 plotly.figure_factory 模块,它提供了一些创建特定类型图表的工厂函数
# 例如创建表格、分布曲线等图表
import plotly.figure_factory as pyff
# 导入 math 模块,它提供了一些基本的数学函数,如三角函数、对数函数等
import math
# 导入 arrow 库,它是一个用于处理日期和时间的库
# 提供了简洁易用的 API,方便进行日期和时间的计算、格式化等操作
import arrow
# 导入 ffn 库,它是一个用于金融数据分析的库
# 提供了一系列金融计算和分析的工具,如风险评估、绩效评估等
import ffn
# 导入 pypinyin 库,它是一个将中文转换为拼音的库
# 可用于处理中文文本,例如将中文名称转换为拼音形式
import pypinyin
# 导入 pandas_datareader 库,它是一个用于从各种数据源获取数据的库
# 可以从雅虎财经、谷歌财经等数据源获取金融数据
import pandas_datareader as pdr
# 导入 matplotlib.pyplot 模块,它是一个用于创建静态可视化图表的库
# 提供了类似于 MATLAB 的绘图接口,可用于绘制折线图、柱状图等各种图表
import matplotlib.pyplot as plt
# 导入自定义模块 zsys2025,该模块可能包含一些系统相关的配置和工具函数
import zsys2025 # 20250213
# 导入自定义模块 ztools2025,并将其重命名为 zt
# 该模块可能包含一些通用的工具函数,用于数据处理、计算等操作
import ztools2025 as zt
# 导入自定义模块 ztools_str,该模块可能包含一些字符串处理的工具函数
import ztools_str as zstr
# 导入自定义模块 ztools_data2025,并将其重命名为 zdat
# 该模块可能包含一些数据处理和加载的工具函数
import ztools_data2025 as zdat
# 导入自定义模块 ztools_draw2025,并将其重命名为 zdr
# 该模块可能包含一些绘图相关的工具函数
import ztools_draw2025 as zdr
# 导入自定义模块 ztools_tq2025,并将其重命名为 ztq
# 该模块可能包含一些与 tushare 库相关的工具函数
import ztools_tq2025 as ztq # 20250213
# 导入自定义模块 zai_keras2025,并将其重命名为 zks
# 该模块可能包含一些与 Keras 深度学习框架相关的工具函数
import zai_keras2025 as zks
# 导入 tensorflow 库,它是一个开源的深度学习框架
# 提供了丰富的工具和函数,可用于构建和训练各种深度学习模型
import tensorflow as tf
# 从 tensorflow.keras.models 模块导入 Sequential 和 load_model 函数
# Sequential 用于构建顺序模型,即多个层按顺序堆叠的模型
# load_model 用于加载已经保存的模型
from tensorflow.keras.models import Sequential, load_model
# 从 tensorflow.keras.layers 模块导入 Dense、Input 和 Dropout 层
# Dense 是全连接层,每个神经元与上一层的所有神经元相连
# Input 用于定义模型的输入层
# Dropout 是一种正则化技术,用于防止模型过拟合
from tensorflow.keras.layers import Dense, Input, Dropout
# 从 tensorflow.keras.optimizers 模块导入 RMSprop 优化器
# RMSprop 是一种常用的优化算法,用于更新模型的参数
from tensorflow.keras.optimizers import RMSprop
# 从 tensorflow.keras.utils 模块导入 plot_model 函数
# 该函数用于将模型的结构可视化,并保存为图片文件
from tensorflow.keras.utils import plot_model
# 从 tensorflow.keras.callbacks 模块导入 TensorBoard 回调函数
# TensorBoard 是一个可视化工具,可用于监控模型的训练过程,如损失函数的变化、准确率的变化等
from tensorflow.keras.callbacks import TensorBoard
# 导入 tensorlayer 库,它是一个基于 TensorFlow 的深度学习库
# 提供了一些高级的神经网络层和工具,方便进行模型的构建和训练
import tensorlayer as tl
# 1. 设置系统相关参数
print('\n#1,set.sys')
# 设置 pandas 显示数据时的宽度为 450 个字符
# 这样可以使数据在输出时显示得更完整,避免因宽度限制而出现省略号
pd.set_option('display.width', 450)
# 设置 pandas 显示浮点数时的格式
# 使用自定义函数 zt.xfloat3 对浮点数进行格式化,使其显示更符合需求
pd.set_option('display.float_format', zt.xfloat3)
# 定义日志文件的保存路径
# 将日志文件保存到 'tmp/log_tmp' 目录下,用于记录模型训练过程中的信息
rlog = os.path.join('tmp', 'log_tmp')
# 检查日志目录是否存在
# 如果存在,则使用 tf.io.gfile.rmtree 函数删除该目录及其所有内容
# 注意:tf.gfile.DeleteRecursively 在 TensorFlow 2.x 中已被弃用,使用 tf.io.gfile.rmtree 替代
if os.path.exists(rlog):
tf.io.gfile.rmtree(rlog)
# 2. 读取数据
print('\n#2,读取数据')
# 定义数据文件所在的目录
rss = 'tmp1/'
# 定义数据文件的标识,可能用于区分不同类型或批次的数据
fsgn = 'TDS2_sz50'
# 定义数据的关键字标识,可能用于指定数据的特定特征或处理方式
ksgn = 'avg'
# 从 zsys2025 模块中获取特征列表
# 该列表包含了用于模型训练和预测的特征名称
xlst = zsys2025.TDS_xlst9
# 调用自定义函数 zt.prx 打印特征列表的信息
# 方便查看和确认所使用的特征
zt.prx('xlst', xlst)
# 调用自定义函数 zdat.frd_TDS 读取训练数据和测试数据
# 并将数据进行划分,得到训练集的 DataFrame、测试集的 DataFrame、训练特征、训练标签、测试特征、测试标签
df_train, df_test, x_train, y_train, x_test, y_test = zdat.frd_TDS(rss, fsgn, ksgn, xlst)
# 打印测试数据的最后几行信息
# 方便查看测试数据的基本情况
print('\ndf_test.tail()')
print(df_test.tail())
# 打印训练特征的形状信息
# 形状信息可以告诉我们训练特征的维度,例如样本数量和特征数量
print('\nx_train.shape,', x_train.shape)
# 打印训练特征的数据类型信息
# 确认训练特征的数据类型,以便后续处理
print('\ntype(x_train),', type(x_train))
# 3. 建立神经网络模型
print('\n#3,model建立神经网络模型')
# 计算输入层的神经元数量,即特征的数量
# 输入层的神经元数量应与特征的数量一致
num_in = len(xlst)
# 定义输出层的神经元数量,这里设置为 1
# 表示模型的输出是一个单一的值,例如股票价格的预测值
num_out = 1
# 打印输入层和输出层的神经元数量信息
# 方便确认模型的输入和输出维度
print('\nnum_in,num_out:', num_in, num_out)
# 调用自定义函数 zks.mlp010 构建一个多层感知器模型
# 该函数根据输入层和输出层的神经元数量构建模型
mx = zks.mlp010(num_in, num_out)
# 打印模型的概要信息
# 包括模型的层结构、每层的参数数量等,方便了解模型的基本情况
mx.summary()
# 绘制模型的结构图,并保存为 'tmp1/mx001_45.png' 文件
# 可以直观地看到模型的层结构和连接方式
plot_model(mx, to_file=os.path.join('tmp1', 'mx001_45.png'))
# 4. 模型训练
print('\n#4 模型训练 fit')
# 创建 TensorBoard 回调函数,用于记录模型训练过程中的信息
# log_dir:指定日志文件的保存路径,即之前定义的 rlog 目录
# write_graph:是否记录模型的计算图,设置为 True 可以在 TensorBoard 中查看模型的结构
# write_images:是否记录模型的权重信息,设置为 True 可以在 TensorBoard 中查看权重的变化
# profile_batch=0:禁用性能分析,避免在训练过程中进行性能分析导致的额外开销
tbCallBack = TensorBoard(log_dir=rlog, write_graph=True, write_images=True, profile_batch=0)
# 记录训练开始的时间
# 使用 arrow.now() 函数获取当前的时间
tn0 = arrow.now()
# 使用训练数据对模型进行训练
# x_train:训练特征
# y_train:训练标签
# epochs:训练的轮数,即模型对整个训练数据进行多少次迭代训练
# verbose=0:设置训练过程的输出信息级别,0 表示不输出详细信息
# batch_size:每次训练使用的样本数量,即每次从训练数据中取出多少个样本进行训练
# callbacks:指定回调函数,这里使用 TensorBoard 回调函数记录训练信息
mx.fit(x_train, y_train, epochs=500, verbose=0, batch_size=512, callbacks=[tbCallBack])
# 计算训练所花费的时间,并打印出来
# 调用自定义函数 zt.timNSec 计算时间差,并输出结果
tn = zt.timNSec('', tn0, True)
# 确保保存模型的目录存在
# 如果目录不存在,则使用 os.makedirs 函数创建该目录
model_save_dir = os.path.join('tmp1')
if not os.path.exists(model_save_dir):
os.makedirs(model_save_dir)
# 定义模型保存的路径
# 将训练好的模型保存为 'tmp1/mx001_45.dat' 文件
model_save_path = os.path.join(model_save_dir, 'mx001_45.dat')
# 将训练好的模型保存到指定路径
mx.save(model_save_path)
# 5. 利用模型进行预测
print('\n#5 模型预测 predict')
# 记录预测开始的时间
# 使用 arrow.now() 函数获取当前的时间
tn0 = arrow.now()
# 使用训练好的模型对测试数据进行预测
# 将测试特征输入到模型中,得到预测结果
y_pred = mx.predict(x_test)
# 计算预测所花费的时间,并打印出来
# 调用自定义函数 zt.timNSec 计算时间差,并输出结果
tn = zt.timNSec('', tn0, True)
# 将预测结果转换为适合 DataFrame 的格式,并添加到测试数据的 DataFrame 中
# 调用自定义函数 zdat.ds4x 对预测结果进行处理
df_test['y_pred'] = zdat.ds4x(y_pred, df_test.index, True)
# 将包含预测结果的测试数据保存为 CSV 文件
# 保存到 'tmp1/df_tst_45.csv' 文件中,不保存索引信息
df_test.to_csv(os.path.join('tmp1', 'df_tst_45.csv'), index=False)
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/907107
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!