Im Allgemeinen wird das Finden der physikalischen Eigenschaften einer synthetisierten Substanz aus den Bedingungen der Synthesequelle als ** Vorwärtsproblem ** bezeichnet, und in der entgegengesetzten Richtung wird es manchmal als ** Lösen eines Rückwärtsproblems ** ausgedrückt.
** Führen Sie eine inverse Analyse des maschinellen Lernmodells durch. ** **.
Wenn die physikalischen Eigenschaften durch maschinelles Lernen vorhergesagt werden können, sollte es möglich sein, nach einem Eingabewert zu suchen, der die Ausgabe des Modells zu einem vorbestimmten Wert macht.
Je größer jedoch die Eingabedimension (die Anzahl der erklärenden Variablen) ist, desto größer ist der zu durchsuchende Raum, und es sollte Fälle geben, in denen eine inverse Analyse abhängig von der Suchzeit und der Leistung des Computers nicht durchgeführt werden kann.
Ohne etwas Kompliziertes zu tun, werde ich versuchen, ** nach dem Eingabewert zu suchen, der die Ausgabe für das Regressionsmodell minimiert **.
Zufälliger Wald wird vorerst als Regressionsmodell verwendet.
SMBO (Sequential Model-based Global Optimization) wird als Suchalgorithmus verwendet, und hyperopt wird als Bibliothek verwendet. (Es gibt andere verschiedene Methoden).
Als einfaches Modell
y= x_1 {}^2 + x_2 {}^2, \qquad (x_1, x_2) \in \mathbb{R} ^2
Ich denke an die Korrespondenz. Offensichtlich ist der Mindestwert $ 0 $ und der Punkt, der dies angibt, ist $ (x_1, x_2) = (0,0) $.
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
def true_function(x, y):
"""Wahre Funktion"""
return x ** 2 + y ** 2
X, Y = np.mgrid[-100:100, -100:100]
Z = true_function(X, Y)
plt.rcParams["font.size"] = 10 #Erhöhen Sie die Schriftgröße
fig = plt.figure(figsize = (12, 9))
ax = fig.add_subplot(111, projection="3d", facecolor="w")
ax.plot_surface(X, Y, Z, cmap="rainbow", rstride=3, cstride=3)
ax.set_xlabel('x1', fontsize=15)
ax.set_ylabel('x2', fontsize=15)
ax.set_zlabel('y', fontsize=15)
plt.show()
Basierend auf der obigen Entsprechung wird eine Eingabe / Ausgabe-Stichprobengruppe erzeugt.
Zeichnen Sie die generierten Trainingsdaten.
from sklearn.model_selection import train_test_split
def true_model(X):
return true_function(X[:,[0]], X[:,[1]])
X = np.random.uniform(low=-100,high=100,size=(3000,2))
Y = true_model(X)
test_size = 0.3 #Teilungsverhältnis
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=test_size, random_state=0)
fig = plt.figure(figsize = (12, 9))
ax = plt.axes(projection ="3d")
sctt = ax.scatter3D(x_train[:,0], x_train[:,1], y_train[:,0], c=y_train[:,0], s=8, alpha = 0.6,
cmap = plt.get_cmap('rainbow'), marker ='^')
plt.title("x_train, y_train")
ax.set_xlabel('x1', fontsize=15)
ax.set_ylabel('x2', fontsize=15)
ax.set_zlabel('y', fontsize=15)
plt.show()
Der zufällige Wald wird mit den zuvor erwähnten Trainingsdaten trainiert, und das Ergebnis der Schlussfolgerung der Testdaten wird gezogen.
Es scheint, dass der richtige Wert geschätzt werden kann.
Versuchen Sie, den Mindestwert mit hyperopt zu ermitteln.
Suchen Sie nach dem Definieren der zu minimierenden Funktion nach dem Punkt, der den Mindestwert angibt, und zeichnen Sie den erhaltenen Punkt über die vorherige Abbildung.
from hyperopt import hp
from hyperopt import fmin
from hyperopt import tpe
def objective_hyperopt_by_reg(args):
"""Zielfunktion für Hyperopt"""
global reg
x, y = args
return float(reg.predict([[x,y]]))
def hyperopt_exe():
"""Führen Sie die Optimierung mit Hyperopt durch"""
#Suchraumeinstellungen
space = [
hp.uniform('x', -100, 100),
hp.uniform('y', -100, 100)
]
#Beginnen Sie mit der Erkundung
best = fmin(objective_hyperopt_by_reg, space, algo=tpe.suggest, max_evals=500)
return best
best = hyperopt_exe()
print(f"best: {best}")
fig = plt.figure(figsize = (12, 9))
ax = plt.axes(projection ="3d")
sctt = ax.scatter3D(x_test[:,0], x_test[:,1], y_test[:,0], c=y_test[:,0], s=6, alpha = 0.5,
cmap = plt.get_cmap('rainbow'), marker ='^')
ax.scatter3D([best["x"]], [best["y"]], [objective_hyperopt_by_reg((best["x"], best["y"]))],
c="red", s=250, marker="*", label="minimum")
plt.title("x_test, y_pred", fontsize=18)
ax.set_xlabel('x1', fontsize=15)
ax.set_ylabel('x2', fontsize=15)
ax.set_zlabel('y', fontsize=15)
plt.legend(fontsize=15)
plt.show()
output
100%|██████████████████████████████████████████████| 500/500 [00:09<00:00, 52.54trial/s, best loss: 27.169204190118908]
best: {'x': -0.6924078319870626, 'y': -1.1731945130395605}
Ein Punkt nahe dem Minimalpunkt wurde erhalten.
In diesem Artikel haben wir das Verfahren zum Lernen des Regressionsmodells ⇒ inverse Analyse einfacher Daten durchgeführt.
Da die Eingabedimension diesmal klein war, konnten wir den Mindestwert zufällig ermitteln. Es wird jedoch erwartet, dass beim Anwenden auf tatsächliche Daten verschiedene Probleme auftreten.
Außerdem ist ** umgekehrtes Problem eine äußerst unsinnige Analyse, wenn sie nicht richtig gehandhabt wird. Es wird erwartet, dass das Risiko besteht **.
Ich möchte definitiv vermeiden, Mühe zu verschwenden, weil ich trotz eines solchen Problems ein umgekehrtes Problem eingestellt habe.
Recommended Posts