@marq

Что делает этот код?

объясните пожалуйста, что делает этот код
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

нужно в файл записать эти данные, но не получается, выбивает ошибку. Код не мой
5f872aebeb304117029258.png
сама задача выглядит так:
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()

код не мой, не могу разобраться в нем, сначала выдавал ошибку с файлом, теперь это:
5f87b21660f06545345715.png
  • Вопрос задан
  • 284 просмотра
Пригласить эксперта
Ответы на вопрос 1
@qid00000000
Мало что знаю, но информацию найду в гугле
Бедные и несчастные люди, которые заплатили за обучение по Data Science, при это не разбираясь в смежных областях.

Нашпигуют вас знаниями, которые применять смогут единицы, а потом разобраться не сможете и будете бояться работать.

Попробуйте изучить язык python по книге + сайт для выполнения заданий: codewars

Книга, для базы, подойдёт learning python.

По вашему вопросу:
model.py: класс elem_plan вернёт объект с параметрами x и p.

Класс IO, имеет 1 метод input_plans_from_file, который читает из файла и форматирует ввод.

Открывается на чтение файл, имя которого передано в метод. Далее, читается количество строк для чтения и записывается в n.

В цикле, мы читаем по 2 строки, первую, записываем в x, вторую в p.

При этом, каждая строка конвертируется в список: удаляется перенос строки и разделяется по символам табуляции на элементы.

Полученные данные, формируют запись в списке plan (лень разбирать скобки).

Содержание файла следующее:
N
X
P
...

Где N число пар строк x и p. x и p - данные, разделенные табуляцией.

Полученные данные возвращаются.

Выглядит код, как заготовка под большой проект непонятого гения. Либо новичка в программировании (как я), который не знает куда пихать классы и модульную структуру.

Вместо 2-х объектов с методами, проще было сделать 2 функции и добавить комментарии к коду.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы