hopfield实现文字识别用Python语言编程可以吗

2024-05-16 19:22

1. hopfield实现文字识别用Python语言编程可以吗

PYTHON当然可以用来做文字识别了

hopfield实现文字识别用Python语言编程可以吗

2. 如何用python和scikit learn实现神经网络

1:神经网络算法简介
2:Backpropagation算法详细介绍
3:非线性转化方程举例
4:自己实现神经网络算法NeuralNetwork
5:基于NeuralNetwork的XOR实例
6:基于NeuralNetwork的手写数字识别实例
7:scikit-learn中BernoulliRBM使用实例
8:scikit-learn中的手写数字识别实例

一:神经网络算法简介
1:背景
以人脑神经网络为启发,历史上出现过很多版本,但最著名的是backpropagation
2:多层向前神经网络(Multilayer  Feed-Forward Neural Network)

多层向前神经网络组成部分
输入层(input layer),隐藏层(hiddenlayer),输出层(output layer)

每层由单元(units)组成
输入层(input layer)是由训练集的实例特征向量传入
经过连接结点的权重(weight)传入下一层,一层的输出是下一层的输入
隐藏层的个数是任意的,输出层和输入层只有一个
每个单元(unit)也可以被称作神经结点,根据生物学来源定义
上图称为2层的神经网络(输入层不算)
一层中加权的求和,然后根据非线性的方程转化输出
作为多层向前神经网络,理论上,如果有足够多的隐藏层(hidden layers)和足够大的训练集,可以模拟出任何方程

3:设计神经网络结构
3.1使用神经网络训练数据之前,必须确定神经网络层数,以及每层单元个数
3.2特征向量在被传入输入层时通常被先标准化(normalize)和0和1之间(为了加强学习过程)
3.3离散型变量可以被编码成每一个输入单元对应一个特征可能赋的值
比如:特征值A可能取三个值(a0,a1,a2),可以使用三个输入单元来代表A
如果A=a0,那么代表a0的单元值就取1,其他取0
如果A=a1,那么代表a1的单元值就取1,其他取0,以此类推
3.4神经网络即可以用来做分类(classification)问题,也可以解决回归(regression)问题
3.4.1对于分类问题,如果是2类,可以用一个输入单元表示(0和1分别代表2类)
如果多于两类,每一个类别用一个输出单元表示
所以输入层的单元数量通常等于类别的数量 
3.4.2没有明确的规则来设计最好有多少个隐藏层
3.4.2.1根据实验测试和误差,以及准确度来实验并改进
4:算法验证——交叉验证法(Cross- Validation)


解读: 有一组输入集A,B,可以分成三组,第一次以第一组为训练集,求出一个准确度,第二次以第二组作为训练集,求出一个准确度,求出准确度,第三次以第三组作为训练集,求出一个准确度,然后对三个准确度求平均值
二:Backpropagation算法详细介绍

1:通过迭代性来处理训练集中的实例

2:输入层输入数
经过权重计算得到第一层的数据,第一层的数据作为第二层的输入,再次经过权重计算得到结果,结果和真实值之间是存在误差的,然后根据误差,反向的更新每两个连接之间的权重
3:算法详细介绍
输入:D : 数据集,| 学习率(learning rate),一个多层前向神经网络
输出:一个训练好的神经网络(a trained neural network)
3.1初始化权重(weights)和偏向(bias):随机初始化在-1到1之间,或者-0.5到0.5之间,每个单元有一个偏向
3.2对于每一个训练实例X,执行以下步骤:
3.2.1:由输入层向前传送,输入->输出对应的计算为:


计算得到一个数据,经过f 函数转化作为下一层的输入,f函数为:
3.2.2:根据误差(error)反向传送
对于输出层(误差计算):  Tj:真实值,Qj表示预测值

对于隐藏层(误差计算):  Errk 表示前一层的误差, Wjk表示前一层与当前点的连接权重

权重更新:  l:指学习比率(变化率),手工指定,优化方法是,随着数据的迭代逐渐减小

偏向更新:  l:同上
3.3:终止条件
3.3.1权重的更新低于某个阀值
3.3.2预测的错误率低于某个阀值
3.3.3达到预设一定的循环次数



4:结合实例讲解算法



0.9对用的是L,学习率

