объясните пожалуйста, что делает этот код
from model import *
class IO(object):
def input_plans_from_file(filename):
plan = []
file = open(filename, "r")
n = int(file.readline())
for i in range(n):
x = file.readline().replace('\n','').split('\t')
p = file.readline().replace('\n','').split('\t')
plan.append(list(map(lambda x: elem_plan(float(x[0]),float(x[1])), list(zip(x,p)))))
return plan
model.py:
import numpy as np
class elem_plan(object):
def __init__(self,x=None,p=None):
self.x = x
self.p = p
нужно в файл записать эти данные, но не получается, выбивает ошибку. Код не мой
сама задача выглядит так:
1. Изучить понятия непрерывного плана эксперимента и информационной матрицы, а также критерии оптимальности, связанные с точностью оценивания параметров модели и точностью оценивания математического ожидания функции отклика.
2. Разработать программу по обработке различных планов эксперимента для регрессионных моделей. Обработка заключается в вычислении различных характеристик плана, связанных с тем или иным критерием оптимальности.
3. Для каждого из планов вычислить значения функционалов от информационной (дисперсионной) матриц, связанных с такими критериями, как: D, A, E, 2, ,MV , G-оптимальности. Проранжировать планы, указанные в варианте, с позиций различных критериев. Выбрать план, наиболее предпочтительный по совокупности критериев. Список планов приведен в табл. 1.
Вариант: Модель квадратичная на отрезке. Планы для анализа: 1-4. Для пункта 4
задания использовать критерий D -оптимальности.
и сам код:
Файл IO.py
from model import *
class IO(object):
def input_plans_from_file(filename):
plan = []
file = open(filename, "r")
n = int(file.readline())
for i in range(n):
x = file.readline().replace('\n','').split('\t')
p = file.readline().replace('\n','').split('\t')
plan.append(list(map(lambda x: elem_plan(float(x[0]),float(x[1])), list(zip(x,p)))))
return plan
Файл model.py
import numpy as np
class elem_plan(object):
def __init__(self,x=None,p=None):
self.x = x
self.p = p
class model(object):
def __init__(self,plan):
self.plan = plan
self.n_plan = len(plan)
self.m = len(self.f(0))
self.Make_M()
self.Make_D()
self.Calc_Criterium()
def f(self,x):
return np.array([1,x,x * x])
def Make_M(self):
M = np.zeros((self.m,self.m))
for k in range(self.n_plan):
f = self.f(self.plan[k].x)
for i in range(self.m):
M[i] += self.plan[k].p * f[i] * f
self.M = M
def Make_D(self):
self.D = np.linalg.inv(self.M)
def Calc_Criterium(self):
self.crit_D = self.Calc_D()
self.crit_A = self.Calc_A()
self.crit_E = self.Calc_E()
self.crit_Ф = self.Calc_Ф()
self.crit_Lymbda = self.Calc_Lymabda()
self.crit_MV = self.Calc_MV()
self.crit_G = self.Calc_G()
self.sum_crit = self.crit_D + self.crit_A + self.crit_E + self.crit_Ф + self.crit_Lymbda+ self.crit_MV + self.crit_G
def Calc_D(self):
return np.linalg.det(self.M)
def Calc_E(self):
return np.max(np.linalg.eig(self.D)[0])
def Calc_A(self):
return self.D.trace()
def Calc_Ф(self, p=2):
return ((1.0 / self.m)* (self.D**p).trace())** (1.0/p)
def Calc_Lymabda(self):
return np.sum((np.linalg.eig(self.D)[0] - np.average(np.linalg.eig(self.D)[0]))**2 )
def Calc_MV(self):
return np.max(np.diag(self.D))
def Calc_G(self):
def d(x):
return self.f(x).T @ self.D @ self.f(x)
return np.max([ d(self.plan[i].x) for i in range(self.n_plan)])
Файл main.py
import numpy as np
from IO import *
from model import *
import matplotlib.pyplot as plt
plan_list = IO.input_plans_from_file('input.txt')
pp = [model(plan) for plan in plan_list ]
out = open('output.txt','w')
for i in range(len(pp)):
out.write('plan №' + str(i))
out.write('M-matrix:')
out.write(str(pp[i].M))
out.write('D-matrix:')
out.write(str(pp[i].D))
out.write('№\t\tD\t\tA\t\tE\t\tF2\t\tLyambda\t\tMV\t\tG\n')
for i in range(len(pp)):
out.write('{}\t{:08.4f}\t{:08.4f}\t{:08.4f}\t{:08.4f}\t{:08.4f}\t{:08.4f}\t{:08.4f}\t{}\n'.format(i,
pp[i].crit_D,
pp[i].crit_A,
pp[i].crit_E,
pp[i].crit_Ф,
pp[i].crit_Lymbda,
pp[i].crit_MV,
pp[i].crit_G,
pp[i].sum_crit))
plot_x = [0]
plot_y = [0]
for q in np.arange(0,0.51,0.01):
if q not in (0.5,-0.5,0):
plan = np.array([elem_plan(-1, q),
elem_plan(0.0, 1 – 2* q),
elem_plan(1, q)])
D_crit = model(plan).crit_D
plot_x.append(q)
plot_y.append(D_crit)
out.write("q")
out.write(str((plot_y.index(max(plot_y)) + 1) * 0.01))
out.write("value")
out.write(str(max(plot_y)))
fig = plt.figure()
plt.plot(plot_x, plot_y)
plt.scatter((plot_y.index(max(plot_y)) + 1) * 0.01, max(plot_y))
plt.ylabel('D-crit')
plt.xlabel('q')
plt.grid(True)
plt.text((plot_y.index(max(plot_y)) + 1) * 0.01 + 0.01, max(plot_y), 'max', fontsize=12)
plt.show()
код не мой, не могу разобраться в нем, сначала выдавал ошибку с файлом, теперь это: