OpenMDAO에서 Kriging 응답 곡면
Kriging 응답 곡면
이론적으로는 잘 이해되지는 않았지만 흩어져있는 샘플 포인트에서 곡면을 추정하는 방법입니다.
 OpenMDAO에서 라틴 초방격 샘플링에 제시된 라틴어 초방격 샘플링과 궁합이 좋기 때문에 (산소한 샘플링), 공학적으로 CAE를 사용하여 응답 곡면을 추정 할 때 종종 사용됩니다.
 OpenMDAO에서 포물면의 Kriging 응답 곡면
이니셔티브의 개요는 다음과 같습니다. 먼저 OpenMDAO에서 라틴 초방격 샘플링에서 실험 한 데이터 (doe_paraboloid 파일)를 읽습니다.
그런 다음로드 된 실험 데이터를 사용하여 Kriging 근사 모델을 단련하고 생성합니다.
마지막으로, 생성 된 Kriging 근사 모델에 의한 보간 값을 이론 해 (와이어 프레임) 플롯하여 모델의 유효성을 확인합니다. 다음 방정식은 이론 해입니다.
\begin{align}
& f(x,y) = (x-3)^2 + xy + (y+4)^2 - 3 \\
    {\rm subject \: to} \: \: \:&  -50.0\leq x \leq 50.0 \\
                                &  -50.0\leq y \leq 50.0
\end{align}
 그룹 준비
아래 training_mm.py 파일 준비
training_mm.pyfrom __future__ import print_function
from openmdao.api import Group,  MetaModel,  FloatKrigingSurrogate
class TrainingMM(Group):
    ''' FloatKriging gives responses as floats '''
    def __init__(self):
        super(TrainingMM, self).__init__()
        # Create meta_model for f_x as the response
        mm = self.add("parabo_mm", MetaModel())
        mm.add_param('x', val=0.)
        mm.add_param('y', val=0.)
        mm.add_output('f_xy', val=0., surrogate=FloatKrigingSurrogate())
MetaModel이라는 근사 모델을 훈련하고 값을 평가하는 Component를 추가했습니다.
f_xy를 근사하기 위해 FloatKrigingSurrogate라는 SurrogateModel을 설정합니다.
FloatKrigingSurrogate 단체도 근사 모델의 훈련과 값을 평가하는 기능을 가지고 있지만,
MetaModel을 사용하면 여러 근사 모델을 동시에 훈련 할 수 있다고 공식 문서에 기록되어 있습니다.
 Problem(문제) 설정
다음은 kriging_paraboloid.py를 준비합니다. 전반부는 실험 데이터를 읽고 Kriging 근사 모델을 훈련시키는 과정입니다.
kriging_paraboloid.py#! /bin/python
import pickle
import numpy as np
import sqlitedict
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from openmdao.api import Problem
from training_mm import TrainingMM
db =sqlitedict.SqliteDict("doe_paraboloid","iterations")
res = np.array([[0.,0.,0.]] * len(db.items()))
for i, v in enumerate(db.items()):
    res[i,0] = v[1]["Unknowns"]["x"]
    res[i,1] = v[1]["Unknowns"]["y"]
    res[i,2] = v[1]["Unknowns"]["f_xy"]
prob = Problem()
prob.root = TrainingMM()
prob.setup()
prob["parabo_mm.train:x"] = res[:,0]
prob["parabo_mm.train:y"] = res[:,1]
prob["parabo_mm.train:f_xy"] = res[:,2]
prob.run()
후반부는 아래에 나와 있습니다. 작성한 kriging 근사 모델과 이론해의 비교를 플롯으로 실시하고 있다
kriging_paraboloid.py 계속x = np.arange(-50., 50., 4.)
y = np.arange(-50., 50., 4.)
sg = prob.root.parabo_mm._init_unknowns_dict["f_xy"]["surrogate"]
f = open("./kriging_parabo","w")
pickle.dump(sg, f)
f.close()
f = open("./kriging_parabo_mm","w")
pickle.dump(prob.root.parabo_mm, f)
f.close()
xyzkrig = np.array([[xi,yi,sg.predict(np.array([xi,yi]))[0]] \
        for xi in x for yi in y])
