Ограничения: время – 200ms/200ms, память – 128MiB Ввод: input.txt или стандартный ввод Вывод: output.txt или стандартный вывод 
Послать решение Blockly Посылки Темы Где Обсудить (0)
В результате анализа программ, выкладываемых в Play,
были выявлены 86 разрешений, запрашиваемых в процессе установки программами.
Все программы были проверены и часть из них были признаны вредоносными.
Вы должны обучить нейронную сеть так, чтобы она по набору запрашиваемых разрешений определяла,
является ли программа вредоносной.
[Архив с данными для обучения и единственный входной тест можно загрузить по этой ссылке.](56064.zip)
Исходные данные для обучения находятся в файле train.csv и содержат 87 столбцов,
для каждого из 86 разрешений указано 1, если разрешение было запрошено программой, или 0, в противном случае.
В столбце Result указана 1, если программа признана вредоносной, или 0, в противном случае.
Вы должны проанализировать разрешения в файле test.csv и сформировать для каждой строки результат: 0 или 1.
**В качестве решения нужно отправить выходной файл, а не программу!**
Для выполнения работы вам потребуется язык Python с установленными библиотеками pandas, numpy, keras и tensorflow.
Пример программы для обучения сети, которая формирует выходной файл output.txt в требуемом формате:
```python
# Подключение библиотек
import pandas, keras, numpy
# Загрузка данных для обучения
train = pandas.read_csv('train.csv')
# Предположим, что первые столбцы - это входные данные, принимающие значения от 0 до 1
# (если это не так, то необходимо преобразование данных),
# а последний столбец - результат, который принимает 2 значения: 0 и 1
# Отделяем входы от выхода
input_train=train.values[:, :-1]
# Варианты выхода преобразуем в вектора из 2 значений [1,0] или [0,1], используя строки единичной матрицы
targets = numpy.eye(2)
output_train=numpy.array([targets[x] for x in train.values[:,-1]])
# Создаем нейронную сеть
# Количество нейронов в первом слое равно количеству входных данных
inputs = keras.layers.Input(shape=(len(input_train[0]),))
# Создаем промежуточный слой из 15 нейронов sigmoid,
# количество промежуточных слоев и нейронов в них влияет на качество и время обучения сети
hidden = keras.layers.Dense(15, activation='sigmoid')(inputs)
# Создаем выходной слой с 2 вариантами ответа
outputs = keras.layers.Dense(2, activation='softmax')(hidden)
# Объединяем слои в сеть
model = keras.Model(inputs, outputs)
model.compile(optimizer='adam', loss=keras.losses.CategoricalCrossentropy())
# Тренируем сеть на обучающих данных
history = model.fit(input_train, output_train, epochs=100)
# Загрузка данных для тестирования
test = pandas.read_csv('test.csv')
# Получение и вывод результатов
predictions = model.predict(test.values[:,:])
with open("output.txt", "w") as f:
for p in predictions:
print(numpy.argmax(p), file=f) # выводим вариант с максимальным значением
```
*Система оценки*
В этой задаче только один тест, входные данные для которого находятся в архиве.
Баллы за задачу зависят от количества правильно классифицированных программ.
Должно определено корректно не менее 75% программ (так как 50% - это случайное угадывание).
100% соответствуют Score 010000
75% соответствуют Score 000000
Значение Score преобразуется в баллы с помощью деления на 100 и отбрасывания дробной части.