查找返回黑盒模型最大输出的最佳输入组合

马克·施瓦姆巴赫

在将ANN应用于我的工作中的回归任务时,我面临的挑战之一是,为了在给定的输入范围内找到最佳的选择,我必须将多维网格网格输入到我的模型中,然后简单地选择最高的网格值。但是,这总体上是一个计算量很大的解决方案。波纹管的长度可能令人恐惧,但这只是我为更好地解释它的尝试。

让我用其他话解释一下。假设我的ANN有9个输入,然后我想检查哪些要素值组合可以返回最高结果。我目前仅通过创建9D网格并简单地预测每个样本的值,然后确定最佳行来解决该问题。然而,这需要花费大量的时间来工作。因此,我正在寻找一种方法,如果可能的话,能够更有效地达到此最佳输出值。

在代码中,它看起来像这样:(只是一个简单的示例,在python中并不现实):

import numpy as np
from itertools import product
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split 
import tensorflow.keras
from keras.models import Sequential
from keras.layers import Dense
import pandas as pd
import math

x1 = np.linspace(0,20,6)
x2 = np.linspace(0,20,6)
X = pd.DataFrame((product(*[x1,x2])))
y1 = 5*np.cos(np.deg2rad(X[0]))
y2 = 5 - 1*np.exp((-X[0]**2/np.deg2rad(10)**2)*np.cos(np.deg2rad(X[1])))
y = np.array([y1 + y2]).T

设置黑盒模型,在这种情况下为神经网络

x_scaler = MinMaxScaler()
y_scaler = MinMaxScaler()
X_scaled = x_scaler.fit_transform(X)
y_scaled = y_scaler.fit_transform(y)
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y_scaled, test_size=0.2, random_state=0)

model = Sequential()
model.add(Dense(100, input_dim = 2, activation = 'relu'))
model.add(Dense(100, activation='relu'))
model.add(Dense(100, activation='relu'))
model.add(Dense(1, activation = 'relu'))
model.compile(optimizer = 'Adam', loss = 'mean_squared_error')
epochs_hist = model.fit(X_train, y_train, epochs = 100, batch_size = 50, validation_split = 0.2)

现在,我拟合了模型,我将在多个时间间隔内使用meshgrid,以便在指定范围内找到最佳值:

x1_pred = np.linspace(0,20,21) 
x2_pred = np.linspace(0,20,21)
X_pred = pd.DataFrame((product(*[x1_pred,x2_pred])))
X_pred_test = x_scaler.fit_transform(X_pred)
y_pred = model.predict(X_pred_test)
y_pred = y_scaler.inverse_transform(y_pred)

因此,假设我为达到最佳效果做了类似的事情,但是在这种情况下只有9个输入,那么很显然,计算在计算上将是不可行的。因此,我的问题是如何找到输入的最佳组合,这些输入可以返回黑盒模型(如ANN)的最大输出。

内森

这是一个如何从模型中获得“最佳结果”的示例。最重要的部分是optimize_get_simplex_call_model通过这种方式,可以减少模型所需的调用量。

from sklearn.ensemble import GradientBoostingRegressor
import numpy as np
from scipy.optimize import minimize
from copy import copy


class Example:

    def __init__(self):
        self.X = np.random.random((10000, 9))
        self.y = self.get_y()
        self.clf = GradientBoostingRegressor()
        self.fit()

    def get_y(self):
        # sum of squares, is minimum at x = [0, 0, 0, 0, 0 ... ]
        return np.array([[self._func(i)] for i in self.X])

    def _func(self, i):
        return sum(i * i)

    def fit(self):
        self.clf.fit(self.X, self.y)

    def optimize(self):
        x0 = [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]
        initial_simplex = self._get_simplex(x0, 0.1)
        result = minimize(fun=self._call_model,
                          x0=np.array(x0),
                          method='Nelder-Mead',
                          options={'xatol': 0.1,
                                   'initial_simplex': np.array(initial_simplex)})
        return result

    def _get_simplex(self, x0, step):
        simplex = []
        for i in range(len(x0)):
            point = copy(x0)
            point[i] -= step
            simplex.append(point)

        point2 = copy(x0)
        point2[-1] += step
        simplex.append(point2)
        return simplex

    def _call_model(self, x):
        prediction = self.clf.predict([x])
        return prediction[0]

