実現したいこと,構想
塩ラーメンの調味料配合比の実験を行おうとしている。、まずランダムに表示された10個の探索点のパラメータのラーメンを作り、10人に食べてもらう。そして10人それぞれに10食分順位づけしてもらい、その10人分の順位データを入力すると次の探索点の候補を出力する、というのを1試行とし、これを10試行行う。最初の1試行はランダムで、残りの9試行はqNEIという獲得関数を用いて探索点を出す。
1試行ごとに順位付けを行い、その順位データを入力すると次の探索点10点が出力されるようにしたい。
発生している問題・エラーメッセージ
10人分の順位データを1試行ずつ入力し、そのデータから次の探索点10点を出力したいが、10人分の順位データを1試行ずつ入力して行く方法がわからない。
該当のソースコード
python
1ソースコード 2import os 3 4import numpy as np 5import matplotlib.pyplot as plt 6from scipy.stats import zscore 7 8from botorch.models.pairwise_gp import PairwiseGP, PairwiseLaplaceMarginalLogLikelihood 9from botorch.fit import fit_gpytorch_model 10from botorch.acquisition import qNoisyExpectedImprovement 11from botorch.optim import optimize_acqf 12import torch 13import itertools 14from create_function import utility_3D, generate_train_x, generate_comparisons 15from normalization_max_min import norm_max_min 16 17 18def observation_max_points(model, results): 19 observation_point = model.posterior(results).mean.tolist() 20 next_x_index = observation_point.index(max(observation_point)) 21 next_x = results[next_x_index] 22 23 return next_x 24 25def main(m, loop, noise, bounds, test_f_name, acq_session=10): 26 IMAGE_DIR = "./accuracy/qNEI1_qNEI2/image_3D/" + test_f_name +"/qNEI" 27 if not os.path.exists(IMAGE_DIR): 28 # ディレクトリが存在しない場合、ディレクトリを作成する 29 os.makedirs(IMAGE_DIR) 30 split = 101 31 p0 = torch.linspace(1, 2, split) #鶏ガラ 32 p1 = torch.linspace(1, 2, split) #ごま油 33 p2 = torch.linspace(1, 2, split) #塩 34 points_0, points_1, points_2 = torch.meshgrid(p0, p1, p2) 35 points_mesh = torch.stack((points_0, points_1, points_2), dim=-1) 36 val_y = utility_3D(points_mesh, split=split, f_name=test_f_name).numpy() 37 38 index_ = np.unravel_index(np.argmax(val_y), val_y.shape) # val_yの最大値のインデックス 39 val_y[index_] #テスト関数の値の最大値 40 points_mesh[index_] #テスト関数の値が最大となる座標 41 val_y_max = points_mesh[index_] 42 val_y_max[0] = (val_y_max[0] - 1)/(2 - 1)*(8 - 0.5)+ 0.5 43 val_y_max[1] = (val_y_max[1] - 1)/(2 - 1)*(8 - 1)+ 1 44 val_y_max[2] = (val_y_max[2] - 1)/(2 - 1)*(8 - 1)+ 1 45 46 for k in range(m + acq_session): 47 if k < m : 48 49 train_X = generate_train_x(n=10, dim=3) 50 train_y = utility_3D(train_X,f_name="Sine_Plane_Wave") 51 train_comp = [] 52 53 for i in range(len(train_y)-1): 54 for j in range((i + 1), len(train_y)): 55 if train_y[i] > train_y[j]: 56 preference = [i, j] 57 else: 58 preference = [j, i] 59 train_comp.append(preference) 60 model = PairwiseGP(train_X, torch.Tensor(train_comp)) 61 mll = PairwiseLaplaceMarginalLogLikelihood(model) 62 mll = fit_gpytorch_model(mll) 63 print(train_X) 64 train_X[:,0] = ((train_X[:,0] - 1)/(2 - 1))*(8 - 0.5)+ 0.5 65 train_X[:,1] = ((train_X[:,1] - 1)/(2 - 1))*(8 - 1)+ 1 66 train_X[:,2] = ((train_X[:,2] - 1)/(2 - 1))*(8 - 1)+ 1 67 print(train_X[:,0], train_X[:,1], train_X[:,2]) 68 69 else: 70 # 獲得関数を用いた試行 71 qNEI = qNoisyExpectedImprovement( 72 model=model, 73 X_baseline=train_X.float() 74 ) 75 76 next_X, acq_val = optimize_acqf( 77 acq_function=qNEI, 78 bounds=bounds, 79 q=10, 80 num_restarts=5, 81 raw_samples=256 82 ) 83 train_X = torch.cat((train_X, next_X), dim=0) 84 train_y_ = utility_3D(next_X, f_name="Sine_Plane_Wave") 85 86 for i in range(len(train_y_)-1): 87 for j in range((i + 1), len(train_y_)): 88 if train_y_[i] > train_y_[j]: 89 preference = [i + (train_X.shape[0] - next_X.shape[0]), j + (train_X.shape[0] - next_X.shape[0])] 90 else: 91 preference = [j + (train_X.shape[0] - next_X.shape[0]), i + (train_X.shape[0] - next_X.shape[0])] 92 train_comp.append(preference) 93 print(train_comp) 94 model = PairwiseGP(train_X, torch.Tensor(train_comp)) 95 mll = PairwiseLaplaceMarginalLogLikelihood(model) 96 mll = fit_gpytorch_model(mll) 97 98 pred_y = norm_max_min(model.posterior(points_mesh).mean.squeeze().detach().numpy(), 99 max_=val_y.max(), min_=val_y.min()) 100 101 index = np.unravel_index(np.argmax(pred_y), pred_y.shape) # pred_yの最大値のインデックス 102 pred_y[index] #予測平均最大値 103 points_mesh[index] # 予測平均最大となる座標 104 105 pred_y_max = points_mesh[index] 106 pred_y_max[:,0] = (pred_y_max[:,0] - 1)/(2 - 1)*(8 - 0.5) + 0.5 107 pred_y_max[:,1] = (pred_y_max[:,1] - 1)/(2 - 1)*(8 - 1) + 1 108 pred_y_max[:,2] = (pred_y_max[:,2] - 1)/(2 - 1)*(8 - 1) + 1 109 print(pred_y_max[:,0], pred_y_max[:,1], pred_y_max[:,2]) 110 111
補足情報(FW/ツールのバージョンなど)
順位データの入力は手入力かExcelで入力したデータを読み込んでやろうとおもっています。
有識者の方々、どのようにすればやりたい個おができるのかアドバイスお願い致します。
ここにより詳細な情報を記載してください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。