测试代码如下:
1.NeutralNetwork.py文件代码
#coding:utf-8import numpy as np#定义双曲函数和他们的导数def tanh(x):return np.tanh(x)def tanh_deriv(x):return 1.0 - np.tanh(x)**2def logistic(x):return 1/(1 + np.exp(-x))def logistic_derivative(x):return logistic(x)*(1-logistic(x))#定义NeuralNetwork 神经网络算法class NeuralNetwork:#初始化,layes表示的是一个list,eg[10,10,3]表示第一层10个神经元,第二层10个神经元,第三层3个神经元def __init__(self, layers, activation='tanh'):""":param layers: A list containing the number of units in each layer.Should be at least two values:param activation: The activation function to be used. Can be"logistic" or "tanh""""if activation == 'logistic':self.activation = logisticself.activation_deriv = logistic_derivativeelif activation == 'tanh':self.activation = tanhself.activation_deriv = tanh_derivself.weights = []#循环从1开始,相当于以第二层为基准,进行权重的初始化for i in range(1, len(layers) - 1):#对当前神经节点的前驱赋值self.weights.append((2*np.random.random((layers[i - 1] + 1, layers[i] + 1))-1)*0.25)#对当前神经节点的后继赋值self.weights.append((2*np.random.random((layers[i] + 1, layers[i + 1]))-1)*0.25)#训练函数   ,X矩阵,每行是一个实例 ,y是每个实例对应的结果,learning_rate 学习率,# epochs,表示抽样的方法对神经网络进行更新的最大次数def fit(self, X, y, learning_rate=0.2, epochs=10000):X = np.atleast_2d(X) #确定X至少是二维的数据temp = np.ones([X.shape[0], X.shape[1]+1]) #初始化矩阵temp[:, 0:-1] = X  # adding the bias unit to the input layerX = tempy = np.array(y) #把list转换成array的形式for k in range(epochs):#随机选取一行,对神经网络进行更新i = np.random.randint(X.shape[0])a = [X[i]]#完成所有正向的更新for l in range(len(self.weights)):a.append(self.activation(np.dot(a[l], self.weights[l])))#error = y[i] - a[-1]deltas = [error * self.activation_deriv(a[-1])]#开始反向计算误差,更新权重for l in range(len(a) - 2, 0, -1): # we need to begin at the second to last layerdeltas.append(deltas[-1].dot(self.weights[l].T)*self.activation_deriv(a[l]))deltas.reverse()for i in range(len(self.weights)):layer = np.atleast_2d(a[i])delta = np.atleast_2d(deltas[i])self.weights[i] += learning_rate * layer.T.dot(delta)#预测函数def predict(self, x):x = np.array(x)temp = np.ones(x.shape[0]+1)temp[0:-1] = xa = tempfor l in range(0, len(self.weights)):a = self.activation(np.dot(a, self.weights[l]))return a
2、测试代码
#coding:utf-8'''#基于NeuralNetwork的XOR(异或)示例import numpy as npfrom NeuralNetwork import NeuralNetworknn = NeuralNetwork([2,2,1], 'tanh')X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])y = np.array([0, 1, 1, 0])nn.fit(X, y)for i in [[0, 0], [0, 1], [1, 0], [1,1]]:print(i,nn.predict(i))''''''#基于NeuralNetwork的手写数字识别示例import numpy as npfrom sklearn.datasets import load_digitsfrom sklearn.metrics import confusion_matrix,classification_reportfrom sklearn.preprocessing import LabelBinarizerfrom sklearn.cross_validation import train_test_splitfrom NeuralNetwork import NeuralNetworkdigits = load_digits()X = digits.datay = digits.targetX -= X.min()X /= X.max()nn =NeuralNetwork([64,100,10],'logistic')X_train, X_test, y_train, y_test = train_test_split(X, y)labels_train = LabelBinarizer().fit_transform(y_train)labels_test = LabelBinarizer().fit_transform(y_test)print "start fitting"nn.fit(X_train,labels_train,epochs=3000)predictions = []for i in range(X_test.shape[0]):o = nn.predict(X_test[i])predictions.append(np.argmax(o))print confusion_matrix(y_test, predictions)print classification_report(y_test, predictions)'''#scikit-learn中的手写数字识别实例import numpy as npimport matplotlib.pyplot as pltfrom scipy.ndimage import convolvefrom sklearn import linear_model, datasets, metricsfrom sklearn.cross_validation import train_test_splitfrom sklearn.neural_network import BernoulliRBMfrom sklearn.pipeline import Pipeline################################################################################ Setting updef nudge_dataset(X, Y):direction_vectors = [[[0, 1, 0],[0, 0, 0],[0, 0, 0]],[[0, 0, 0],[1, 0, 0],[0, 0, 0]],[[0, 0, 0],[0, 0, 1],[0, 0, 0]],[[0, 0, 0],[0, 0, 0],[0, 1, 0]]]shift = lambda x, w: convolve(x.reshape((8, 8)), mode='constant',weights=w).ravel()X = np.concatenate([X] +[np.apply_along_axis(shift, 1, X, vector)for vector in direction_vectors])Y = np.concatenate([Y for _ in range(5)], axis=0)return X, Y# Load Datadigits = datasets.load_digits()X = np.asarray(digits.data, 'float32')X, Y = nudge_dataset(X, digits.target)X = (X - np.min(X, 0)) / (np.max(X, 0) + 0.0001)  # 0-1 scalingX_train, X_test, Y_train, Y_test = train_test_split(X, Y,test_size=0.2,random_state=0)# Models we will uselogistic = linear_model.LogisticRegression()rbm = BernoulliRBM(random_state=0, verbose=True)classifier = Pipeline(steps=[('rbm', rbm), ('logistic', logistic)])################################################################################ Training# Hyper-parameters. These were set by cross-validation,# using a GridSearchCV. Here we are not performing cross-validation to# save time.rbm.learning_rate = 0.06rbm.n_iter = 20# More components tend to give better prediction performance, but larger# fitting timerbm.n_components = 100logistic.C = 6000.0# Training RBM-Logistic Pipelineclassifier.fit(X_train, Y_train)# Training Logistic regressionlogistic_classifier = linear_model.LogisticRegression(C=100.0)logistic_classifier.fit(X_train, Y_train)################################################################################ Evaluationprint()print("Logistic regression using RBM features:\n%s\n" % (metrics.classification_report(Y_test,classifier.predict(X_test))))print("Logistic regression using raw pixel features:\n%s\n" % (metrics.classification_report(Y_test,logistic_classifier.predict(X_test))))################################################################################ Plottingplt.figure(figsize=(4.2, 4))for i, comp in enumerate(rbm.components_):plt.subplot(10, 10, i + 1)plt.imshow(comp.reshape((8, 8)), cmap=plt.cm.gray_r,interpolation='nearest')plt.xticks(())plt.yticks(())plt.suptitle('100 components extracted by RBM', fontsize=16)plt.subplots_adjust(0.08, 0.02, 0.92, 0.85, 0.08, 0.23)plt.show()'''from sklearn.neural_network import BernoulliRBMX = [[0,0],[1,1]]y = [0,1]clf = BernoulliRBM().fit(X,y)print
测试结果如下:


