使用神经网络拟合曲线(MATLAB/Python)

前言

神经网络通常用于分类任务,也可以用于回归任务。使用一个含有隐层的神经网络可以很轻松地拟合出非线性曲线。下面是几个示例,包含matlab的和python的,都很简单。

实例1

首先,生成正弦曲线,并引入随机噪声。随后,在matlab中使用feedforwardnet函数创建BP神经网络,训练网络,并查看最后的拟合结果。

%%
clc;
clear all;
close all;

%% 生成正弦曲线
x = linspace(-2*pi, 2*pi, 100);
y = sin(x);
% 对目标值加入噪声
n = 0.1 * rand(1, length(x));
y = y + n;

% figure();
% plot(x, y, 'b-');

%% 数据归一化,创建测试数据集
[x_, ps] = mapminmax(x);
data_input = x_;
data_target = y;

% figure();
% plot(data_input, data_target, 'b-');

data_test = linspace(-5, 5, 50);
data_true = sin(data_test);
data_t = mapminmax('apply', data_test, ps);

% figure();
% plot(data_t, data_true, 'b-');

%% 创建神经网络(也可打开nntool,在matlab中使用gui创建神经网络)
hidden_layer_size = 10;
net = feedforwardnet(hidden_layer_size);
[net, tr] = train(net, data_input, data_target);

%% 拟合结果
data_y = sim(net, data_t);
% data_y = net(data_t);
figure();
e = 0.5 * (data_true - data_y) .^ 2;
plot(e);
xlabel('x axis');
ylabel('y axis');
legend('error');

figure();
hold on;
plot(data_test, data_y, '*');
plot(x, y, 'b');
xlabel('x axis');
ylabel('y axis');
legend('prediction', 'real value');

运行结果截图:
x轴是测试数据的x坐标,y轴是x坐标对应预测值和曲线真实值的误差。
这里写图片描述
曲线和拟合结果:
这里写图片描述

实例2

这里还是用matlab进行的实验。拟合的目标是一个圆,将圆拆成上下两条曲线,分别进行拟合。

%%
clc;
clear all;
close all;

%% 生成圆的上半边和下半边
center_x = 0;
center_y = 0;
radius = 4;
x1 = [];
x2 = [];
y1 = [];
y2 = [];
for theta = 0:0.1:pi
    x_ = center_x + radius * cos(theta);
    x1 = [x1 x_];
    y_ = center_y + radius * sin(theta);
    y1 = [y1 y_];
end

for theta = pi:0.1:2*pi
    x_ = center_x + radius * cos(theta);
    x2 = [x2 x_];
    y_ = center_y + radius * sin(theta);
    y2 = [y2 y_];
end

% 绘制曲线
figure();
hold on;
plot(x1, y1);
plot(x2, y2);
xlabel('x');
ylabel('y');
xlim([-(radius+2), (radius+2)]);
ylim([-(radius+2), (radius+2)]);

%% 创建神经网络
hidden_layer_size = 8;
net1 = feedforwardnet(hidden_layer_size);
net2 = feedforwardnet(hidden_layer_size);
[net1, tr] = train(net1, x1, y1);
[net2, tr] = train(net2, x2, y2);

%% 测试结果
test_x = linspace(-5, 5, 20);
p1 = sim(net1, test_x);
p2 = sim(net2, test_x);
% figure();
% hold on;
plot(test_x, p1, '*');
plot(test_x, p2, '*');
xlim([-(radius+2), (radius+2)]);
ylim([-(radius+2), (radius+2)]);

结果截图:
从结果来看,训练好的网络只在圆所在范围内预测有效,出了范围就失效了。
这里写图片描述

实例3

例子很简单,使用tensorflow构建了一个单隐层神经网络,并进行拟合。
首先导入模块。

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

创建数据,并引入噪声。

x_data = np.linspace(-1,1,300)[:, np.newaxis]
noise = np.random.normal(0, 0.05, x_data.shape)
y_data = np.square(x_data) - 0.5 + noise

绘制图片看看。

plt.plot(x_data, y_data)

png

创建TensorFlow的占位符,用于后面导入数据。

xs = tf.placeholder(tf.float32, [None, 1])
ys = tf.placeholder(tf.float32, [None, 1])

创建一个全连接层(隐藏层),激活函数为relu。

