Как сделать это в пользовательский интерфейс в Shiny в R? - PullRequest
1 голос
/ 06 апреля 2020

У меня есть программа ниже, но я хочу sh превратить ее в графический пользовательский интерфейс Graphi c из Rigine в R. Но я действительно новичок в Shiny. Вот код:

#Optimization to find w for a sigmoid with given  
#multiple samples for one input and one output
#x1, x2... are different observation for one x input

require(ggplot2)
generate_data<- function(n){
  x_neg<- -3L
  x_pos<- 3L
  scale<- 1.5
  n_samples<- n
  x_train<- matrix(c(rnorm(n_samples) + x_pos
                     , rnorm(n_samples) + x_neg)*scale, byrow = T)
  y_train<- matrix(c(rep(1, n_samples), rep(0, n_samples)), byrow = T)
  list(x_train, y_train)
}

n <- 10
data_train<- generate_data(n)
x_train<- as.matrix(data_train[[1]])
y_train<- as.matrix(data_train[[2]])
plot(x_train, y_train, col='green', pch= 3
     , ylim= c((min(y_train)-0.2), (max(y_train)+0.2)))

#create tensor:
unity_matrix<- matrix(rep(1, nrow(x_train))) 
x_tensor<- cbind(unity_matrix, x_train)
sigmoid_neuron<- function(x, w) {
  output<- 1/(1 + exp(-(x_tensor%*%w)))
}

w<- matrix(rnorm(2), byrow = T)#initialize
(sigmoid_output<- sigmoid_neuron(x= x_tensor, w= w))
points(x_train, sigmoid_neuron(x_tensor, w), col='blue', pch= 19)

Grad<- matrix(rep(0, 2), byrow = T)
compute_gradients<- function(x, y, h) {
  Grad[1]<- mean(h- y)
  Grad[2]<- mean((h-y)*x)
  error<<- (h-y)
  return(Grad)
}
compute_gradients(x= x_train, y= y_train, h= sigmoid_output)

##manually cycle through the code chunk to check if the algo works
learningRate<- 0.2
w<- matrix(rnorm(2), byrow = T)#initialize
(sigmoid_output<- sigmoid_neuron(x= x_tensor, w= w))   
(grad<- compute_gradients(x_train, y_train, sigmoid_output)) 
w<- w  - learningRate*grad
y_train

##tune sigmoid
learningRate<- 0.2
Grad<- matrix(rep(0, 2), byrow = T)
w<- matrix(rnorm(2), byrow = T)#initialize
idx_end<- 1000
error_history<- list()
for (i in 1:idx_end) {
  sigmoid_output<- sigmoid_neuron(x= x_tensor, w= w)   
  grad<- compute_gradients(x_train, y_train, sigmoid_output)
  error_history[[i]]<- error
  w<- w  - learningRate*grad
}

grad; sigmoid_output; y_train; w
points(x_train, sigmoid_neuron(x_tensor, w), col='red', pch= 4)

error_history_rmse<- sapply(1:length(error_history), function(x) sqrt(mean(error_history[[x]]^2)))
qplot(seq_along(error_history_rmse), error_history_rmse
      , ylim = c(0, 0.1)
      )
#dev.off()

Моя проблема в том, как мне создать сигмовидную кривую (на mainPanel), которую я использую sliderInput, чтобы отрегулировать значение idx_end (в строке из 56) на оси х?

Вот мой код, что я должен изменить или добавить на мой сервер?

library(shiny)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(

      sliderInput("x_range", "idx_end",
                  min = 0, max = 10000, value = c(0, 1000), step = 100)
    ),
    mainPanel(
      plotOutput("distPlot"))))

server <- function(input, output, session) {
  output$distPlot <- renderPlot({

    plot(seq_along(error_history_rmse), error_history_rmse, 
         xlim = c(0, input$x_range[2]),
         #ylim = c(0,0.1),
         col = 'darkgray', 
         border = 'white')})}

shinyApp(ui, server)

Кто-нибудь может мне помочь? Действительно оценит это ..

1 Ответ

0 голосов
/ 06 апреля 2020

Вы можете просто вставить свой код в функцию renderPlot. Затем присвойте input$x_range[2] idx_end. Тем не менее, нет необходимости включать весь ваш код в renderPlot, только код, который реагирует на ввод пользователя и составляет график. Поэтому я поместил большую часть вашего кода в исходный R-файл с именем plot_data.R, а затем использовал исходный код, чтобы заполнить глобальную среду переменными stati c.

library(shiny)

source("plot_data.R")

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(

      sliderInput("x_range", "idx_end",
                  min = 0, max = 10000, value = c(0, 1000), step = 100)
    ),
    mainPanel(
      plotOutput("distPlot"))))

server <- function(input, output, session) {

  output$distPlot <- renderPlot({

    learningRate<- 0.2
    Grad<- matrix(rep(0, 2), byrow = T)
    w<- matrix(rnorm(2), byrow = T)#initialize
    idx_end <- input$x_range[2]
    error_history<- list()
    for (i in 1:idx_end) {
      sigmoid_output<- sigmoid_neuron(x= x_tensor, w= w)   
      grad<- compute_gradients(x_train, y_train, sigmoid_output)
      error_history[[i]]<- error
      w<- w  - learningRate*grad
    }

    error_history_rmse<- sapply(1:length(error_history), function(x) sqrt(mean(error_history[[x]]^2)))

    plot(seq_along(error_history_rmse), error_history_rmse, 
         xlim = c(0, input$x_range[2]),
         #ylim = c(0,0.1),
         col = 'darkgray', 
         border = 'white')})}

shinyApp(ui, server)
...