3. Hopfield神经网络

对Hopfield 网络进行了简单的介绍,推荐1.25或1.5倍数食用。这套系列视频的内容是根据丁世飞老师编著的《人工智能》进行的,书的介绍在这里:http://www.tup.tsinghua.edu.cn/booksCenter/book_05832601.html

Hopfield神经网络

4. 请问哪里有讲解在matlab环境下实现Hopfield神经网络的视频?

你导师只说对了一半,在matlab神经网络工具箱中,只提供了离散型Hopfield神经网络的函数接口,连续型Hopfield神经网络的函数接口是没有的。前两天刚刚从一个论坛上下载了一个视频《Matlab离散Hopfield神经网络的联想记忆—数字识别 》,感觉挺好的,对你应该有一定的帮助。

视频所讲内容:

内容简介

1 离散Hopfield神经网络概述

2 数字识别概述

3 问题描述

4 模型建立

5 离散Hopfield网络的MATLAB函数 

6 MATLAB程序实现

7 结果分析

8 案例扩展

5. 怎样用python构建一个卷积神经网络

用keras框架较为方便
首先安装anaconda,然后通过pip安装keras

以下转自wphh的博客。
#coding:utf-8'''    GPU run command:        THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32 python cnn.py    CPU run command:        python cnn.py2016.06.06更新:这份代码是keras开发初期写的,当时keras还没有现在这么流行,文档也还没那么丰富,所以我当时写了一些简单的教程。现在keras的API也发生了一些的变化,建议及推荐直接上keras.io看更加详细的教程。'''#导入各种用到的模块组件from __future__ import absolute_importfrom __future__ import print_functionfrom keras.preprocessing.image import ImageDataGeneratorfrom keras.models import Sequentialfrom keras.layers.core import Dense, Dropout, Activation, Flattenfrom keras.layers.advanced_activations import PReLUfrom keras.layers.convolutional import Convolution2D, MaxPooling2Dfrom keras.optimizers import SGD, Adadelta, Adagradfrom keras.utils import np_utils, generic_utilsfrom six.moves import rangefrom data import load_dataimport randomimport numpy as npnp.random.seed(1024)  # for reproducibility#加载数据data, label = load_data()#打乱数据index = [i for i in range(len(data))]random.shuffle(index)data = data[index]label = label[index]print(data.shape[0], ' samples')#label为0~9共10个类别,keras要求格式为binary class matrices,转化一下,直接调用keras提供的这个函数label = np_utils.to_categorical(label, 10)################开始建立CNN模型################生成一个modelmodel = Sequential()#第一个卷积层,4个卷积核,每个卷积核大小5*5。1表示输入的图片的通道,灰度图为1通道。#border_mode可以是valid或者full,具体看这里说明:http://deeplearning.net/software/theano/library/tensor/nnet/conv.html#theano.tensor.nnet.conv.conv2d#激活函数用tanh#你还可以在model.add(Activation('tanh'))后加上dropout的技巧: model.add(Dropout(0.5))model.add(Convolution2D(4, 5, 5, border_mode='valid',input_shape=(1,28,28))) model.add(Activation('tanh'))#第二个卷积层,8个卷积核,每个卷积核大小3*3。4表示输入的特征图个数,等于上一层的卷积核个数#激活函数用tanh#采用maxpooling,poolsize为(2,2)model.add(Convolution2D(8, 3, 3, border_mode='valid'))model.add(Activation('tanh'))model.add(MaxPooling2D(pool_size=(2, 2)))#第三个卷积层,16个卷积核,每个卷积核大小3*3#激活函数用tanh#采用maxpooling,poolsize为(2,2)model.add(Convolution2D(16, 3, 3, border_mode='valid')) model.add(Activation('relu'))model.add(MaxPooling2D(pool_size=(2, 2)))#全连接层,先将前一层输出的二维特征图flatten为一维的。#Dense就是隐藏层。16就是上一层输出的特征图个数。4是根据每个卷积层计算出来的:(28-5+1)得到24,(24-3+1)/2得到11,(11-3+1)/2得到4#全连接有128个神经元节点,初始化方式为normalmodel.add(Flatten())model.add(Dense(128, init='normal'))model.add(Activation('tanh'))#Softmax分类,输出是10类别model.add(Dense(10, init='normal'))model.add(Activation('softmax'))##############开始训练模型###############使用SGD + momentum#model.compile里的参数loss就是损失函数(目标函数)sgd = SGD(lr=0.05, decay=1e-6, momentum=0.9, nesterov=True)model.compile(loss='categorical_crossentropy', optimizer=sgd,metrics=["accuracy"])#调用fit方法,就是一个训练过程. 训练的epoch数设为10,batch_size为100.#数据经过随机打乱shuffle=True。verbose=1,训练过程中输出的信息,0、1、2三种方式都可以,无关紧要。show_accuracy=True,训练时每一个epoch都输出accuracy。#validation_split=0.2,将20%的数据作为验证集。model.fit(data, label, batch_size=100, nb_epoch=10,shuffle=True,verbose=1,validation_split=0.2)"""#使用data augmentation的方法#一些参数和调用的方法,请看文档datagen = ImageDataGenerator(        featurewise_center=True, # set input mean to 0 over the dataset        samplewise_center=False, # set each sample mean to 0        featurewise_std_normalization=True, # divide inputs by std of the dataset        samplewise_std_normalization=False, # divide each input by its std        zca_whitening=False, # apply ZCA whitening        rotation_range=20, # randomly rotate images in the range (degrees, 0 to 180)        width_shift_range=0.2, # randomly shift images horizontally (fraction of total width)        height_shift_range=0.2, # randomly shift images vertically (fraction of total height)        horizontal_flip=True, # randomly flip images        vertical_flip=False) # randomly flip images# compute quantities required for featurewise normalization # (std, mean, and principal components if ZCA whitening is applied)datagen.fit(data)for e in range(nb_epoch):    print('-'*40)    print('Epoch', e)    print('-'*40)    print("Training...")    # batch train with realtime data augmentation    progbar = generic_utils.Progbar(data.shape[0])    for X_batch, Y_batch in datagen.flow(data, label):        loss,accuracy = model.train(X_batch, Y_batch,accuracy=True)        progbar.add(X_batch.shape[0], values=[("train loss", loss),("accuracy:", accuracy)] )"""

