Сообщество Engee

Приложение для линейной регрессии

Автор
avatar-nkapyrinnkapyrin
Notebook

Простое приложение для линейной регрессии

Проиллюстрируем разработку приложения для ввода данных и построения графика, позволяющее получить тренд и скопировать формулу линейной функции, аппроксимирующей их.

Запуск и остановка приложения

В папке с примером располагается файл app.jl, который содержит код минимального приложения для построения тренда по пользовательским данным. График позволяет визуально оценить корректность аппроксимации, а для дальнейших манипуляций пользователь получает уравнение в виде функции f(x) = a*x + b, которое можно вставить в терминал или кодовую ячейку и выполнить как элемент пользовательской программы.

В этом примере мы не пользуемся пространством переменных Engee или управлением моделями (всё это доступно через библиотеку using Engee). Мы лишь покажем, как интегрировать код серверного приложения на Julia с HTML кодом веб-страницы.

Вы можете запустить приложение и получить ссылку, по которой его можно открыть в отдельном окне (пока "серверная часть" на Julia остается активной).

genie_app = engee.genie.start("$(@__DIR__)/app.jl", log_file="log.txt");
display("text/html", """<a href="$(string(genie_app.url))" target="_blank">Открыть в отдельном окне</a>""")

simple_engee_app_scree.png

Для остановки приложения в целях отладки или просто для перезапуска нужна следующая команда, которую нужно раскомментировать чтобы выполнить:

engee.genie.stop("$(@__DIR__)/app.jl");

Код пустого Engee-приложения

Давайте разберем, из чего состоит такая программа. Минимальное содержание файла app.jl приведено ниже.

using GenieFramework

@app begin
    #
end

function ui()
    [
        h1("Линейная регрессия")
    ]
end

@page("/", ui)

Мы видим начало приложения, где на макете приложения ui() есть заголовок, а пустая секция @app не содержит реактивных переменных и функций.

Минимальное приложение, выводящее график

Следующий шаг в разработке состоит в наполнении макета пользовательскими элементами управления, а секцию @app- реактивными переменными функциями, привязанными к обновлению элементов GUI или самих реактивных переменных:

using GenieFramework, PlotlyBase

# Начальные демонстрационные данные
const TEST_VEC_X = -10:10
const TEST_VEC_Y = (-10:10).^2 + 10 .* rand(21) .- 5

@app begin
    @in x_data = ""
    @in y_data = ""
    @out message = "Введите данные"
    @out plot_data = [scatter(x=TEST_VEC_X, y=TEST_VEC_Y, mode="markers", name="Данные")]
end

function ui()
    [
        h1("Линейная регрессия"),
        textfield("X данные (через запятую)", :x_data),
        textfield("Y данные (через запятую)", :y_data),
        p("{{message}}"),
        plot(:plot_data)
    ]
end

@page("/", ui)

Этот код пока что не делает ничего кроме отображения тестовых данных, но в нём уже есть реактивные переменные. Инструментарий Engee берет на себя обновление значений этих переменных на клиентской и на серверной стороне (следует учитывать, что на стороне клиентов выполняется приложение JavaScript, а на стороне сервера работает Julia).

Это приложение работает, но чтобы обновлять график, нам понадобятся функции проверки и обработки ввода (переводят строковый ввод в вектор значений), выполнения линейной регрессии (функция linear_regression, основанная на методе a, b = A \ vec_y), построения графика данных и тренда (create_plot_traces) и функцию, которая объединяет эти три действия (update_plot_data). Вы их найдете в файле app.jl.

Заключение

Мы рассмотрели, как организовать минималистичное приложение с графиком, парой строковых параметров и строчкой для вывода статусного сообщения. Элементы легко поменять местами, а функциональность приложения легко дораборать, добавив код на Julia или привязав к приложению внешние библиотеки.