Мы строим рекомендательную систему креативных кластеров в Санкт-Петербурге по выбираемым пользователям критериям. Если пользователю приоритетнее университеты, то будет построена одна рекомендация, если библиотеки — другая. Таких категорий шесть. Пользователи системы: девелоперы, предприниматели в сфере креативной экономики, государственные структуры, которые занимаются архитектурным и экономическим планирвоанием города и другие заинтересованные лица (студенты, ученые, журналисты).
В качестве мест, на которых рекомендуются кластеры, используется данные объектно-адресной книги Санкт-Петербурга, данные по промышленным предприятиям и зонам промышленной застройки и данные по инвестиционным проектам Комитета по информатизации и связи Санкт-Петербурга. Источник: http://data.gov.ru/ .
## address lon
## 1 191126, г.Санкт-Петербург, Загородный проспект, д. 36, литера А 30.33779
## 2 195009, г.Санкт-Петербург, улица Комсомола, д. 33, литера А 30.35819
## 3 191104, г.Санкт-Петербург, улица Жуковского, д. 7-9, литера А 30.35141
## 4 191025, г.Санкт-Петербург, улица Маяковского, д. 2/94, литера А 30.35366
## 5 191123, г.Санкт-Петербург, Кирочная улица, д. 23, литера А 30.36167
## 6 191104, г.Санкт-Петербург, Литейный проспект, д. 46, литера А 30.34863
## lat
## 1 59.92415
## 2 59.95499
## 3 59.93579
## 4 59.93244
## 5 59.94367
## 6 59.93758
В качестве категорий, на основании которых выстариваются рекомендации, по ключевым словам были выгружены геоточки с сайта http://overpass-turbo.eu/ .
## name lon lat
## 1 Буквоед 33.07197 68.96246
## 2 Дом Книги 30.32577 59.93574
## 3 Буквоед 33.07197 68.96246
## 4 ДВК(Дом военной книги) 37.51288 55.77880
## 5 Дом университетской книги 29.82350 59.88268
## 6 Дом книги 30.32577 59.93574
## name lon
## 952 Зазеркалье 30.34392
## 953 Скороход 38.70568
## 954 Театр Эстрады им. Аркадия Райкина 30.32224
## 955 Остров 115.18892
## 956 Государственный академический театр балета им Л. Якобсона 30.35546
## 957 УЖАСЫ Петербурга 30.33895
## lat
## 952 59.929475
## 953 47.519960
## 954 59.937071
## 955 -8.409518
## 956 59.937919
## 957 59.918945
Как руководитель проекта я предложила саму идею проекта, мы сформировали с Алиной концептуальное видение системы: какие данные нужны, что с ними делать. Затем я раздавала планы и руководства к действию для каждой команды. Нашла датасет со зданиями. Написала 70% интерфейса Shiny. Все решения принимались непосредственно либо мной, либо командой по согласованию со мной.
На самом деле удалось почти всё, просто тяжело. Не думали, что проект окажется таким трудоъемким. Пару раз жалели, что не вяли Амазон. Но в целом не получается распределять время в течение семестра равномерно, получаются все равно моменты нагрева и спада: хотелось бы меньше такого, но это очень сложно и зависит напряму от руководителя проекта.
Во-первых, провести семинары по Shiny и не один. Оказалось, что там так много подводных камней,(если действительно делать сложный и раблочий интерфейс), что самим разобраться крайне сложно.
Во-вторых, более серьезно настроить студентов на разделение по ролям и максимально приблизить его к реальному (как в IT-проектах). Сделать так, чтобы не один человек делал 80% работы по проекту. Менеджер проекта и think-tank возможно нужно разделить.
#----------------------------------Рекомендательная модель----------------------------------
points <- read.csv("~/creative/ml-latest-small/TOTAL_POINTS.csv",stringsAsFactors=FALSE)
areas <- read.csv("~/creative/ml-latest-small/TOTAL_AREAS.csv")
points <- points %>% filter(!is.na(lon))
areas <- areas %>% filter(!is.na(lon))
points <- points[,3:4]
areas <- areas[,3:4]
dist <- distm(areas, points)
d <- data.frame(dist)
dist.m <- as(dist, "realRatingMatrix")
dist.m
recommender_models <- recommenderRegistry$get_entries(dataType ="realRatingMatrix")
recommender_models$IBCF_realRatingMatrix$parameters
which_train <- sample(x = c(TRUE, FALSE),
size = nrow(dist.m),
replace = TRUE,
prob = c(0.8, 0.2))
#head(which_train)
recc_data_train <- dist.m[which_train, ]
recc_data_test <- dist.m[!which_train, ]
recc_model <- Recommender(data = recc_data_train,
method = "UBCF")
recc_model
n_recommended <- 10 # the number of items to recommend to each user
recc_predicted <- predict(object = recc_model,
newdata = recc_data_test,
n = n_recommended)
recc_predicted
recc_user_1 <- recc_predicted@ratings[[1]] # recommendation for the first user
movies_user_1 <- recc_predicted@itemLabels[recc_user_1]
movies_user_2 <- movies_user_1
#----------------------------------Shiny----------------------------------
library(ggfortify)
library(plotly)
library(ggplot2)
library(ggmap)
library(rgdal)
library(sp)
library(leaflet)
library(jsonlite)
library(dplyr)
library("ggmap")
library("tidyr")
library("dplyr")
function(input, output, session) {
museums <- read.csv("~/Downloads/creative-master/museums.csv")
museums <- museums[-c(17, 3, 9, 47), ]
df <- museums
coordinates(df) <- ~lon+lat
output$mymap <- renderLeaflet({
leaflet(df) %>%
addTiles() %>%
addMarkers(data = df,
popup = paste0("<strong>Название: </strong>",
df$name,
"<br><strong>Адрес: </strong>",
df$fulladdress
),
clusterOptions = markerClusterOptions()
)
})
}
library(shiny)
library(recommenderlab)
library(shinydashboard)
library(leaflet)
library(shiny)
library(shinythemes)
tags <- c("Библиотеки", "Университеты","Музеи","Бары", "Книжные магазины", "Отели", "Мосты", "Парки", "Театры")
fluidPage(
headerPanel("Где построить новый креативный кластер в Санкт-Петербурге?"),
leafletOutput("mymap"),
hr(),
fluidRow(
column(2,
sliderInput('sampleSize', 'Цена квадратного метра, руб.',
min=1, max=nrow(museums), value=min(1000, nrow(museums)),
step=500, round=0),
br(),
checkboxInput('jitter', 'Рядом с метро'),
checkboxInput('smooth', 'В центре')
),
column(4, offset = 1,
selectInput("name_en", "Приоритет:",
choices=tags),
hr(),
helpText("Выберите категорию, в соответствии с которой будет строиться рекомендация")
)
)
)