怎样用python构建一个卷积神经网络

6. 神经网络Hopfield模型

一、Hopfield模型概述
1982年,美国加州工学院J.Hopfield发表一篇对人工神经网络研究颇有影响的论文。他提出了一种具有相互连接的反馈型人工神经网络模型——Hopfield人工神经网络。
Hopfield人工神经网络是一种反馈网络(Recurrent Network),又称自联想记忆网络。其目的是为了设计一个网络,存储一组平衡点,使得当给网络一组初始值时,网络通过自行运行而最终收敛到所存储的某个平衡点上。
Hopfield网络是单层对称全反馈网络,根据其激活函数的选取不同,可分为离散型Hopfield网络(Discrete Hopfield Neural Network,简称 DHNN)和连续型 Hopfield 网络(Continue Hopfield Neural Network,简称CHNN)。离散型Hopfield网络的激活函数为二值型阶跃函数,主要用于联想记忆、模式分类、模式识别。这个软件为离散型Hopfield网络的设计、应用。
二、Hopfield模型原理
离散型Hopfield网络的设计目的是使任意输入矢量经过网络循环最终收敛到网络所记忆的某个样本上。
正交化的权值设计
这一方法的基本思想和出发点是为了满足下面4个要求:
1)保证系统在异步工作时的稳定性,即它的权值是对称的,满足
wij=wji,i,j=1,2…,N;
2)保证所有要求记忆的稳定平衡点都能收敛到自己;
3)使伪稳定点的数目尽可能地少;
4)使稳定点的吸引力尽可能地大。
正交化权值的计算公式推导如下:
1)已知有P个需要存储的稳定平衡点x1,x2…,xP-1,xP,xp∈RN,计算N×(P-1)阶矩阵A∈RN×(P-1):
A=(x1-xPx2-xP…xP-1-xP)T。
2)对A做奇异值分解
A=USVT,
U=(u1u2…uN),
V=(υ1υ2…υP-1),

中国矿产资源评价新技术与评价新模型

Σ=diαg(λ1,λ2,…,λK),O为零矩阵。
K维空间为N维空间的子空间,它由K个独立的基组成:
K=rαnk(A),
设{u1u2…uK}为A的正交基,而{uK+1uK+2…uN}为N维空间的补充正交基。下面利用U矩阵来设计权值。
3)构造

中国矿产资源评价新技术与评价新模型

