Вот вариант на неограниченное количество точек, в первую очередь нужно установленный на ПК или где то еще python, далее запустить представленный ниже код (возможно несколько раз, чем ближе к единице тем лучше)
Код:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pathlib import Path
from sklearn.neural_network import MLPRegressor
from sklearn.linear_model import LinearRegression
import warnings
warnings.simplefilter(action='ignore', category=UserWarning)
def create_RELU_model():
return MLPRegressor(
hidden_layer_sizes=(4,),
max_iter=2600000,
solver='lbfgs',
activation='relu',
alpha=0.000001,
early_stopping=True)
def addRows(dataframe, beginer, num):
mX = dataframe[['gaz']][num:(num+2)]
mY = dataframe[['voz']][num:(num+2)]
lr = LinearRegression().fit(mX, mY)
for x in np.arange(mX.iloc[-1]['gaz'],mX.iloc[0]['gaz'],0.01):
beginer.loc[len(beginer)] = [x,lr.predict([[x]])[0][0]]
stuff_uno = [20., 25., 30., 35.] # ввод табличных входных данных
tnar = pd.DataFrame(stuff_uno).rename(columns = {0:'gaz'})
stuff_duo = [10., 15., 20., 25.,] # ввод табличных результирующих данных
tkot = pd.DataFrame(stuff_duo).rename(columns = {0:'voz'})
frames = [tnar,tkot]
df = pd.concat(frames, join = 'inner', axis = 1)
bgn = df.copy()
for idx in range(0,len(stuff_uno)-1):
addRows(df,bgn, idx)
df = bgn.sort_values(by=['gaz'])
X = np.array(df['gaz']).reshape(-1,1)
y = df['voz'].values.ravel()
mlp = create_RELU_model()
mlp.fit(X,y)
ref = mlp.score(X,y)
print('MLP SCORE: ', ref)
fig, ax = plt.subplots()
X2 = np.arange(15.,40.,0.2).reshape(-1,1) # проверка за пределами диапазона
y2 = mlp.predict(X2)
ax.plot(X2, y2, label="mlp_relu")
ax.plot(X, y, label="table")
plt.legend()
plt.show()
w0_0 = mlp.coefs_[0][0][0]
w1_0 = mlp.coefs_[0][0][1]
w2_0 = mlp.coefs_[0][0][2]
w3_0 = mlp.coefs_[0][0][3]
b0_0 = mlp.intercepts_[0][0]
b0_1 = mlp.intercepts_[0][1]
b0_2 = mlp.intercepts_[0][2]
b0_3 = mlp.intercepts_[0][3]
o0_0 = mlp.coefs_[1][0][0]
o0_1 = mlp.coefs_[1][1][0]
o0_2 = mlp.coefs_[1][2][0]
o0_3 = mlp.coefs_[1][3][0]
b1_0 = mlp.intercepts_[1][0]
stroke=f"""function mlp_scale: real;
var_input
CURR : real;
end_var
var
BUF1 : Real;
BUF2 : Real;
BUF3 : Real;
BUF4 : Real;
W1 : Real := {w0_0};
W2 : Real := {w1_0};
W3 : Real := {w2_0};
W4 : Real := {w3_0};
B1 : Real := {b0_0};
B2 : Real := {b0_1};
B3 : Real := {b0_2};
B4 : Real := {b0_3};
WO1 : Real := {o0_0};
WO2 : Real := {o0_1};
WO3 : Real := {o0_2};
WO4 : Real := {o0_3};
BO1 : Real := {b1_0};
end_var
BUF1 := math_MAX(CURR * W1 + B1, 0.0);
BUF2 := math_MAX(CURR * W2 + B2, 0.0);
BUF3 := math_MAX(CURR * W3 + B3, 0.0);
BUF4 := math_MAX(CURR * W4 + B4, 0.0);
mlp_scale := BO1 + BUF1 * WO1 + BUF2 * WO2 + BUF3 * WO3 + BUF4 * WO4;
end_function
"""
with open("mlp_scale.scl","w+") as f:
f.writelines(stroke)
созданный файл mlp_scale.scl текст скопировать и перенести в ОЛ заменив новую созданную функцию, получится такой результат, как во вложении.