w1 = tf.Variable(tf.random_normal([1, 10]))
b1 = tf.Variable(tf.zeros([1, 10]) + 0.1)
ip1 = tf.matmul(xs, w1) + b1
out1 = tf.nn.relu(ip1)

输出层,不接激活函数。

w2 = tf.Variable(tf.random_normal([10,1]))
b2 = tf.Variable(tf.zeros([1, 1]) + 0.1)
ip2 = tf.matmul(out1, w2) + b2
out2 = ip2

loss为均方误差,使用SGD训练网络。

loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys-out2), reduction_indices=[1]))
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

初始化参数,创建会话。

init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)

开始训练。

for i in range(1000):
    _, loss_value = sess.run([train_step, loss], feed_dict={xs:x_data, ys:y_data})
    if i%50==0:
        print(loss_value)
0.914197
0.0143666
0.00786084
0.00659379
0.00575486
0.00504135
0.00450164
0.00415548
0.00389943
0.00368641
0.00353138
0.00337983
0.00325611
0.00315293
0.0030722
0.00300812
0.0029489
0.00290472
0.00286406
0.00282905

预测结果看看。

pred = sess.run(out2, feed_dict={xs:x_data})

可以看出拟合出了大致的曲线,但是受到噪声干扰不是很标准。

plt.plot(x_data, pred)

png

### 回答1: matlab归一化函数mapminmax是一种常用的数据预处理方法,它可以将数据缩放到指定的范围内,通常是[,1]或[-1,1]。该函数可以应用于单个向量或矩阵,可以对每一列或每一行进行归一化处理。使用该函数可以有效地提高数据的可视化效果和模型的训练效果。 ### 回答2: MATLAB中的归一化函数mapminmax是一个非常有用的函数,它可以将一个数组的数据映射至指定的区间内。该函数能够将输入矩阵的值域缩放至指定的范围内,如[0,1]或[-1,1]等,从而使得数据归一化后更容易被处理和分析。 该函数是基于最大最小值进行归一化的,通过将输入矩阵中的最小值设置为指定范围内的最小值,将最大值设置为指定范围内的最大值,从而将数据缩放至指定范围内。具体的归一化公式为: y = (x-min(x))/(max(x)-min(x))*(ymax-ymin)+ymin 其中x表示输入矩阵的元素,min(x)和max(x)分别为输入矩阵的最小值和最大值,ymin和ymax分别为指定的最小值和最大值,y则为归一化后的输出矩阵。 使用mapminmax函数时,可以使用默认参数(即归一化至[0,1]区间内),也可以指定自己所需的最小值和最大值。例如,当将数据归一化至[-1,1]区间时,可以使用以下代码: x = [1 2 3; 4 5 6; 7 8 9]; [y,settings] = mapminmax(x,-1,1); 其中settings是一个结构体,包含: settings.min:归一化所使用的最小值 settings.max:归一化所使用的最大值 settings.gain:缩放因子,即原始数据与归一化后数据之间的比例 归一化操作对于许多机器学习算法和模型来说都是非常重要的预处理步骤。通过使用mapminmax函数,我们可以轻松将数据归一化至指定范围内,减小不同特征之间的数值差异,提高模型的性能和准确度。 ### 回答3: Matlab是一款常用的数学软件,其中有一个归一化函数叫做mapminmax。该函数可以对数据进行线性归一化,将数据范围缩放到[0, 1]之间。输入为原始数据向量,输出为归一化后的数据向量。该函数具有以下参数: 1. data:表示输入的原始数据向量。 2. ymin和ymax:表示数据的上下限值,通过设置这两个参数,可以将数据范围缩放到任意值之间,而不是[0,1]。 3. ynewmin和ynewmax:表示输出数据的范围,缺省值为[0,1]。 该函数使用的归一化公式如下: 归一化数据 = (原始数据 - 最小值) / (最大值 - 最小值) * (ynewmax - ynewmin) + ynewmin 其中,最小值和最大值为原始数据中的最小值和最大值。 使用mapminmax函数进行归一化的好处有几个: 1. 可以将数据范围缩放到[0, 1]之间,方便进行后续处理; 2. 可以缩短不同属性之间的差异,使各属性的权重更加平等; 3. 可以消除数据之间的量纲和单位的差别,从而更直观地进行数据分析。 总之,mapminmax函数是Matlab中非常实用的归一化函数,可以方便地将数据范围缩放到指定范围内,便于数学计算和数据分析。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值