总的连接权矩阵为:
Wt=Wp-T·Wm,
其中,T为大于-1的参数,缺省值为10。
Wp和Wm均满足对称条件,即
(wp)ij=(wp)ji,
(wm)ij=(wm)ji,
因而Wt中分量也满足对称条件。这就保证了系统在异步时能够收敛并且不会出现极限环。
4)网络的偏差构造为
bt=xP-Wt·xP。
下面推导记忆样本能够收敛到自己的有效性。
(1)对于输入样本中的任意目标矢量xp,p=1,2,…,P,因为(xp-xP)是A中的一个矢量,它属于A的秩所定义的K个基空间的矢量,所以必存在系数α1,α2,…,αK,使
xp-xP=α1u1+α2u2+…+αKuK,
即
xp=α1u1+α2u2+…+αKuK+xP,
对于U中任意一个ui,有

中国矿产资源评价新技术与评价新模型

由正交性质可知,上式中
当i=j,  ;
当i≠j,  ;
对于输入模式xi,其网络输出为
yi=sgn(Wtxi+bt)
=sgn(Wpxi-T·Wmxi+xP-WpxP+T·WmxP)
=sgn[Wp(xi-xP)-T·Wm(xi-xP)+xP]
=sgn[(Wp-T·Wm)(xi-xP)+xP]
=sgn[Wt(xi-xP)+xP]
=sgn[(xi-xP)+xP]
=xi。
(2)对于输入模式xP,其网络输出为
yP=sgn(WtxP+bt)
=sgn(WtxP+xP-WtxP)
=sgn(xP)
=xP。
(3)如果输入一个不是记忆样本的x,网络输出为
y=sgn(Wtx+bt)
=sgn[(Wp-T·Wm)(x-xP)+xP]
=sgn[Wt(x-xP)+xP]。
因为x不是已学习过的记忆样本,x-xP不是A中的矢量,则必然有
Wt(x-xP)≠x-xP,
并且再设计过程中可以通过调节Wt=Wp-T·Wm中的参数T的大小来控制(x-xP)与xP的符号,以保证输入矢量x与记忆样本之间存在足够的大小余额,从而使sgn(Wtx+bt)≠x,使x不能收敛到自身。
用输入模式给出一组目标平衡点,函数HopfieldDesign( )可以设计出 Hopfield 网络的权值和偏差,保证网络对给定的目标矢量能收敛到稳定的平衡点。
设计好网络后,可以应用函数HopfieldSimu( ),对输入矢量进行分类,这些输入矢量将趋近目标平衡点,最终找到他们的目标矢量,作为对输入矢量进行分类。
三、总体算法
1.Hopfield网络权值W[N][N]、偏差b[N]设计总体算法
应用正交化权值设计方法,设计Hopfield网络;
根据给定的目标矢量设计产生权值W[N][N],偏差b[N];
使Hopfield网络的稳定输出矢量与给定的目标矢量一致。
1)输入P个输入模式X=(x[1],x[2],…,x[P-1],x[P])
输入参数,包括T、h;
2)由X[N][P]构造A[N][P-1]=(x[1]-x[P],x[2]-x[P],…,x[P-1]-x[P]);
3)对A[N][P-1]作奇异值分解A=USVT;
4)求A[N][P-1]的秩rank;
5)由U=(u[1],u[2],…,u[K])构造Wp[N][N];
6)由U=(u[K+1],…,u[N])构造Wm[N][N];
7)构造Wt[N][N]=Wp[N][N]-T*Wm[N][N];
8)构造bt[N]=X[N][P]-Wt[N][N]*X[N][P];
9)构造W[N][N](9~13),
构造W1[N][N]=h*Wt[N][N];
10)求W1[N][N]的特征值矩阵Val[N][N](对角线元素为特征值,其余为0),特征向量矩阵Vec[N][N];
11)求Eval[N][N]=diag{exp[diag(Val)]}[N][N];
12)求Vec[N][N]的逆Invec[N][N];
13)构造W[N][N]=Vec[N][N]*Eval[N][N]*Invec[N][N];
14)构造b[N],(14~15),
C1=exp(h)-1,
C2=-(exp(-T*h)-1)/T;
15)构造

中国矿产资源评价新技术与评价新模型

Uˊ——U的转置;
16)输出W[N][N],b[N];
17)结束。
2.Hopfield网络预测应用总体算法
Hopfield网络由一层N个斜坡函数神经元组成。
应用正交化权值设计方法,设计Hopfield网络。
根据给定的目标矢量设计产生权值W[N][N],偏差b[N]。
初始输出为X[N][P],
计算X[N][P]=f(W[N][N]*X[N][P]+b[N]),
进行T次迭代,
返回最终输出X[N][P],可以看作初始输出的分类。
3.斜坡函数

中国矿产资源评价新技术与评价新模型

输出范围[-1,1]。
四、数据流图
Hopfield网数据流图见附图3。
五、调用函数说明
1.一般实矩阵奇异值分解
(1)功能
用豪斯荷尔德(Householder)变换及变形QR算法对一般实矩阵进行奇异值分解。
(2)方法说明
设A为m×n的实矩阵,则存在一个m×m的列正交矩阵U和n×n的列正交矩阵V,使

中国矿产资源评价新技术与评价新模型