#xyzkrig = np.array([[0.,0.,0.]]*(25*25))
#cnt = 0
#for xi in x:
#    for yi in y:
#        xyzkrig[cnt,0] = prob["parabo_mm.x"] = xi
#        xyzkrig[cnt,1] = prob["parabo_mm.y"] = yi
#        prob.run()
#        xyzkrig[cnt,2] = prob["parabo_mm.f_xy"]
#        cnt += 1
fig = plt.figure(figsize=(6,4)); ax = Axes3D(fig)
X, Y = np.meshgrid(x, y)
Z = (X-3.0)**2. + X*Y + (Y+4.0)**2. - 3.0
ax.plot_wireframe(X,Y,Z,label="theoretical surface")
ax.scatter3D(xyzkrig[:,0], xyzkrig[:,1], xyzkrig[:,2], c="r", marker="o",label="Interpolated value")
ax.set_xlabel('x'); ax.set_ylabel('y'); ax.set_zlabel('f_xy')
plt.legend()
plt.show()
kriging_paraboloid.py의 전반부는 설명을 생략하고 후반부에만 설명합니다.
첫째, Kriging 근사 모델을 평가하는 샘플 포인트를 작성했습니다.
이것은 LHS (라틴 초방격 샘플링) 한 점과는 다른 점이며,
$ -50\leq x, y\leq 50 $의 범위를 25로 나눈 25x25 샘플 포인트에서 평가되었습니다.
sg = prob.root.parabo_mm._init_unknowns_dict["f_xy"]["surrogate"]에서 개인 클래스 변수 (_init_unknowns_dict)에 액세스하여 MeataModel에 설치된 surrogate 모델을로드합니다.
칭찬받은 치료는 아니지만 두 가지 이유가 있습니다.
* 단련 된 근사 모델의 보존이 구현되지 않았습니다.
* MetaModel에서 근사 모델의 값을 평가하려고하면 약간 번잡합니다 (#xyzkrig = ・・・ 아래의 주석 행).
나머지는 플롯 처리입니다.
이론 해를 와이어 프레임에 Kriging 근사 모델에 의한 평가 값을 점으로 플롯합니다.
 Kriging 근사 모델에 의한 값 보간
LHS의 샘플 수가 너무 많았기 때문에 상당히 정확합니다.
  
                
                    
        
    
    
    
    
    
                
                
                
                
                    
                        
                            
                            
                            Reference
                            
                            이 문제에 관하여(OpenMDAO에서 Kriging 응답 곡면), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
                                
                                https://qiita.com/TatsuyaKatayama/items/6be2baf66fde9a0bb4a2
                            
                            
                            
                                텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                            
                            
                                
                                
                                 우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                            
                            
                        
                    
                
                
                
            
이니셔티브의 개요는 다음과 같습니다. 먼저 OpenMDAO에서 라틴 초방격 샘플링에서 실험 한 데이터 (doe_paraboloid 파일)를 읽습니다.
그런 다음로드 된 실험 데이터를 사용하여 Kriging 근사 모델을 단련하고 생성합니다.
마지막으로, 생성 된 Kriging 근사 모델에 의한 보간 값을 이론 해 (와이어 프레임) 플롯하여 모델의 유효성을 확인합니다. 다음 방정식은 이론 해입니다.
\begin{align}
& f(x,y) = (x-3)^2 + xy + (y+4)^2 - 3 \\
    {\rm subject \: to} \: \: \:&  -50.0\leq x \leq 50.0 \\
                                &  -50.0\leq y \leq 50.0
\end{align}
그룹 준비
아래 training_mm.py 파일 준비
training_mm.pyfrom __future__ import print_function
from openmdao.api import Group,  MetaModel,  FloatKrigingSurrogate
class TrainingMM(Group):
    ''' FloatKriging gives responses as floats '''
    def __init__(self):
        super(TrainingMM, self).__init__()
        # Create meta_model for f_x as the response
        mm = self.add("parabo_mm", MetaModel())
        mm.add_param('x', val=0.)
        mm.add_param('y', val=0.)
        mm.add_output('f_xy', val=0., surrogate=FloatKrigingSurrogate())
MetaModel이라는 근사 모델을 훈련하고 값을 평가하는 Component를 추가했습니다.
f_xy를 근사하기 위해 FloatKrigingSurrogate라는 SurrogateModel을 설정합니다.
FloatKrigingSurrogate 단체도 근사 모델의 훈련과 값을 평가하는 기능을 가지고 있지만,
MetaModel을 사용하면 여러 근사 모델을 동시에 훈련 할 수 있다고 공식 문서에 기록되어 있습니다.
 Problem(문제) 설정
다음은 kriging_paraboloid.py를 준비합니다. 전반부는 실험 데이터를 읽고 Kriging 근사 모델을 훈련시키는 과정입니다.
kriging_paraboloid.py#! /bin/python
import pickle
import numpy as np
import sqlitedict
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from openmdao.api import Problem
from training_mm import TrainingMM
db =sqlitedict.SqliteDict("doe_paraboloid","iterations")
res = np.array([[0.,0.,0.]] * len(db.items()))
for i, v in enumerate(db.items()):
    res[i,0] = v[1]["Unknowns"]["x"]
    res[i,1] = v[1]["Unknowns"]["y"]
    res[i,2] = v[1]["Unknowns"]["f_xy"]
prob = Problem()
prob.root = TrainingMM()
prob.setup()
prob["parabo_mm.train:x"] = res[:,0]
prob["parabo_mm.train:y"] = res[:,1]
prob["parabo_mm.train:f_xy"] = res[:,2]
prob.run()
후반부는 아래에 나와 있습니다. 작성한 kriging 근사 모델과 이론해의 비교를 플롯으로 실시하고 있다
kriging_paraboloid.py 계속x = np.arange(-50., 50., 4.)
y = np.arange(-50., 50., 4.)
sg = prob.root.parabo_mm._init_unknowns_dict["f_xy"]["surrogate"]
f = open("./kriging_parabo","w")
pickle.dump(sg, f)
f.close()
f = open("./kriging_parabo_mm","w")
pickle.dump(prob.root.parabo_mm, f)
f.close()
xyzkrig = np.array([[xi,yi,sg.predict(np.array([xi,yi]))[0]] \
        for xi in x for yi in y])
#xyzkrig = np.array([[0.,0.,0.]]*(25*25))
#cnt = 0
#for xi in x:
#    for yi in y:
#        xyzkrig[cnt,0] = prob["parabo_mm.x"] = xi
#        xyzkrig[cnt,1] = prob["parabo_mm.y"] = yi
#        prob.run()
#        xyzkrig[cnt,2] = prob["parabo_mm.f_xy"]
#        cnt += 1
fig = plt.figure(figsize=(6,4)); ax = Axes3D(fig)
X, Y = np.meshgrid(x, y)
Z = (X-3.0)**2. + X*Y + (Y+4.0)**2. - 3.0
ax.plot_wireframe(X,Y,Z,label="theoretical surface")
ax.scatter3D(xyzkrig[:,0], xyzkrig[:,1], xyzkrig[:,2], c="r", marker="o",label="Interpolated value")
ax.set_xlabel('x'); ax.set_ylabel('y'); ax.set_zlabel('f_xy')
plt.legend()
plt.show()
kriging_paraboloid.py의 전반부는 설명을 생략하고 후반부에만 설명합니다.
첫째, Kriging 근사 모델을 평가하는 샘플 포인트를 작성했습니다.
이것은 LHS (라틴 초방격 샘플링) 한 점과는 다른 점이며,
$ -50\leq x, y\leq 50 $의 범위를 25로 나눈 25x25 샘플 포인트에서 평가되었습니다.
sg = prob.root.parabo_mm._init_unknowns_dict["f_xy"]["surrogate"]에서 개인 클래스 변수 (_init_unknowns_dict)에 액세스하여 MeataModel에 설치된 surrogate 모델을로드합니다.
칭찬받은 치료는 아니지만 두 가지 이유가 있습니다.
* 단련 된 근사 모델의 보존이 구현되지 않았습니다.
* MetaModel에서 근사 모델의 값을 평가하려고하면 약간 번잡합니다 (#xyzkrig = ・・・ 아래의 주석 행).
나머지는 플롯 처리입니다.
이론 해를 와이어 프레임에 Kriging 근사 모델에 의한 평가 값을 점으로 플롯합니다.
 Kriging 근사 모델에 의한 값 보간
LHS의 샘플 수가 너무 많았기 때문에 상당히 정확합니다.
  
                
                    
        
    
    
    
    
    
                
                
                
                
                    
                        
                            
                            
                            Reference
                            
                            이 문제에 관하여(OpenMDAO에서 Kriging 응답 곡면), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
                                
                                https://qiita.com/TatsuyaKatayama/items/6be2baf66fde9a0bb4a2
                            
                            
                            
                                텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                            
                            
                                
                                
                                 우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                            
                            
                        
                    
                
                
                
            
from __future__ import print_function
from openmdao.api import Group,  MetaModel,  FloatKrigingSurrogate
class TrainingMM(Group):
    ''' FloatKriging gives responses as floats '''
    def __init__(self):
        super(TrainingMM, self).__init__()
        # Create meta_model for f_x as the response
        mm = self.add("parabo_mm", MetaModel())
        mm.add_param('x', val=0.)
        mm.add_param('y', val=0.)
        mm.add_output('f_xy', val=0., surrogate=FloatKrigingSurrogate())
다음은 kriging_paraboloid.py를 준비합니다. 전반부는 실험 데이터를 읽고 Kriging 근사 모델을 훈련시키는 과정입니다.
kriging_paraboloid.py
#! /bin/python
import pickle
import numpy as np
import sqlitedict
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from openmdao.api import Problem
from training_mm import TrainingMM
db =sqlitedict.SqliteDict("doe_paraboloid","iterations")
res = np.array([[0.,0.,0.]] * len(db.items()))
for i, v in enumerate(db.items()):
    res[i,0] = v[1]["Unknowns"]["x"]
    res[i,1] = v[1]["Unknowns"]["y"]
    res[i,2] = v[1]["Unknowns"]["f_xy"]
prob = Problem()
prob.root = TrainingMM()
prob.setup()
prob["parabo_mm.train:x"] = res[:,0]
prob["parabo_mm.train:y"] = res[:,1]
prob["parabo_mm.train:f_xy"] = res[:,2]
prob.run()
후반부는 아래에 나와 있습니다. 작성한 kriging 근사 모델과 이론해의 비교를 플롯으로 실시하고 있다
kriging_paraboloid.py 계속
x = np.arange(-50., 50., 4.)
y = np.arange(-50., 50., 4.)
sg = prob.root.parabo_mm._init_unknowns_dict["f_xy"]["surrogate"]
f = open("./kriging_parabo","w")
pickle.dump(sg, f)
f.close()
f = open("./kriging_parabo_mm","w")
pickle.dump(prob.root.parabo_mm, f)
f.close()
xyzkrig = np.array([[xi,yi,sg.predict(np.array([xi,yi]))[0]] \
        for xi in x for yi in y])
#xyzkrig = np.array([[0.,0.,0.]]*(25*25))
#cnt = 0
#for xi in x:
#    for yi in y:
#        xyzkrig[cnt,0] = prob["parabo_mm.x"] = xi
#        xyzkrig[cnt,1] = prob["parabo_mm.y"] = yi
#        prob.run()
#        xyzkrig[cnt,2] = prob["parabo_mm.f_xy"]
#        cnt += 1
fig = plt.figure(figsize=(6,4)); ax = Axes3D(fig)
X, Y = np.meshgrid(x, y)
Z = (X-3.0)**2. + X*Y + (Y+4.0)**2. - 3.0
ax.plot_wireframe(X,Y,Z,label="theoretical surface")
ax.scatter3D(xyzkrig[:,0], xyzkrig[:,1], xyzkrig[:,2], c="r", marker="o",label="Interpolated value")
ax.set_xlabel('x'); ax.set_ylabel('y'); ax.set_zlabel('f_xy')
plt.legend()
plt.show()
kriging_paraboloid.py의 전반부는 설명을 생략하고 후반부에만 설명합니다.
첫째, Kriging 근사 모델을 평가하는 샘플 포인트를 작성했습니다.
이것은 LHS (라틴 초방격 샘플링) 한 점과는 다른 점이며,
$ -50\leq x, y\leq 50 $의 범위를 25로 나눈 25x25 샘플 포인트에서 평가되었습니다.
sg = prob.root.parabo_mm._init_unknowns_dict["f_xy"]["surrogate"]에서 개인 클래스 변수 (_init_unknowns_dict)에 액세스하여 MeataModel에 설치된 surrogate 모델을로드합니다.칭찬받은 치료는 아니지만 두 가지 이유가 있습니다.
* 단련 된 근사 모델의 보존이 구현되지 않았습니다.
* MetaModel에서 근사 모델의 값을 평가하려고하면 약간 번잡합니다 (
#xyzkrig = ・・・ 아래의 주석 행).나머지는 플롯 처리입니다.
이론 해를 와이어 프레임에 Kriging 근사 모델에 의한 평가 값을 점으로 플롯합니다.
Kriging 근사 모델에 의한 값 보간
LHS의 샘플 수가 너무 많았기 때문에 상당히 정확합니다.
  
                
                    
        
    
    
    
    
    
                
                
                
                
                    
                        
                            
                            
                            Reference
                            
                            이 문제에 관하여(OpenMDAO에서 Kriging 응답 곡면), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
                                
                                https://qiita.com/TatsuyaKatayama/items/6be2baf66fde9a0bb4a2
                            
                            
                            
                                텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                            
                            
                                
                                
                                 우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)
                            
                            
                        
                    
                
                
                
            
Reference
이 문제에 관하여(OpenMDAO에서 Kriging 응답 곡면), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/TatsuyaKatayama/items/6be2baf66fde9a0bb4a2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)