神经网络学习(2)————线性神经网络以及python实现

一、线性神经网络结构模型

在结构上与感知器非常相似,只是神经元激活函数不同,结构如图所示:

若网络中包含多个神经元节点,就可形成多个输出,这种神经网络可以用一种间接的方式解决线性不可分的问题,方法是用多个线性含糊对区域进行划分,神经结构和解决异或问题如图所示:

              

利用线性神经网络解决线性不可分问题的另一个方法是对神经元添加非线性输入,从而引入非线性成分,这样是原本的输入维度变大。如图所示:

    线性神经网络的学习算法是LMS算法。

 

 

 

 

二、线性神经网络的学习LMS算法

定义第n次迭代产生的误差信号是:

采用均方差作为评价标准:

Q是输入训练样本的个数。线性神经网络的学习目标是找到适当的w,是的误差的均方差mse最小,只要将上市穗w求偏导,再令偏导为0,即可求出mse的极值。

调节权值是在斜面上沿着负梯度的方向对权值进行修正,最终到达最佳权值。

LMS算法的步骤:

其中学习率的选择要保证收敛的条件是:

其中,R是输入向量x的自相关矩阵,

学习率在学习过程中,随学习的进行逐渐下降比始终不变要更加合理,学习率的下降公式为:

LMS算法的一个缺点是,他对输入向量自相关矩阵R的条件数敏感,当一个矩阵的条件数比较大时,矩阵就成为病态矩阵,这种矩阵中的元素做微笑的改变就可能引起线性方程解的很大变化。

在算法上,LMS算法和感知器学习算法没有什么区别,,但是,在感知器算法中,得到的线基本是在刚刚可以区分的位置上,这样使分类边界离一个类别过近,使得系统对于误差更加敏感;但是LMS算法往往处于两类中间的位置。这一区别与两种神经网络的不同传输函数有关。

三、python实现LMS算法

# -*- coding: utf-8 -*-
"""
Created on Fri Sep 28 21:42:40 2018

@author: Heisenberg
"""
import numpy as np
import matplotlib.pyplot as mpl

a=0.1  ##学习率 0<a<1
X=np.array([[1,1,1],[1,1,0],[1,0,1],[1,0,0]]) ##输入矩阵
D=np.array([1,1,1,0])  ##期望输出结果矩阵
W=(np.random.random(3)-0.5)*2  #随机权重值
expect_e=0.00005 ##期望误差
maxtrycount=20 ##最大尝试次数

##硬限幅函数(即标准,这个比较简单:输入v大于0,返回1.小于等于0返回-1)
'''
    最后的权重为W([0.1,0.1]),则:0.1x+0.1y=0 ==>y=-x
    即:分类线方程为:y=-x
'''
def sgn(v):
    if v>0:
        return 1
    else:
        return 0 ##跟上篇感知器单样本训练的-1比调整成了0,为了测试需要。-1训练不出结果
    
##读取实际输出   
'''
    这里是两个向量相乘,对应的数学公式:
    a(m,n)*b(p,q)=m*p+n*q
    在下面的函数中,当循环中xn=1时(此时W=([0.1,0.1])):
    np.dot(W.T,x)=(1,1)*(0.1,0.1)=1*0.1+1*0.1=0.2>0 ==>sgn 返回1
'''
def get_v(W,x):
    return sgn(np.dot(W.T,x))##dot表示两个矩阵相乘,求两个向量的点积


##读取误差值
def get_e(W,x,d):
    return d-get_v(W,x)

##权重计算函数(批量修正)
'''
  对应数学公式: w(n+1)=w(n)+a*x(n)*e
  对应下列变量的解释:
  w(n+1) <= neww 的返回值
  w(n)   <=oldw(旧的权重向量)
  a      <= a(学习率,范围:0<a<1)
  x(n)   <= x(输入值)
  e      <= 误差值或者误差信号
'''
def neww(oldW,d,x,a):
    e=get_e(oldW,x,d)
    return (oldW+a*x*e,e)


##修正权值
'''
    此循环的原理:
    权值修正原理(批量修正)==>神经网络每次读入一个样本,进行修正,
        达到预期误差值或者最大尝试次数结束,修正过程结束   
'''
cnt=0
while True:
    err=0
    i=0
    for xn in X:        
        W,e=neww(W,D[i],xn,a)
        i+=1
        err+=pow(e,2)  ##lms算法的核心步骤,即:MES
    err/=float(i)
    cnt+=1
    print("第 %d 次调整后的权值:"%cnt)
    print(W)
    print("误差:%f"%err)
    if err<expect_e or cnt>=maxtrycount:
        break

print("最后的权值:",W)

##输出结果
print("开始验证结果...")
for xn in X:
    print("D%s and W%s =>%d"%(xn,W.T,get_v(W,xn)))


##测试准确性:
print("开始测试...")
test=np.array([1,2,3])
print("D%s and W%s =>%d"%(test,W.T,get_v(W,test)))
test=np.array([1,-3,-5])
print("D%s and W%s =>%d"%(test,W.T,get_v(W,test)))

#输出图像
x1 = [2]
y1 = [3]

x2 = [-3]
y2 = [-5]
k=-W[1]/W[2]
d=-W[0]/W[2]
xdata=np.linspace(-8,8)  #x轴的刻度划分一个8个刻度
mpl.figure()#调用函数创建一个绘图对象,并且使他成为当前的绘图对象
mpl.plot(xdata,xdata*k+d,'r')# r代表是红色
mpl.plot(x1,y1,'bo')  #x1,y1的俩个点用蓝色圆圈标记
mpl.plot(x2,y2,'yo')  #黄色标记
mpl.show()

训练结果:

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
非常不错的主题!使用机器学习来预测股价是当前非常热门的研究领域之一。我可以给你一些关于使用Python和TA-Lib库进行股价预测的建议。 首先,你需要了解什么是TA-Lib。TA-Lib是一个流行的技术分析库,它提供了各种技术分析指标,如移动平均线、相对强弱指数和布林带等。使用TA-Lib,你可以方便地计算这些指标,然后用于机器学习模型的训练。 其次,你需要选择适合的机器学习算法。常见的机器学习算法包括线性回归、随机森林和神经网络等。在选择算法时,你需要考虑到数据的特征和量级,以及算法的可解释性和准确性等因素。 最后,你需要准备好数据,包括历史股价数据、技术分析指标和其他可能影响股价的因素,如宏观经济指标和公司财务数据等。你可以使用Python中的pandas和numpy库来处理数据,并使用scikit-learn库来训练机器学习模型。 下面是一个简单的股价预测代码示例,使用线性回归算法和TA-Lib库: ``` import talib import pandas as pd import numpy as np from sklearn.linear_model import LinearRegression # 读取股价数据 df = pd.read_csv('stock_prices.csv') # 计算技术分析指标 df['ma20'] = talib.MA(df['close'].values, timeperiod=20) df['rsi14'] = talib.RSI(df['close'].values, timeperiod=14) # 准备训练数据 X = df[['ma20', 'rsi14']].values y = df['close'].values # 构建线性回归模型 model = LinearRegression() model.fit(X, y) # 预测股价 today_ma20 = talib.MA(df['close'].values[-20:], timeperiod=20)[-1] today_rsi14 = talib.RSI(df['close'].values[-14:], timeperiod=14)[-1] today_features = np.array([today_ma20, today_rsi14]).reshape(1, -1) predicted_price = model.predict(today_features) print("Today's predicted stock price:", predicted_price[0]) ``` 当然,这只是一个简单的示例,你可以根据你的需求进行修改和扩展。希望对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值