成立。其中
Σ=diag(σ0,σ1,…σp)p⩽min(m,n)-1,
且σ0≥σ1≥…≥σp>0,
上式称为实矩阵A的奇异值分解式,σi(i=0,1,…,p)称为A的奇异值。
奇异值分解分两大步:
第一步:用豪斯荷尔德变换将A约化为双对角线矩阵。即

中国矿产资源评价新技术与评价新模型

其中

中国矿产资源评价新技术与评价新模型

 中的每一个变换Uj(j=0,1,…,k-1)将A中的第j列主对角线以下的元素变为0,而  中的每一个变换Vj(j=0,1,…,l-1)将A中的第j行主对角线紧邻的右次对角线元素右边的元素变为0。]]j具有如下形式:

中国矿产资源评价新技术与评价新模型

其中ρ为一个比例因子,以避免计算过程中的溢出现象与误差的累积,Vj是一个列向量。即
Vj=(υ0,υ1,…,υn-1),
则

中国矿产资源评价新技术与评价新模型

其中

中国矿产资源评价新技术与评价新模型

第二步:用变形的QR算法进行迭代,计算所有的奇异值。即:用一系列的平面旋转变换对双对角线矩阵B逐步变换成对角矩阵。
在每一次的迭代中,用变换

中国矿产资源评价新技术与评价新模型

其中变换  将B中第j列主对角线下的一个非0元素变为0,同时在第j行的次对角线元素的右边出现一个非0元素;而变换Vj,j+1将第j-1行的次对角线元素右边的一个0元素变为0,同时在第j列的主对角线元素的下方出现一个非0元素。由此可知,经过一次迭代(j=0,1,…,p-1)后,B′仍为双对角线矩阵。但随着迭代的进行。最后收敛为对角矩阵,其对角线上的元素为奇异值。
在每次迭代时,经过初始化变换V01后,将在第0列的主对角线下方出现一个非0元素。在变换V01中,选择位移植u的计算公式如下:

中国矿产资源评价新技术与评价新模型

最后还需要对奇异值按非递增次序进行排列。
在上述变换过程中,若对于某个次对角线元素ej满足
|ej|⩽ε(|sj+1|+|sj|)
则可以认为ej为0。
若对角线元素sj满足
|sj|⩽ε(|ej-1|+|ej|)
则可以认为sj为0(即为0奇异值)。其中ε为给定的精度要求。
(3)调用说明
int bmuav(double*a,int m,int n,double*u,double*v,double eps,int ka),
本函数返回一个整型标志值,若返回的标志值小于0,则表示出现了迭代60次还未求得某个奇异值的情况。此时,矩阵的分解式为UAVT;若返回的标志值大于0,则表示正常返回。
形参说明:
a——指向双精度实型数组的指针,体积为m×n。存放m×n的实矩阵A;返回时,其对角线给出奇异值(以非递增次序排列),其余元素为0;
m——整型变量,实矩阵A的行数;
n——整型变量,实矩阵A的列数;
u——指向双精度实型数组的指针,体积为m×m。返回时存放左奇异向量U;
υ——指向双精度实型数组的指针,体积为n×n。返回时存放右奇异向量VT;
esp——双精度实型变量,给定的精度要求;
ka——整型变量,其值为max(m,n)+1。
2.求实对称矩阵特征值和特征向量的雅可比过关法
(1)功能
用雅可比(Jacobi)方法求实对称矩阵的全部特征值与相应的特征向量。
(2)方法说明
雅可比方法的基本思想如下。
设n阶矩阵A为对称矩阵。在n阶对称矩阵A的非对角线元素中选取一个绝对值最大的元素,设为apq。利用平面旋转变换矩阵R0(p,q,θ)对A进行正交相似变换:
A1=R0(p,q,θ)TA,
其中R0(p,q,θ)的元素为
rpp=cosθ,rqq=cosθ,rpq=sinθ,
rqp=sinθ,rij=0,i,j≠p,q。
如果按下式确定角度θ,

中国矿产资源评价新技术与评价新模型

则对称矩阵A经上述变换后,其非对角线元素的平方和将减少  ,对角线元素的平方和增加  ,而矩阵中所有元素的平方和保持不变。由此可知,对称矩阵A每次经过一次变换,其非对角线元素的平方和“向零接近一步”。因此,只要反复进行上述变换,就可以逐步将矩阵A变为对角矩阵。对角矩阵中对角线上的元素λ0,λ1,…,λn-1即为特征值,而每一步中的平面旋转矩阵的乘积的第i列(i=0,1,…,n-1)即为与λi相应的特征向量。
综上所述,用雅可比方法求n阶对称矩阵A的特征值及相应特征向量的步骤如下:
1)令S=In(In为单位矩阵);
2)在A中选取非对角线元素中绝对值最大者,设为apq;
3)若|apq|<ε,则迭代过程结束。此时对角线元素aii(i=0,1,…,n-1)即为特征值λi,矩阵S的第i列为与λi相应的特征向量。否则,继续下一步;
4)计算平面旋转矩阵的元素及其变换后的矩阵A1的元素。其计算公式如下

中国矿产资源评价新技术与评价新模型

5)S=S·R(p,q,θ),转(2)。
在选取非对角线上的绝对值最大的元素时用如下方法:
首先计算实对称矩阵A的非对角线元素的平方和的平方根

