function main()
clc % 清屏
close all; % 关闭当前所有figure图像
warning off; % 屏蔽没有必要的警告
SamNum=20; % 输入样本数量为20
TestSamNum=20; % 测试样本数量也是20
ForcastSamNum=2;% 预测样本数量为2
HiddenUnitNum=8;% 中间层隐节点数量取8
InDim=2; % 网络输入维度为2
OutDim=5; % 网络输出维度为5
% 原始数据
%星级
star_rating=[5,5,5,5,5,5,5,5,5,5,5,5];
%可靠性
reliability=[0.9022,0.9022,0.9022,0.9022,0.9022,0.9022,0.9022,0.9022,0.9022,0.9022,0.9022,0.9022];
% 喜欢因素
love=[0,0,0,0,0,0.9022,0.9022,0,0,0,0,0.9022,0.9022,0,0.9022,0.9022,0.9022,0.9022,0,0.9022];
%运输因素
transportation=[0,0,0,0,0,0,0.9022,0,0,0,0,0,0,0,0,0,0,0,0,0];
%功能质量因素
functions=[0,0,0,0,0.9022,0.9022,0,0.9022,0.9022,0.9022,0,0.9022,0,0.9022,0,0,0.9022,0,0.9022,0];
%价格因素
prize=[0.9022,0.9022,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.9022,0,0.9022,0];
%尺寸因素
size=[0,0.9022,0,0.9022,0.9022,0,0.9022,0.9022,0,0.9022,0.9022,0,0,0.9022,0.9022,0,0.9022,0,0.9022,0];
p=[star_rating;reliability]; % 输入数据矩阵
t=[love;transportation;functions;prize;size]; % 目标数据矩阵
[SamIn,minp,maxp]=premnmx(p);
[tn,mint,maxt]=premnmx(t);
% 原始样本对(输入和输出)初始化
rand('state',sum(100*clock));
sum(100*clock); % 依据系统时钟种子产生随机数
NoiseVar=0.01; % 噪声强度为0.01(添加噪声的目的是为了防止网络过度拟合)
Noise=NoiseVar*randn(5,SamNum); % 生成噪声
SamOut=tn+Noise; % 将噪声添加到输出样本上
TestSamIn=SamIn; % 这里取输入样本与测试样本相同,因为样本容量偏少
TestSanOut=SamOut; % 也取输出样本与测试样本相同
MaxEpochs=50000; % 最多训练次数为50000
lr=0.035; % 学习速率为0.035
E0=0.65*10^(-3); % 目标误差为0.65*10^(-3)
W1=0.5*rand(HiddenUnitNum,InDim)-0.1;% 初始化输入层与隐含层之间的权值
B1=0.5*rand(HiddenUnitNum,1)-0.1;% 初始化输入层与隐含层之间的权值
W2=0.5*rand(OutDim,HiddenUnitNum)-0.1;% 初始化输出层与隐含层之间的权值
B2=0.5*rand(OutDim,1)-0.1;% 初始化输出层与隐含层之间的权值
ErrHistory=[]; % 给中间变量预先占据内存
for i=1:MaxEpochs
HiddenOut=logsig(W1*SamIn+repmat(B1,2,SamNum)); % 隐含层网络输出
NetworkOut=W2*HiddenOut+repmat(B2,1,SamNum); %输出层网络输出
Error=SamOut-NetworkOut; % 实际输出与网络输出之差
SSE=sumsqr(Error); % 能量函数(误差平方和)
ErrHistory=[ErrHistory SSE];
if SSE
% 以下6行是BP网络最核心的程序
% 它们是权值(阙值)依据能量函数负梯度下降原理所做的每一步动态调整
Delta2=Error;
Delta1=W2'*Delta2.*HiddenOut.*(1-HiddenOut);
% 对输出层与隐含层之间的权值和阙值进行修正
dW2=Delta2*HiddenOut';
dB2=Delta2*ones(SamNum,1);
% 对输入层与隐含层之间的权值和阙值进行修正
dW1=Delta1*SamIn';
dB1=Delta1*ones(SamNum,1);
W2=W2+lr*dW2;
B2=B2+lr*dB2;
W1=W1+lr*dW1;
B1=B1+lr*dB1;
end
HiddenOut=logsig(W1*SamIn+repmat(B1,1,TestSamNum)); % 隐含层输出最终结果
NetworkOut=W2*HiddenOut+repmat(B2,1,TestSamNum); % 输出层输出最终结果
a=postmnmx(NetworkOut,mint,maxt); % 还原网络输出层的结果
x=[love,transportation,functions,pize,size ]; % 时间轴刻度
newk=a(1,:); % 网络输出属性占比值
newk=a(2,:); %网络输出属性占比质
figure;
subplot(2,1,1);plot(x,newk,'r-o',x,love,'b--+'); % 绘制5星喜爱属性图
legend('网络输出评论属性值','实际评论属性值');
xlabel('属性'); ylabel('占比值');
title('源程序神经网络评论属性学习和测试对比图');
subplot(2,1,2);plot(x,newh,'r-o',x,transportation,'b--+'); % 绘制5星运输对比图
legend('网络输出评论属性值','实际评论属性值');
xlabel('属性'); ylabel('占比值');
title('源程序神经网络属性学习和测试对比图');
subplot(2,1,2);plot(x,newh,'r-o',x,functions,'b--+'); % 绘制5星功能对比图
legend('网络输出评论属性值','实际评论属性值');
xlabel('属性'); ylabel('占比值');
title('源程序神经网络属性学习和测试对比图');
subplot(2,1,2);plot(x,newh,'r-o',x,prize,'b--+'); % 绘制5星价格对比图
legend('网络输出评论属性值','实际评论属性值');
xlabel('属性'); ylabel('占比值');
title('源程序神经网络属性学习和测试对比图');
subplot(2,1,2);plot(x,newh,'r-o',x,size,'b--+'); % 绘制5星尺寸对比图
legend('网络输出评论属性值','实际评论属性值');
xlabel('属性'); ylabel('占比值');
title('源程序神经网络属性学习和测试对比图');
% 利用训练好的数据进行预测
% 当用训练好的网络对新数据pnew进行预测时,也应做相应的处理
pnew=[73.39 75.55
3.9635 4.0975
0.9880 1.0268]; % 2010年和2011年的相关数据
pnewn=tramnmx(pnew,minp,maxp); %利用原始输入数据的归一化参数对新数据进行归一化
HiddenOut=logsig(W1*pnewn+repmat(B1,1,ForcastSamNum)); % 隐含层输出预测结果
anewn=W2*HiddenOut+repmat(B2,1,ForcastSamNum); % 输出层输出预测结果
% 把网络预测得到的数据还原为原始的数量级
format short
anew=postmnmx(anewn,mint,maxt)
标红部分一直显示数组维度有错误是怎么回事呢
矩阵维度必须一致。
出错 main (line 55)
HiddenOut=logsig(W1*SamIn+repmat(B1,2,SamNum)); % 隐含层网络输出