example = Example()
result = example.optimize()
print(result)

当然,如果您想最大化而不是最小化,则可以返回-prediction[0]而不是prediction[0]欺骗。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么函数会在python 3中返回自身的最大输出递归

来自分类Dev

查找数字的最大输出

来自分类Dev

增加“最大输出缓冲区大小”有什么风险?

来自分类Dev

Web音频上下文和缓冲区的最大输出数量是多少

来自分类Dev

查找给定数量的输入的函数的最大返回值和相应的输入

来自分类Dev

查找具有最大功能值的列表的最佳组合

来自分类Dev

如何在numpy中设置最大输出宽度?

来自分类Dev

Azure Media Encoder中的最大输出大小

来自分类Dev

大输入时阶乘函数返回负数

来自分类Dev

(Java)如何跟踪用户确定最小和最大输入的数字

来自分类Dev

COUNTIF公式的最大输出量有限

来自分类Dev

Google图表控件-最小和最大输入字段,而不是滑块

来自分类Dev

与最小和最大输出关联的Pandas和DataFrames调用日期

来自分类Dev

查找在某个范围内产生最大输出的元素的标准功能?

来自分类Dev

我正在尝试在2D向量中获得最大输出

来自分类Dev

复选框以控制rangevalidator或文本框的最大输入倍数

来自分类Dev

最大输出文件大小ddrescue是多少?(恢复的大小)

来自分类Dev

第二个输入的最大输入?

来自分类Dev

关于几何着色器最大输出的困惑

来自分类Dev

仅2个插槽即可最大输出32 GB的Ram

来自分类Dev

电源上的瓦数仅表示最大输出瓦数吗?

来自分类Dev

R sprintf最大输入长度

来自分类Dev

使用大输入时输出错误

来自分类Dev

Azure流分析作业的最大输出数量

来自分类Dev

编译器是否有可能获得最大输出?

来自分类Dev

Ghostscript的最大输入文件数(gs)

来自分类Dev

在子查询中获取最大输入日期

来自分类Dev

Tensorflow 最大输入层大小

来自分类Dev

如何从while循环中获得最大输出

Related 相关文章

  1. 1

    为什么函数会在python 3中返回自身的最大输出递归

  2. 2

    查找数字的最大输出

  3. 3

    增加“最大输出缓冲区大小”有什么风险?

  4. 4

    Web音频上下文和缓冲区的最大输出数量是多少

  5. 5

    查找给定数量的输入的函数的最大返回值和相应的输入

  6. 6

    查找具有最大功能值的列表的最佳组合

  7. 7

    如何在numpy中设置最大输出宽度?

  8. 8

    Azure Media Encoder中的最大输出大小

  9. 9

    大输入时阶乘函数返回负数

  10. 10

    (Java)如何跟踪用户确定最小和最大输入的数字

  11. 11

    COUNTIF公式的最大输出量有限

  12. 12

    Google图表控件-最小和最大输入字段,而不是滑块

  13. 13

    与最小和最大输出关联的Pandas和DataFrames调用日期

  14. 14

    查找在某个范围内产生最大输出的元素的标准功能?

  15. 15

    我正在尝试在2D向量中获得最大输出

  16. 16

    复选框以控制rangevalidator或文本框的最大输入倍数

  17. 17

    最大输出文件大小ddrescue是多少?(恢复的大小)

  18. 18

    第二个输入的最大输入?

  19. 19

    关于几何着色器最大输出的困惑

  20. 20

    仅2个插槽即可最大输出32 GB的Ram

  21. 21

    电源上的瓦数仅表示最大输出瓦数吗?

  22. 22

    R sprintf最大输入长度

  23. 23

    使用大输入时输出错误

  24. 24

    Azure流分析作业的最大输出数量

  25. 25

    编译器是否有可能获得最大输出?

  26. 26

    Ghostscript的最大输入文件数(gs)

  27. 27

    在子查询中获取最大输入日期

  28. 28

    Tensorflow 最大输入层大小

  29. 29

    如何从while循环中获得最大输出

热门标签

归档