中国矿产资源评价新技术与评价新模型

然后设置关口υ1=υ0/n,在非对角线元素中按行扫描选取第一个绝对值大于或等于υ1的元素αpq进行平面旋转变换,直到所有非对角线元素的绝对值均小于υ1为止。再设关口υ2=υ1/n,重复这个过程。以此类推,这个过程一直作用到对于某个υk<ε为止。
(3)调用说明
void cjcbj(double*a,int n,double*v,double eps)。
形参说明:
a——指向双精度实型数组的指针,体积为n×n,存放n阶实对称矩阵A;返回时,其对角线存放n个特征值;
n——整型变量,实矩阵A的阶数;
υ——指向双精度实型数组的指针,体积为n×n,返回特征向量,其中第i列为与λi(即返回的αii,i=0,1,……,n-1)对应的特征向量;
esp——双精度实型变量。给定的精度要求。
3.矩阵求逆
(1)功能
用全选主元高斯-约当(Gauss-Jordan)消去法求n阶实矩阵A的逆矩阵。
(2)方法说明
高斯-约当法(全选主元)求逆的步骤如下:
首先,对于k从0到n-1做如下几步:
1)从第k行、第k列开始的右下角子阵中选取绝对值最大的元素,并记住此元素所在的行号和列号,再通过行交换和列交换将它交换到主元素位置上,这一步称为全选主元;
2)  ;
3)  ,i,j=0,1,…,n-1(i,j≠k);
4)αij-  ,i,j=0,1,…,n-1(i,j≠k);
5)-  ,i,j=0,1,…,n-1(i≠k);
最后,根据在全选主元过程中所记录的行、列交换的信息进行恢复,恢复原则如下:在全选主元过程中,先交换的行、列后进行恢复;原来的行(列)交换用列(行)交换来恢复。

图8-4 东昆仑—柴北缘地区基于HOPFIELD模型的铜矿分类结果图

(3)调用说明
int brinv(double*a,int n)。
本函数返回一个整型标志位。若返回的标志位为0,则表示矩阵A奇异,还输出信息“err**not inv”;若返回的标志位不为0,则表示正常返回。
形参说明:
a——指向双精度实型数组的指针,体积为n×n。存放原矩阵A;返回时,存放其逆矩阵A-1;
n——整型变量,矩阵的阶数。
六、实例
实例:柴北缘—东昆仑地区铜矿分类预测。
选取8种因素,分别是重砂异常存在标志、水化异常存在标志、化探异常峰值、地质图熵值、Ms存在标志、Gs存在标志、Shdadlie到区的距离、构造线线密度。
构置原始变量,并根据原始数据构造预测模型。
HOPFIELD模型参数设置:训练模式维数8,预测样本个数774,参数个数8,迭代次数330。
结果分44类(图8-4,表8-5)。

表8-5 原始数据表及分类结果(部分)


续表

7. Hopfield 神经网络有哪几种训练方法

人工神经网络模型主要考虑网络连接的拓扑结构、神经元的特征、学习规则等。目前,已有近40种神经网络模型,其中有反传网络、感知器、自组织映射、Hopfield网络、波耳兹曼机、适应谐振理论等。根据连接的拓扑结构,神经网络模型可以分为:

(1)前向网络 网络中各个神经元接受前一级的输入,并输出到下一级,网络中没有反馈,可以用一个有向无环路图表示。这种网络实现信号从输入空间到输出空间的变换,它的信息处理能力来自于简单非线性函数的多次复合。网络结构简单,易于实现。反传网络是一种典型的前向网络。

(2)反馈网络 网络内神经元间有反馈,可以用一个无向的完备图表示。这种神经网络的信息处理是状态的变换,可以用动力学系统理论处理。系统的稳定性与联想记忆功能有密切关系。Hopfield网络、波耳兹曼机均属于这种类型。

