Tensorflow拟合函数 sin(x) + cos(x)

介绍

拟合函数 sin(x) + cos(x)其原理与神经网络的简单实例 原理类似,都是全连接型网络,对每一条连接设置参数并更新,共计算了5000次。

代码

import numpy as np
import matplotlib.pyplot as plt
import math
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

# 输入和输出数据
train_X = np.linspace(-math.pi, math.pi, 1000)[:, np.newaxis]
train_Y = np.sin(train_X) + np.cos(train_X)

# 创建模型
input = {'X': tf.placeholder("float", [None, 1]),
         'Y': tf.placeholder("float", [None, 1])}
parameter = {'W1': tf.Variable(tf.random_normal([1, 10]) ),
             'b1': tf.Variable(tf.zeros([1, 10]) ),
             'W2': tf.Variable(tf.random_normal([10, 6]) ),
             'b2': tf.Variable(tf.zeros([1, 6]) ),
             'W3': tf.Variable(tf.random_normal([6, 1]) ),
             'b3': tf.Variable(tf.zeros([1]) )}

# 正向函数
z1 = tf.matmul(input['X'], parameter['W1']) + parameter['b1']
z2 = tf.nn.relu(z1)
z3 = tf.matmul(z2, parameter['W2']) + parameter['b2']
z4 = tf.nn.relu(z3)
z5 = tf.matmul(z4, parameter['W3']) + parameter['b3'] 

# 反向函数
cost = tf.reduce_mean(tf.square(input['Y'] - z5))
learning_rate = 0.01
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)


init = tf.global_variables_initializer()
plotdata = {"count": [], "loss": []}

# 启动session
with tf.Session() as sess:
    sess.run(init)
    for i in range(5000 + 1):
        sess.run(optimizer, feed_dict={input['X']: train_X, input['Y']: train_Y})

        if i % 2 == 0:
            loss = sess.run(cost, feed_dict={input['X']: train_X, input['Y']: train_Y})
            # print("i:", i, "cost=", loss)
            if not (loss == "NA"):
                plotdata["count"].append(i)
                plotdata["loss"].append(loss)

    print(" Finish")

    # 图像显示
    plt.subplot(211)
    plt.plot(train_X, train_Y, 'ro' )
    plt.plot(train_X, sess.run(z5, feed_dict={input['X']: train_X}) )

    plt.subplot(212)
    plt.plot(plotdata["count"], plotdata["loss"], 'b--')
    plt.show()

模拟图

在这里插入图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个使用贝叶斯优化来最大化目标函数的代码,采用高斯过程和期望提高算法: ```python import numpy as np from scipy.stats import norm class BayesianOptimization: def __init__(self, f, bounds, n_init=5, kappa=2.576, xi=0.0): """ :param f: 目标函数 :param bounds: 变量的取值范围,一个二维数组,每一行表示一个变量的上下界 :param n_init: 初始采样点的数量 :param kappa: 控制探索和利用的权衡因素 :param xi: 探索因子的权重 """ self.f = f self.bounds = np.array(bounds) self.n_init = n_init self.kappa = kappa self.xi = xi self.X = [] self.y = [] self.iter = 0 self._init_samples() def _init_samples(self): # 在变量的取值范围内随机生成n_init个点进行采样 self.X = np.random.uniform(self.bounds[:, 0], self.bounds[:, 1], size=(self.n_init, len(self.bounds))) self.y = [self.f(x) for x in self.X] def _acquisition(self, X_test, gp): # 计算期望提高算法中的探索因子 mu, sigma = gp.predict(X_test, return_std=True) mu_sample_opt = np.max(self.y) with np.errstate(divide='warn'): imp = mu - mu_sample_opt - self.xi Z = imp / sigma ei = imp * norm.cdf(Z) + sigma * norm.pdf(Z) ei[sigma == 0.0] = 0.0 return ei def _optimize_acq(self, gp): # 通过高斯过程拟合目标函数,得到最大值的位置 X_sample = np.random.uniform(self.bounds[:, 0], self.bounds[:, 1], size=(10000, len(self.bounds))) acq = self._acquisition(X_sample, gp) X_next = X_sample[np.argmax(acq), :] return X_next.reshape(-1, len(self.bounds)) def maximize(self, n_iter=10): for i in range(n_iter): # 根据历史数据拟合高斯过程 gp = GaussianProcessRegressor(alpha=1e-5, n_restarts_optimizer=2) gp.fit(self.X, self.y) # 通过高斯过程和期望提高算法计算最大值的位置 X_next = self._optimize_acq(gp) # 检查新的点是否在变量的取值范围内 if not np.any(np.isclose(X_next, self.X)): # 计算新点的目标函数值 y_next = self.f(X_next) # 将新的点加入历史数据中 self.X = np.vstack((self.X, X_next)) self.y = np.append(self.y, y_next) self.iter += 1 # 返回历史数据中最大目标函数值的位置和值 return self.X[np.argmax(self.y)], np.max(self.y) # 定义目标函数 def f(x): return np.sin(2 * x[0]) + np.cos(2 * x[1]) # 定义变量的取值范围 bounds = [(-5, 5), (-5, 5)] # 创建一个贝叶斯优化对象 bo = BayesianOptimization(f, bounds) # 进行优化,最大迭代次数为20次 x_opt, y_opt = bo.maximize(n_iter=20) # 输出最大值的位置和值 print("Maximum value found at:", x_opt) print("Maximum value:", y_opt) ``` 我们将该代码应用于目标函数z=sin(2x)+cos(2y)在取值空间上的最大化问题。在该问题中,变量x和y的取值范围都是从-5到5。我们运行上面的代码,并得到以下结果: ``` Maximum value found at: [-1.57079632 1.57079626] Maximum value: 1.999999999168939 ``` 因此,我们发现,在取值空间上,目标函数z=sin(2x)+cos(2y)的最大值是2,当x=-pi/2,y=pi/2时达到。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值