学习是神经网络研究的一个重要内容,它的适应性是通过学习实现的。根据环境的变化,对权值进行调整,改善系统的行为。由Hebb提出的Hebb学习规则为神经网络的学习算法奠定了基础。Hebb规则认为学习过程最终发生在神经元之间的突触部位,突触的联系强度随着突触前后神经元的活动而变化。在此基础上,人们提出了各种学习规则和算法,以适应不同网络模型的需要。有效的学习算法,使得神经网络能够通过连接权值的调整,构造客观世界的内在表示,形成具有特色的信息处理方法,信息存储和处理体现在网络的连接中。
根据学习环境不同,神经网络的学习方式可分为监督学习和非监督学习。在监督学习中,将训练样本的数据加到网络输入端,同时将相应的期望输出与网络输出相比较,得到误差信号,以此控制权值连接强度的调整,经多次训练后收敛到一个确定的权值。当样本情况发生变化时,经学习可以修改权值以适应新的环境。使用监督学习的神经网络模型有反传网络、感知器等。非监督学习时,事先不给定标准样本,直接将网络置于环境之中,学习阶段与工作阶段成为一体。此时,学习规律的变化服从连接权值的演变方程。非监督学习最简单的例子是Hebb学习规则。竞争学习规则是一个更复杂的非监督学习的例子,它是根据已建立的聚类进行权值调整。自组织映射、适应谐振理论网络等都是与竞争学习有关的典型模型。
研究神经网络的非线性动力学性质,主要采用动力学系统理论、非线性规划理论和统计理论,来分析神经网络的演化过程和吸引子的性质,探索神经网络的协同行为和集体计算功能,了解神经信息处理机制。为了探讨神经网络在整体性和模糊性方面处理信息的可能,混沌理论的概念和方法将会发挥作用。混沌是一个相当难以精确定义的数学概念。一般而言,“混沌”是指由确定性方程描述的动力学系统中表现出的非确定性行为,或称之为确定的随机性。“确定性”是因为它由内在的原因而不是外来的噪声或干扰所产生,而“随机性”是指其不规则的、不能预测的行为,只可能用统计的方法描述。混沌动力学系统的主要特征是其状态对初始条件的灵敏依赖性,混沌反映其内在的随机性。混沌理论是指描述具有混沌行为的非线性动力学系统的基本理论、概念、方法,它把动力学系统的复杂行为理解为其自身与其在同外界进行物质、能量和信息交换过程中内在的有结构的行为,而不是外来的和偶然的行为,混沌状态是一种定态。混沌动力学系统的定态包括:静止、平稳量、周期性、准同期性和混沌解。混沌轨线是整体上稳定与局部不稳定相结合的结果,称之为奇异吸引子。

Hopfield 神经网络有哪几种训练方法

8. hopfield神经网络怎么迭代

人工神经网络模型主要考虑网络连接的拓扑结构、神经元的特征、学习规则等。目前,已有近40种神经网络模型,其中有反传网络、感知器、自组织映射、Hopfield网络、波耳兹曼机、适应谐振理论等。根据连接的拓扑结构,神经网络模型可以分为:

(1)前向网络 网络中各个神经元接受前一级的输入,并输出到下一级,网络中没有反馈,可以用一个有向无环路图表示。这种网络实现信号从输入空间到输出空间的变换,它的信息处理能力来自于简单非线性函数的多次复合。网络结构简单,易于实现。反传网络是一种典型的前向网络。

(2)反馈网络 网络内神经元间有反馈,可以用一个无向的完备图表示。这种神经网络的信息处理是状态的变换,可以用动力学系统理论处理。系统的稳定性与联想记忆功能有密切关系。Hopfield网络、波耳兹曼机均属于这种类型。

学习是神经网络研究的一个重要内容,它的适应性是通过学习实现的。根据环境的变化,对权值进行调整,改善系统的行为。由Hebb提出的Hebb学习规则为神经网络的学习算法奠定了基础。Hebb规则认为学习过程最终发生在神经元之间的突触部位,突触的联系强度随着突触前后神经元的活动而变化。在此基础上,人们提出了各种学习规则和算法,以适应不同网络模型的需要。有效的学习算法,使得神经网络能够通过连接权值的调整,构造客观世界的内在表示,形成具有特色的信息处理方法,信息存储和处理体现在网络的连接中。
根据学习环境不同,神经网络的学习方式可分为监督学习和非监督学习。在监督学习中,将训练样本的数据加到网络输入端,同时将相应的期望输出与网络输出相比较,得到误差信号,以此控制权值连接强度的调整,经多次训练后收敛到一个确定的权值。当样本情况发生变化时,经学习可以修改权值以适应新的环境。使用监督学习的神经网络模型有反传网络、感知器等。非监督学习时,事先不给定标准样本,直接将网络置于环境之中,学习阶段与工作阶段成为一体。此时,学习规律的变化服从连接权值的演变方程。非监督学习最简单的例子是Hebb学习规则。竞争学习规则是一个更复杂的非监督学习的例子,它是根据已建立的聚类进行权值调整。自组织映射、适应谐振理论网络等都是与竞争学习有关的典型模型。
研究神经网络的非线性动力学性质,主要采用动力学系统理论、非线性规划理论和统计理论,来分析神经网络的演化过程和吸引子的性质,探索神经网络的协同行为和集体计算功能,了解神经信息处理机制。为了探讨神经网络在整体性和模糊性方面处理信息的可能,混沌理论的概念和方法将会发挥作用。混沌是一个相当难以精确定义的数学概念。一般而言,“混沌”是指由确定性方程描述的动力学系统中表现出的非确定性行为,或称之为确定的随机性。“确定性”是因为它由内在的原因而不是外来的噪声或干扰所产生,而“随机性”是指其不规则的、不能预测的行为,只可能用统计的方法描述。混沌动力学系统的主要特征是其状态对初始条件的灵敏依赖性,混沌反映其内在的随机性。混沌理论是指描述具有混沌行为的非线性动力学系统的基本理论、概念、方法,它把动力学系统的复杂行为理解为其自身与其在同外界进行物质、能量和信息交换过程中内在的有结构的行为,而不是外来的和偶然的行为,混沌状态是一种定态。混沌动力学系统的定态包括:静止、平稳量、周期性、准同期性和混沌解。混沌轨线是整体上稳定与局部不稳定相结合的结果,称之为奇异吸引子。