Сравнить коммиты

...

11 Коммитов
main ... main

Двоичные данные
LW1/custom pics/5 (1).png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 6.0 KiB

Двоичные данные
LW1/custom pics/5.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 6.0 KiB

Двоичные данные
LW1/custom pics/6 (1).png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 5.9 KiB

Двоичные данные
LW1/custom pics/6.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 6.0 KiB

Двоичные данные
LW1/image-1.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 8.3 KiB

Двоичные данные
LW1/image-2.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 8.9 KiB

Двоичные данные
LW1/image-3.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 32 KiB

Двоичные данные
LW1/image-4.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 38 KiB

Двоичные данные
LW1/image-5.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 8.3 KiB

Двоичные данные
LW1/image.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 9.1 KiB

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

@ -0,0 +1,494 @@
# Отчет по Лабораторной работе №1 по курсу "Интеллектуальные системы"
## Бригада №5 (Голубев Т. Л., Ишутина Е. И.)
### *1. В среде GoogleColab создать новый блокнот (notebook). Импортировать необходимые для работы библиотеки и модули.*
tensorflow.keras — высокоуровневый API для построения и обучения нейронных сетей. Мы используем его для загрузки датасета и построения моделей.
matplotlib.pyplot — библиотека для визуализации данных, построения графиков и отображения изображений.
numpy — библиотека для работы с многомерными массивами и выполнения численных операций.
sklearn (scikit-learn) — библиотека для машинного обучения, содержит инструменты для предварительной обработки данных, метрик, кластеризации и классификации.
Задание рабочей директории, импорт необходимых библиотек и модулей:
```python
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')
from tensorflow import keras
import matplotlib.pyplot as plt
import numpy as np
import sklearn
```
### *2. Загрузить набор данных MNIST, содержащий размеченные изображения рукописных цифр*
Набор данных MNIST (Modified National Institute of Standards and Technology) — это стандартный набор изображений для обучения и тестирования алгоритмов распознавания рукописных цифр.
Он содержит 70 000 изображений цифр от 0 до 9, из них 60 000 для обучения (training set) и 10 000 — для тестирования (test set).
Каждое изображение имеет размер 28×28 пикселей и представлено в градациях серого.
В TensorFlow набор данных MNIST встроен в модуль keras.datasets, что позволяет легко загрузить его одной командой.
```python
(X_train, y_train), (X_test, y_test) = mnist.load_data()
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz
11490434/11490434 ━━━━━━━━━━━━━━━━━━━━ 2s 0us/step
```
* X_train и X_test — массивы изображений рукописных цифр,
* y_train и y_test — соответствующие метки (от 0 до 9), обозначающие, какая цифра изображена.
### *3. Разбить набор данных на обучающие и тестовые данные в соотношении 60000:10000 элементов. При разбиении параметр random_state выбрать равным (4k–1), где k–номер бригады. Вывести размерности полученных обучающих и тестовых массивов данных.*
Параметр random_state обеспечивает воспроизводимость разбиения данных.
Для номера бригады = 5 получим `random_state = 19`.
Функция train_test_split() случайным образом делит данные на обучающую и тестовую выборки указанного размера.
```python
# создание своего разбиения датасета
from sklearn.model_selection import train_test_split
# объединяем в один набор
X = np.concatenate((X_train, X_test))
y = np.concatenate((y_train, y_test))
# разбиваем по вариантам
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size = 10000,
train_size = 60000,
random_state = 19)
```
```python
# вывод размерностей
print('Shape of X train:', X_train.shape)
print('Shape of y train:', y_train.shape)
print('Shape of X test:', X_test.shape)
print('Shape of y test:', y_test.shape)
Shape of X train: (60000, 28, 28)
Shape of y train: (60000,)
Shape of X test: (10000, 28, 28)
Shape of y test: (10000,)
```
### *4. Вывести первые 4 элемента обучающих данных (изображения и метки цифр).*
Данный код отображает первые четыре изображения из обучающего набора и их метки.
Каждое изображение разворачивается обратно в форму 28×28 для корректного отображения.
```python
# вывод первых 4 изображений и их меток
plt.figure(figsize=(8, 2))
for i in range(4):
plt.subplot(1, 4, i + 1)
plt.imshow(X_train[i].reshape(28, 28), cmap='gray')
plt.title(f'Label: {y_train[i]}', fontsize = 6)
plt.axis('off')
plt.show()
![alt text](image-2.png)
```
### *5. Провести предобработку данных: привести обучающие и тестовые данные к формату, пригодному для обучения нейронной сети. Входныеданные должны принимать значения от 0 до 1, метки цифрдолжны быть закодированы по принципу «one-hotencoding».Вывести размерности предобработанных обучающих и тестовых массивов данных.*
Перед обучением нейронной сети необходимо подготовить данные.
Каждое изображение в наборе MNIST имеет размер 28×28 пикселей, но полносвязная нейронная сеть принимает на вход вектор признаков.
Поэтому каждое изображение «вытягивается» в одномерный вектор длиной 784 (28×28), где каждый элемент соответствует яркости одного пикселя.
Кроме того, метки классов (цифры от 0 до 9) переводятся в формат one-hot encoding.
При этом каждая цифра представляется вектором длиной 10, где только один элемент равен 1 (номер класса), а остальные — 0.
Например, цифра 3 кодируется как [0, 0, 0, 1, 0, 0, 0, 0, 0, 0].
Такой формат удобен для обучения сети, потому что выходной слой содержит 10 нейронов — по одному для каждой цифры.
```python
# развертывание изображений 28x28 в вектор длиной 784 и нормализация
num_pixels = X_train.shape[1] * X_train.shape[2]
X_train = X_train.reshape(X_train.shape[0], num_pixels).astype('float32') / 255
X_test = X_test.reshape(X_test.shape[0], num_pixels).astype('float32') / 255
# кодирование меток по принципу one-hot encoding
from tensorflow.keras.utils import to_categorical
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
num_classes = y_train.shape[1]
# вывод размерностей
print('Shape of X train:', X_train.shape)
print('Shape of y train:', y_train.shape)
print('Shape of X test:', X_test.shape)
print('Shape of y test:', y_test.shape)
Shape of X train: (60000, 784)
Shape of y train: (60000, 10)
Shape of X test: (10000, 784)
Shape of y test: (10000, 10)
```
### *6. Реализовать модель однослойной нейронной сети и обучить её на обучающих данных с выделением части обучающих данных в качестве валидационных. Вывести информацию об архитектуре нейронной сети. Вывести график функции ошибки на обучающих и валидационных данных по эпохам.*
Модель представляет собой однослойную нейронную сеть без скрытых слоёв.
На вход подаются векторы длиной 784, выходной слой содержит 10 нейронов (по количеству классов).
Используются параметры:
функция активации — `softmax`, функция ошибки — `categorical_crossentropy`, оптимизатор — `sgd`, метрика — `accuracy`.
```python
# создание модели однослойной нейронной сети
from keras.models import Sequential
from keras.layers import Dense
model0 = Sequential()
# добавляем выходной слой
model0.add(Dense(units=num_classes, input_dim=784, activation='softmax'))
# компиляция модели
model0.compile(loss='categorical_crossentropy',
optimizer='sgd',
metrics=['accuracy'])
# вывод информации об архитектуре модели
print(model0.summary())
/usr/local/lib/python3.12/dist-packages/keras/src/layers/core/dense.py:93: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
super().__init__(activity_regularizer=activity_regularizer, **kwargs)
Model: "sequential"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type) ┃ Output Shape ┃ Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ dense (Dense) │ (None, 10) │ 7,850 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
Total params: 7,850 (30.66 KB)
Trainable params: 7,850 (30.66 KB)
Non-trainable params: 0 (0.00 B)
None
```
```python
# обучение модели
H0 = model0.fit(X_train, y_train,
validation_split=0.1,
epochs=50,
verbose=1)
# вывод графика функции ошибки
plt.plot(H0.history['loss'])
plt.plot(H0.history['val_loss'])
plt.grid()
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend(['train_loss', 'val_loss'])
plt.title('Loss by epochs (Model 0)')
plt.show()
Epoch 1/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.6993 - loss: 1.1736 - val_accuracy: 0.8783 - val_loss: 0.5063
...
![alt text](image-3.png)
```
### *7. Применить обученную модель к тестовым данным. Вывести значение функции ошибки и значение метрики качества классификации на тестовых данных.*
После обучения однослойной нейронной сети проведём оценку её работы на тестовых данных, которые не участвовали в обучении.
Для этого используется метод `evaluate()`, который возвращает значение функции ошибки и метрики качества (`accuracy`).
```python
# оценка качества модели на тестовых данных
scores = model0.evaluate(X_test, y_test)
print('Loss on test data:', scores[0])
print('Accuracy on test data:', scores[1])
313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 3ms/step - accuracy: 0.9194 - loss: 0.2818
Loss on test data: 0.28366461396217346
Accuracy on test data: 0.9205999970436096
```
Таким образом, точность однослойной нейронной сети на тестовых данных составила примерно 92,4%,
что показывает, что даже простая модель способна достаточно эффективно распознавать изображения рукописных цифр из набора MNIST.
### *8. Добавить в модель один скрытый слой и провести обучение и тестирование (повторить п. 6–7) при 100, 300 и 500 нейронах в скрытом слое. По метрике качества классификации на тестовых данных выбрать наилучшее количество нейронов. В качестве функции активации нейронов в скрытом слое использовать функцию sigmoid.*
В данном пункте добавляется один скрытый слой с функцией активации sigmoid.
Архитектура сети теперь состоит из входного слоя размерности 784, одного скрытого слоя (Dense) с количеством нейронов 100, 300 или 500, выходного слоя из 10 нейронов с активацией `softmax`. Для каждой модели выполняется компиляция, обучение и тестирование аналогично пунктам 6–7.
```python
from keras.models import Sequential
from keras.layers import Dense
neurons = [100, 300, 500]
results = {}
for n in neurons:
print(f'\n=== Модель со скрытым слоем {n} нейронов ===')
# создание модели
model = Sequential()
model.add(Dense(units=n, input_dim=784, activation='sigmoid'))
model.add(Dense(units=num_classes, activation='softmax'))
# компиляция модели
model.compile(loss='categorical_crossentropy',
optimizer='sgd',
metrics=['accuracy'])
# обучение модели
H = model.fit(X_train, y_train,
validation_split=0.1,
epochs=50,
verbose=1) # чтобы не печатать все эпохи
# оценка на тестовых данных
scores = model.evaluate(X_test, y_test, verbose=1)
results[n] = scores[1]
print(f'Accuracy on test data: {scores[1]:.4f}')
=== Модель со скрытым слоем 100 нейронов ===
Accuracy on test data: 0.9445
=== Модель со скрытым слоем 300 нейронов ===
Accuracy on test data: 0.9347
=== Модель со скрытым слоем 500 нейронов ===
Accuracy on test data: 0.9310
```
```python
plt.figure()
plt.plot(list(results.keys()), list(results.values()), marker='o')
plt.grid()
plt.title('Accuracy on test data depending on hidden layer size')
plt.xlabel('Number of neurons in hidden layer')
plt.ylabel('Accuracy')
plt.show()
![alt text](image-4.png)
```
Результаты тестирования показывают, что с увеличением числа нейронов в скрытом слое точность модели немного снижается. По графику видно, что увеличение числа нейронов не приводит к улучшению качества классификации,
а наоборот, вызывает лёгкое переобучение и снижение точности на тестовой выборке.
Таким образом, наилучший результат достигается при 100 нейронах в скрытом слое
(accuracy ≈ 94,45%), что делает эту архитектуру оптимальной для данной задачи.
### *9. Добавить в наилучшую архитектуру, определённую в п. 8, второй скрытый слой и провести обучение и тестирование (повторить п. 6–7) при 50 и 100 нейронах во втором скрытом слое. В качестве функции активации нейронов в скрытом слое использовать функцию sigmoid.*
В качестве основы берётся лучшая модель из п. 8 — сеть с одним скрытым слоем из 100 нейронов.
Теперь добавляется второй скрытый слой с 50 или 100 нейронами и функцией активации `sigmoid`.
Выходной слой остаётся таким же — 10 нейронов с активацией `softmax`.
Функция `softmax` преобразует выходные значения нейронов в вероятности:
сумма всех выходов равна 1, а каждое значение показывает уверенность модели в том,
что изображение принадлежит соответствующему классу.
Наибольшее значение определяет предсказанный класс.
```python
from keras.models import Sequential
from keras.layers import Dense
hidden2 = [50, 100]
results_2 = {}
for n2 in hidden2:
print(f'\n=== Модель со вторым скрытым слоем {n2} нейронов ===')
# создание модели
model2 = Sequential()
model2.add(Dense(units=100, input_dim=784, activation='sigmoid')) # первый скрытый слой
model2.add(Dense(units=n2, activation='sigmoid')) # второй скрытый слой
model2.add(Dense(units=num_classes, activation='softmax')) # выходной слой
# компиляция модели
model2.compile(loss='categorical_crossentropy',
optimizer='sgd',
metrics=['accuracy'])
# обучение модели
H2 = model2.fit(X_train, y_train,
validation_split=0.1,
epochs=50,
verbose=1)
# оценка на тестовых данных
scores = model2.evaluate(X_test, y_test, verbose=1)
results_2[n2] = scores[1]
print(f'Accuracy on test data: {scores[1]:.4f}')
=== Модель со вторым скрытым слоем 50 нейронов ===
Accuracy on test data: 0.9443
=== Модель со вторым скрытым слоем 100 нейронов ===
Accuracy on test data: 0.9445
```
Добавление второго скрытого слоя не привело к заметному улучшению качества классификации — точность осталась примерно на уровне 94,4 %, как и у модели с одним скрытым слоем.
Это объясняется тем, что задача распознавания цифр из набора MNIST относительно простая, и уже один скрытый слой с 100 нейронами способен выделять необходимые закономерности.
Добавление второго слоя увеличивает количество параметров, но не добавляет новой информации, которую сеть могла бы использовать.
Кроме того, использование функции активации sigmoid ограничивает способность сети обучать глубокие слои из-за эффекта затухающего градиента, поэтому более сложная архитектура не даёт заметного прироста точности.
### *10. Результаты исследования архитектуры нейронной сети занести в таблицу:*
| № | Количество скрытых слоёв | Нейронов в 1-м скрытом слое | Нейронов во 2-м скрытом слое | Accuracy на тестовых данных |
| :-: | :----------------------: | :-------------------------: | :--------------------------: | :-------------------------: |
| 1 | 0 | – | – | 0.923 |
| 2 | 1 | 100 | – | **0.9445** |
| 3 | 1 | 300 | – | 0.9347 |
| 4 | 1 | 500 | – | 0.9310 |
| 5 | 2 | 100 | 50 | 0.9443 |
| 6 | 2 | 100 | 100 | 0.9445 |
Вывод:
С ростом числа нейронов и слоёв качество классификации не всегда улучшается.
Наилучший результат (accuracy ≈ 0.9445) показали модели: с одним скрытым слоем из 100 нейронов, и с двумя скрытыми слоями (100 + 100 нейронов).
Датасет MNIST относительно простой — цифры хорошо различимы, и даже простая однослойная модель способна выделить нужные закономерности. Более сложная сеть не получает новой информации, которую можно было бы использовать для улучшения качества. К тому же, увеличение числа нейронов и слоёв повышает риск переобучения. Модель начинает «запоминать» обучающие данные, теряя способность обобщать новые примеры. Это приводит к снижению точности на тестовой выборке. Использование функции активации `sigmoid` в скрытых слоях также ограничивает обучение глубоких моделей. При большом числе слоёв градиенты становятся очень малыми (эффект `vanishing gradient`), и обучение перестаёт быть эффективным.
### *11. Сохранить наилучшую нейронную сеть на диск. Данную нейронную сеть потребуется загрузить с диска в одной из следующих лабораторных работ.*
```python
model2.save('/content/drive/MyDrive/Colab Notebooks/best_model_2x100.h5')
WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`.
```
### *12. Для нейронной сети наилучшей архитектуры вывести два тестовых изображения, истинные метки и результат распознавания изображений.*
Для визуальной проверки работы обученной модели выбраны два случайных изображения из тестовой выборки. Модель предсказывает класс (цифру), который с наибольшей вероятностью соответствует изображению. Сравним предсказанные значения с истинными метками.
```python
import numpy as np
import matplotlib.pyplot as plt
# выбираем индексы двух случайных изображений
indices = np.random.choice(range(X_test.shape[0]), 2, replace=False)
# получаем предсказания
predictions = model2.predict(X_test[indices])
predicted_labels = np.argmax(predictions, axis=1)
true_labels = np.argmax(y_test[indices], axis=1)
# вывод изображений и меток
plt.figure(figsize=(6, 3))
for i, idx in enumerate(indices):
plt.subplot(1, 2, i + 1)
plt.imshow(X_test[idx].reshape(28, 28), cmap='gray')
plt.title(f'True: {true_labels[i]}, Pred: {predicted_labels[i]}')
plt.axis('off')
plt.show()
![alt text](image-5.png)
```
`np.argmax()` извлекает индекс максимального значения в векторе вероятностей (то есть номер класса). `model2.predict()` возвращает вероятность принадлежности изображения к каждому из 10 классов. Для наглядности в заголовках указаны истинная метка (True) и предсказанная моделью (Pred).
### *13. Каждому члену бригады создать собственное изображение рукописной цифры, подобное представленным в наборе MNIST. Цифру выбрать как остаток от деления на 10 числа своего дня рождения (например, 29 февраля → 29 mod10 = 9). Сохранить изображения. Загрузить, предобработать и подать на вход обученной нейронной сети собственные изображения. Вывести изображения и результаты распознавания.*
Членам бригады соответствуют цифры 5 и 6. Они были написаны от руки, отсканированы и преобразованы в черно-белый формат размером по 28 х 28 пикселей.
Загрузка файлов:
```python
from google.colab import files
uploaded = files.upload()
```
Предварительная подготовка аналогично началу работы:
```python
from tensorflow.keras.preprocessing import image
import numpy as np
import matplotlib.pyplot as plt
file_names = list(uploaded.keys())
X_custom = []
for fname in file_names:
# загружаем изображение в оттенках серого и приводим к 28×28
img = image.load_img(fname, color_mode='grayscale', target_size=(28, 28))
img_array = image.img_to_array(img)
# инвертируем цвета, если фон белый (MNIST — белая цифра на чёрном фоне)
img_array = 255 - img_array
# нормализация
img_array = img_array / 255.0
# разворачиваем в вектор длиной 784
img_flat = img_array.reshape(1, 784)
X_custom.append(img_flat)
X_custom = 1 - X_custom
predictions = model2.predict(X_custom)
print(np.argmax(predictions, axis=1))
[5 6]
```
`image.load_img`(..., `color_mode='grayscale'`) — загружает изображение в градациях серого.
`img_array / 255.0` — нормирует значения пикселей в диапазон [0, 1].
`X_custom = 1 - X_custom` — выполняет инвертирование яркости, чтобы фон стал тёмным, а цифра светлой — как в наборе MNIST. Без этой операции модель ошибалась, воспринимая цифру как фон.
`np.argmax(predictions, axis=1)` — определяет итоговые распознанные цифры.
### *14. Каждому члену бригады создать копию собственного изображения, отличающуюся от оригинала поворотом на 90 градусов в любую сторону. Сохранить изображения. Загрузить, предобработать и подать на вход обученной нейронной сети изменённые изображения. Вывести изображения и результаты распознавания.*
Для проверки устойчивости модели к поворотам изображений были созданы версии исходных цифр, повёрнутые на 90°. Далее выполняется их загрузка, нормализация, инверсия и распознавание обученной моделью.
```python
from google.colab import files
uploaded = files.upload()
Число файлов: 2
6 (1).png(image/png) - 6089 bytes, last modified: 15.10.2025 - 100% done
5 (1).png(image/png) - 6167 bytes, last modified: 15.10.2025 - 100% done
Saving 6 (1).png to 6 (1) (1).png
Saving 5 (1).png to 5 (1).png
```
```python
from tensorflow.keras.preprocessing import image
import numpy as np
import matplotlib.pyplot as plt
file_names = list(uploaded.keys())
X_rotated = []
for fname in file_names:
# загружаем повернутое изображение и приводим к формату 28×28
img = image.load_img(fname, color_mode='grayscale', target_size=(28, 28))
img_array = image.img_to_array(img) / 255.0 # нормализация
# разворачиваем в вектор длиной 784
img_flat = img_array.reshape(1, 784)
X_rotated.append(img_flat)
X_rotated = np.vstack(X_rotated)
# инвертируем цвета (цифры — светлые, фон — тёмный)
X_rotated = 1 - X_rotated
# предсказания модели
predictions = model2.predict(X_rotated)
predicted_labels = np.argmax(predictions, axis=1)
# вывод изображений и предсказаний
plt.figure(figsize=(6, 3))
for i, fname in enumerate(file_names):
img = image.load_img(fname, color_mode='grayscale', target_size=(28, 28))
plt.subplot(1, len(file_names), i + 1)
plt.imshow(img, cmap='gray')
plt.title(f'Pred: {predicted_labels[i]}')
plt.axis('off')
plt.show()
print('Распознанные цифры:', predicted_labels)
Распознанные цифры: [3 3]
```
```python
np.set_printoptions(precision=4, suppress=True)
[[0.0003 0. 0.1308 0.8647 0. 0.0037 0. 0. 0.0006 0. ]
[0.0012 0.0001 0.0845 0.8197 0. 0.0825 0. 0. 0.012 0. ]]
```
После поворота изображений на 90° нейронная сеть неверно классифицировала обе цифры, определив их как «3». Это показывает, что модель чувствительна к изменению ориентации изображений и не обладает устойчивостью к поворотам.
---
В ходе работы была реализована и исследована однослойная и многослойная нейронные сети для классификации изображений из набора MNIST.
Оптимальной оказалась модель с одним скрытым слоем на 100 нейронов, обеспечившая точность около 94 %.
Проведённый анализ показал, что увеличение числа нейронов или слоёв не всегда улучшает результат, а устойчивость к поворотам и искажениям не появляется по умолчанию и требует дополнительных методов обучения.

@ -0,0 +1,495 @@
# Отчет по Лабораторной работе №1 по курсу "Интеллектуальные системы"
## Бригада №5 (Голубев Т. Л., Ишутина Е. И.)
### *1. В среде GoogleColab создать новый блокнот (notebook). Импортировать необходимые для работы библиотеки и модули.*
`tensorflow.keras` — высокоуровневый API для построения и обучения нейронных сетей. Мы используем его для загрузки датасета и построения моделей.
`matplotlib.pyplot` — библиотека для визуализации данных, построения графиков и отображения изображений.
`numpy` — библиотека для работы с многомерными массивами и выполнения численных операций.
`sklearn (scikit-learn)` — библиотека для машинного обучения, содержит инструменты для предварительной обработки данных, метрик, кластеризации и классификации.
Задание рабочей директории, импорт необходимых библиотек и модулей:
```python
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks')
from tensorflow import keras
import matplotlib.pyplot as plt
import numpy as np
import sklearn
```
### *2. Загрузить набор данных MNIST, содержащий размеченные изображения рукописных цифр*
Набор данных MNIST (Modified National Institute of Standards and Technology) — это стандартный набор изображений для обучения и тестирования алгоритмов распознавания рукописных цифр.
Он содержит 70 000 изображений цифр от 0 до 9, из них 60 000 для обучения (training set) и 10 000 — для тестирования (test set).
Каждое изображение имеет размер 28×28 пикселей и представлено в градациях серого.
В TensorFlow набор данных MNIST встроен в модуль `keras.datasets`, что позволяет легко загрузить его одной командой.
```python
(X_train, y_train), (X_test, y_test) = mnist.load_data()
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz
11490434/11490434 ━━━━━━━━━━━━━━━━━━━━ 2s 0us/step
```
* X_train и X_test — массивы изображений рукописных цифр,
* y_train и y_test — соответствующие метки (от 0 до 9), обозначающие, какая цифра изображена.
### *3. Разбить набор данных на обучающие и тестовые данные в соотношении 60000:10000 элементов. При разбиении параметр random_state выбрать равным (4k–1), где k–номер бригады. Вывести размерности полученных обучающих и тестовых массивов данных.*
Параметр random_state обеспечивает воспроизводимость разбиения данных.
Для номера бригады = 5 получим `random_state = 19`.
Функция train_test_split() случайным образом делит данные на обучающую и тестовую выборки указанного размера.
```python
# создание своего разбиения датасета
from sklearn.model_selection import train_test_split
# объединяем в один набор
X = np.concatenate((X_train, X_test))
y = np.concatenate((y_train, y_test))
# разбиваем по вариантам
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size = 10000,
train_size = 60000,
random_state = 19)
```
```python
# вывод размерностей
print('Shape of X train:', X_train.shape)
print('Shape of y train:', y_train.shape)
print('Shape of X test:', X_test.shape)
print('Shape of y test:', y_test.shape)
Shape of X train: (60000, 28, 28)
Shape of y train: (60000,)
Shape of X test: (10000, 28, 28)
Shape of y test: (10000,)
```
### *4. Вывести первые 4 элемента обучающих данных (изображения и метки цифр).*
Данный код отображает первые четыре изображения из обучающего набора и их метки.
Каждое изображение разворачивается обратно в форму 28×28 для корректного отображения.
```python
# вывод первых 4 изображений и их меток
plt.figure(figsize=(8, 2))
for i in range(4):
plt.subplot(1, 4, i + 1)
plt.imshow(X_train[i].reshape(28, 28), cmap='gray')
plt.title(f'Label: {y_train[i]}', fontsize = 6)
plt.axis('off')
plt.show()
```
![alt text](image-2.png)
### *5. Провести предобработку данных: привести обучающие и тестовые данные к формату, пригодному для обучения нейронной сети. Входныеданные должны принимать значения от 0 до 1, метки цифрдолжны быть закодированы по принципу «one-hotencoding».Вывести размерности предобработанных обучающих и тестовых массивов данных.*
Перед обучением нейронной сети необходимо подготовить данные.
Каждое изображение в наборе MNIST имеет размер 28×28 пикселей, но полносвязная нейронная сеть принимает на вход вектор признаков.
Поэтому каждое изображение «вытягивается» в одномерный вектор длиной 784 (28×28), где каждый элемент соответствует яркости одного пикселя.
Кроме того, метки классов (цифры от 0 до 9) переводятся в формат one-hot encoding.
При этом каждая цифра представляется вектором длиной 10, где только один элемент равен 1 (номер класса), а остальные — 0.
Например, цифра 3 кодируется как [0, 0, 0, 1, 0, 0, 0, 0, 0, 0].
Такой формат удобен для обучения сети, потому что выходной слой содержит 10 нейронов — по одному для каждой цифры.
```python
# развертывание изображений 28x28 в вектор длиной 784 и нормализация
num_pixels = X_train.shape[1] * X_train.shape[2]
X_train = X_train.reshape(X_train.shape[0], num_pixels).astype('float32') / 255
X_test = X_test.reshape(X_test.shape[0], num_pixels).astype('float32') / 255
# кодирование меток по принципу one-hot encoding
from tensorflow.keras.utils import to_categorical
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)
num_classes = y_train.shape[1]
# вывод размерностей
print('Shape of X train:', X_train.shape)
print('Shape of y train:', y_train.shape)
print('Shape of X test:', X_test.shape)
print('Shape of y test:', y_test.shape)
Shape of X train: (60000, 784)
Shape of y train: (60000, 10)
Shape of X test: (10000, 784)
Shape of y test: (10000, 10)
```
### *6. Реализовать модель однослойной нейронной сети и обучить её на обучающих данных с выделением части обучающих данных в качестве валидационных. Вывести информацию об архитектуре нейронной сети. Вывести график функции ошибки на обучающих и валидационных данных по эпохам.*
Модель представляет собой однослойную нейронную сеть без скрытых слоёв.
На вход подаются векторы длиной 784, выходной слой содержит 10 нейронов (по количеству классов).
Используются параметры:
функция активации — `softmax`, функция ошибки — `categorical_crossentropy`, оптимизатор — `sgd`, метрика — `accuracy`.
```python
# создание модели однослойной нейронной сети
from keras.models import Sequential
from keras.layers import Dense
model0 = Sequential()
# добавляем выходной слой
model0.add(Dense(units=num_classes, input_dim=784, activation='softmax'))
# компиляция модели
model0.compile(loss='categorical_crossentropy',
optimizer='sgd',
metrics=['accuracy'])
# вывод информации об архитектуре модели
print(model0.summary())
/usr/local/lib/python3.12/dist-packages/keras/src/layers/core/dense.py:93: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
super().__init__(activity_regularizer=activity_regularizer, **kwargs)
Model: "sequential"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type) ┃ Output Shape ┃ Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ dense (Dense) │ (None, 10) │ 7,850 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
Total params: 7,850 (30.66 KB)
Trainable params: 7,850 (30.66 KB)
Non-trainable params: 0 (0.00 B)
None
```
```python
# обучение модели
H0 = model0.fit(X_train, y_train,
validation_split=0.1,
epochs=50,
verbose=1)
# вывод графика функции ошибки
plt.plot(H0.history['loss'])
plt.plot(H0.history['val_loss'])
plt.grid()
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend(['train_loss', 'val_loss'])
plt.title('Loss by epochs (Model 0)')
plt.show()
Epoch 1/50
1688/1688 ━━━━━━━━━━━━━━━━━━━━ 6s 3ms/step - accuracy: 0.6993 - loss: 1.1736 - val_accuracy: 0.8783 - val_loss: 0.5063
...
```
![alt text](image-3.png)
### *7. Применить обученную модель к тестовым данным. Вывести значение функции ошибки и значение метрики качества классификации на тестовых данных.*
После обучения однослойной нейронной сети проведём оценку её работы на тестовых данных, которые не участвовали в обучении.
Для этого используется метод `evaluate()`, который возвращает значение функции ошибки и метрики качества (`accuracy`).
```python
# оценка качества модели на тестовых данных
scores = model0.evaluate(X_test, y_test)
print('Loss on test data:', scores[0])
print('Accuracy on test data:', scores[1])
313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 3ms/step - accuracy: 0.9194 - loss: 0.2818
Loss on test data: 0.28366461396217346
Accuracy on test data: 0.9205999970436096
```
Таким образом, точность однослойной нейронной сети на тестовых данных составила примерно 92,4%,
что показывает, что даже простая модель способна достаточно эффективно распознавать изображения рукописных цифр из набора MNIST.
### *8. Добавить в модель один скрытый слой и провести обучение и тестирование (повторить п. 6–7) при 100, 300 и 500 нейронах в скрытом слое. По метрике качества классификации на тестовых данных выбрать наилучшее количество нейронов. В качестве функции активации нейронов в скрытом слое использовать функцию sigmoid.*
В данном пункте добавляется один скрытый слой с функцией активации sigmoid.
Архитектура сети теперь состоит из входного слоя размерности 784, одного скрытого слоя (Dense) с количеством нейронов 100, 300 или 500, выходного слоя из 10 нейронов с активацией `softmax`. Для каждой модели выполняется компиляция, обучение и тестирование аналогично пунктам 6–7.
```python
from keras.models import Sequential
from keras.layers import Dense
neurons = [100, 300, 500]
results = {}
for n in neurons:
print(f'\n=== Модель со скрытым слоем {n} нейронов ===')
# создание модели
model = Sequential()
model.add(Dense(units=n, input_dim=784, activation='sigmoid'))
model.add(Dense(units=num_classes, activation='softmax'))
# компиляция модели
model.compile(loss='categorical_crossentropy',
optimizer='sgd',
metrics=['accuracy'])
# обучение модели
H = model.fit(X_train, y_train,
validation_split=0.1,
epochs=50,
verbose=1) # чтобы не печатать все эпохи
# оценка на тестовых данных
scores = model.evaluate(X_test, y_test, verbose=1)
results[n] = scores[1]
print(f'Accuracy on test data: {scores[1]:.4f}')
=== Модель со скрытым слоем 100 нейронов ===
Accuracy on test data: 0.9445
=== Модель со скрытым слоем 300 нейронов ===
Accuracy on test data: 0.9347
=== Модель со скрытым слоем 500 нейронов ===
Accuracy on test data: 0.9310
```
```python
plt.figure()
plt.plot(list(results.keys()), list(results.values()), marker='o')
plt.grid()
plt.title('Accuracy on test data depending on hidden layer size')
plt.xlabel('Number of neurons in hidden layer')
plt.ylabel('Accuracy')
plt.show()
```
![alt text](image-4.png)
Результаты тестирования показывают, что с увеличением числа нейронов в скрытом слое точность модели немного снижается. По графику видно, что увеличение числа нейронов не приводит к улучшению качества классификации,
а наоборот, вызывает лёгкое переобучение и снижение точности на тестовой выборке.
Таким образом, наилучший результат достигается при 100 нейронах в скрытом слое
(accuracy ≈ 94,45%), что делает эту архитектуру оптимальной для данной задачи.
### *9. Добавить в наилучшую архитектуру, определённую в п. 8, второй скрытый слой и провести обучение и тестирование (повторить п. 6–7) при 50 и 100 нейронах во втором скрытом слое. В качестве функции активации нейронов в скрытом слое использовать функцию sigmoid.*
В качестве основы берётся лучшая модель из п. 8 — сеть с одним скрытым слоем из 100 нейронов.
Теперь добавляется второй скрытый слой с 50 или 100 нейронами и функцией активации `sigmoid`.
Выходной слой остаётся таким же — 10 нейронов с активацией `softmax`.
Функция `softmax` преобразует выходные значения нейронов в вероятности:
сумма всех выходов равна 1, а каждое значение показывает уверенность модели в том,
что изображение принадлежит соответствующему классу.
Наибольшее значение определяет предсказанный класс.
```python
from keras.models import Sequential
from keras.layers import Dense
hidden2 = [50, 100]
results_2 = {}
for n2 in hidden2:
print(f'\n=== Модель со вторым скрытым слоем {n2} нейронов ===')
# создание модели
model2 = Sequential()
model2.add(Dense(units=100, input_dim=784, activation='sigmoid')) # первый скрытый слой
model2.add(Dense(units=n2, activation='sigmoid')) # второй скрытый слой
model2.add(Dense(units=num_classes, activation='softmax')) # выходной слой
# компиляция модели
model2.compile(loss='categorical_crossentropy',
optimizer='sgd',
metrics=['accuracy'])
# обучение модели
H2 = model2.fit(X_train, y_train,
validation_split=0.1,
epochs=50,
verbose=1)
# оценка на тестовых данных
scores = model2.evaluate(X_test, y_test, verbose=1)
results_2[n2] = scores[1]
print(f'Accuracy on test data: {scores[1]:.4f}')
=== Модель со вторым скрытым слоем 50 нейронов ===
Accuracy on test data: 0.9443
=== Модель со вторым скрытым слоем 100 нейронов ===
Accuracy on test data: 0.9445
```
Добавление второго скрытого слоя не привело к заметному улучшению качества классификации — точность осталась примерно на уровне 94,4 %, как и у модели с одним скрытым слоем.
Это объясняется тем, что задача распознавания цифр из набора MNIST относительно простая, и уже один скрытый слой с 100 нейронами способен выделять необходимые закономерности.
Добавление второго слоя увеличивает количество параметров, но не добавляет новой информации, которую сеть могла бы использовать.
Кроме того, использование функции активации sigmoid ограничивает способность сети обучать глубокие слои из-за эффекта затухающего градиента, поэтому более сложная архитектура не даёт заметного прироста точности.
### *10. Результаты исследования архитектуры нейронной сети занести в таблицу:*
| № | Количество скрытых слоёв | Нейронов в 1-м скрытом слое | Нейронов во 2-м скрытом слое | Accuracy на тестовых данных |
| :-: | :----------------------: | :-------------------------: | :--------------------------: | :-------------------------: |
| 1 | 0 | – | – | 0.923 |
| 2 | 1 | 100 | – | **0.9445** |
| 3 | 1 | 300 | – | 0.9347 |
| 4 | 1 | 500 | – | 0.9310 |
| 5 | 2 | 100 | 50 | 0.9443 |
| 6 | 2 | 100 | 100 | 0.9445 |
Вывод:
С ростом числа нейронов и слоёв качество классификации не всегда улучшается.
Наилучший результат (accuracy ≈ 0.9445) показали модели: с одним скрытым слоем из 100 нейронов, и с двумя скрытыми слоями (100 + 100 нейронов).
Датасет MNIST относительно простой — цифры хорошо различимы, и даже простая однослойная модель способна выделить нужные закономерности. Более сложная сеть не получает новой информации, которую можно было бы использовать для улучшения качества. К тому же, увеличение числа нейронов и слоёв повышает риск переобучения. Модель начинает «запоминать» обучающие данные, теряя способность обобщать новые примеры. Это приводит к снижению точности на тестовой выборке. Использование функции активации `sigmoid` в скрытых слоях также ограничивает обучение глубоких моделей. При большом числе слоёв градиенты становятся очень малыми (эффект `vanishing gradient`), и обучение перестаёт быть эффективным.
### *11. Сохранить наилучшую нейронную сеть на диск. Данную нейронную сеть потребуется загрузить с диска в одной из следующих лабораторных работ.*
```python
model2.save('/content/drive/MyDrive/Colab Notebooks/best_model_2x100.h5')
WARNING:absl:You are saving your model as an HDF5 file via `model.save()` or `keras.saving.save_model(model)`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')` or `keras.saving.save_model(model, 'my_model.keras')`.
```
### *12. Для нейронной сети наилучшей архитектуры вывести два тестовых изображения, истинные метки и результат распознавания изображений.*
Для визуальной проверки работы обученной модели выбраны два случайных изображения из тестовой выборки. Модель предсказывает класс (цифру), который с наибольшей вероятностью соответствует изображению. Сравним предсказанные значения с истинными метками.
```python
import numpy as np
import matplotlib.pyplot as plt
# выбираем индексы двух случайных изображений
indices = np.random.choice(range(X_test.shape[0]), 2, replace=False)
# получаем предсказания
predictions = model2.predict(X_test[indices])
predicted_labels = np.argmax(predictions, axis=1)
true_labels = np.argmax(y_test[indices], axis=1)
# вывод изображений и меток
plt.figure(figsize=(6, 3))
for i, idx in enumerate(indices):
plt.subplot(1, 2, i + 1)
plt.imshow(X_test[idx].reshape(28, 28), cmap='gray')
plt.title(f'True: {true_labels[i]}, Pred: {predicted_labels[i]}')
plt.axis('off')
plt.show()
```
![alt text](image-5.png)
`np.argmax()` извлекает индекс максимального значения в векторе вероятностей (то есть номер класса). `model2.predict()` возвращает вероятность принадлежности изображения к каждому из 10 классов. Для наглядности в заголовках указаны истинная метка (True) и предсказанная моделью (Pred).
### *13. Каждому члену бригады создать собственное изображение рукописной цифры, подобное представленным в наборе MNIST. Цифру выбрать как остаток от деления на 10 числа своего дня рождения (например, 29 февраля → 29 mod10 = 9). Сохранить изображения. Загрузить, предобработать и подать на вход обученной нейронной сети собственные изображения. Вывести изображения и результаты распознавания.*
Членам бригады соответствуют цифры 5 и 6. Они были написаны от руки, отсканированы и преобразованы в черно-белый формат размером по 28 х 28 пикселей.
Загрузка файлов:
```python
from google.colab import files
uploaded = files.upload()
```
Предварительная подготовка аналогично началу работы:
```python
from tensorflow.keras.preprocessing import image
import numpy as np
import matplotlib.pyplot as plt
file_names = list(uploaded.keys())
X_custom = []
for fname in file_names:
# загружаем изображение в оттенках серого и приводим к 28×28
img = image.load_img(fname, color_mode='grayscale', target_size=(28, 28))
img_array = image.img_to_array(img)
# инвертируем цвета, если фон белый (MNIST — белая цифра на чёрном фоне)
img_array = 255 - img_array
# нормализация
img_array = img_array / 255.0
# разворачиваем в вектор длиной 784
img_flat = img_array.reshape(1, 784)
X_custom.append(img_flat)
X_custom = 1 - X_custom
predictions = model2.predict(X_custom)
print(np.argmax(predictions, axis=1))
[5 6]
```
`image.load_img`(..., `color_mode='grayscale'`) — загружает изображение в градациях серого.
`img_array / 255.0` — нормирует значения пикселей в диапазон [0, 1].
`X_custom = 1 - X_custom` — выполняет инвертирование яркости, чтобы фон стал тёмным, а цифра светлой — как в наборе MNIST. Без этой операции модель ошибалась, воспринимая цифру как фон.
`np.argmax(predictions, axis=1)` — определяет итоговые распознанные цифры.
### *14. Каждому члену бригады создать копию собственного изображения, отличающуюся от оригинала поворотом на 90 градусов в любую сторону. Сохранить изображения. Загрузить, предобработать и подать на вход обученной нейронной сети изменённые изображения. Вывести изображения и результаты распознавания.*
Для проверки устойчивости модели к поворотам изображений были созданы версии исходных цифр, повёрнутые на 90° по часовой стрелке. Далее выполняется их загрузка, нормализация, инверсия и распознавание обученной моделью.
```python
from google.colab import files
uploaded = files.upload()
Число файлов: 2
6 (1).png(image/png) - 6089 bytes, last modified: 15.10.2025 - 100% done
5 (1).png(image/png) - 6167 bytes, last modified: 15.10.2025 - 100% done
Saving 6 (1).png to 6 (1) (1).png
Saving 5 (1).png to 5 (1).png
```
```python
from tensorflow.keras.preprocessing import image
import numpy as np
import matplotlib.pyplot as plt
file_names = list(uploaded.keys())
X_rotated = []
for fname in file_names:
# загружаем повернутое изображение и приводим к формату 28×28
img = image.load_img(fname, color_mode='grayscale', target_size=(28, 28))
img_array = image.img_to_array(img) / 255.0 # нормализация
# разворачиваем в вектор длиной 784
img_flat = img_array.reshape(1, 784)
X_rotated.append(img_flat)
X_rotated = np.vstack(X_rotated)
# инвертируем цвета (цифры — светлые, фон — тёмный)
X_rotated = 1 - X_rotated
# предсказания модели
predictions = model2.predict(X_rotated)
predicted_labels = np.argmax(predictions, axis=1)
# вывод изображений и предсказаний
plt.figure(figsize=(6, 3))
for i, fname in enumerate(file_names):
img = image.load_img(fname, color_mode='grayscale', target_size=(28, 28))
plt.subplot(1, len(file_names), i + 1)
plt.imshow(img, cmap='gray')
plt.title(f'Pred: {predicted_labels[i]}')
plt.axis('off')
plt.show()
print('Распознанные цифры:', predicted_labels)
Распознанные цифры: [3 3]
```
```python
np.set_printoptions(precision=4, suppress=True)
[[0.0003 0. 0.1308 0.8647 0. 0.0037 0. 0. 0.0006 0. ]
[0.0012 0.0001 0.0845 0.8197 0. 0.0825 0. 0. 0.012 0. ]]
```
После поворота изображений на 90° нейронная сеть неверно классифицировала обе цифры, определив их как «3». Это показывает, что модель чувствительна к изменению ориентации изображений и не обладает устойчивостью к поворотам.
---
В ходе работы была реализована и исследована однослойная и многослойная нейронные сети для классификации изображений из набора MNIST.
Оптимальной оказалась модель с одним скрытым слоем на 100 нейронов, обеспечившая точность около 94 %.
Проведённый анализ показал, что увеличение числа нейронов или слоёв не всегда улучшает результат, а устойчивость к поворотам и искажениям не появляется по умолчанию и требует дополнительных методов обучения.

@ -0,0 +1,21 @@
1.8784609e-01 3.9364220e-01 1.9425057e-01 9.6542948e-02 6.3257200e-01 3.1415251e-01 2.4461106e-01 2.8175944e-01 4.2171717e-01 3.9469250e-01 4.5301467e-02 2.3598833e-01 5.0181407e-02 1.8991479e-02 2.1589557e-01 1.1557064e-01 6.5530303e-02 1.9643872e-01 8.0036022e-02 7.4112461e-02 1.7467094e-01 6.2153518e-01 1.8332586e-01 8.0810067e-02 7.9066235e-01 2.3528442e-01 3.2132588e-01 4.8934708e-01 2.7577370e-01 2.6905418e-01
7.1129727e-01 4.1224214e-01 7.1460162e-01 5.6776246e-01 4.8451747e-01 5.3990553e-01 5.7357076e-01 7.4602386e-01 3.8585859e-01 2.4094356e-01 3.2464240e-01 7.5075141e-02 3.2059558e-01 2.3047901e-01 7.6996295e-02 1.9495599e-01 9.0303030e-02 2.7865126e-01 1.0269038e-01 1.0023078e-01 7.0188545e-01 3.6727079e-01 7.2010558e-01 5.0181872e-01 3.8453411e-01 3.5044775e-01 3.7987220e-01 8.3573883e-01 2.3181549e-01 2.0136429e-01
3.8567845e-01 6.7974298e-01 3.6569691e-01 2.4432662e-01 2.7597725e-01 8.1804797e-02 1.0979381e-01 1.3613320e-01 4.0000000e-01 6.2763269e-02 1.2913272e-01 2.7996818e-01 1.0771333e-01 7.2054808e-02 1.7398103e-01 9.0260462e-02 6.2853535e-02 1.7213487e-01 3.3247031e-01 2.9545486e-02 3.3191035e-01 6.6337953e-01 2.9727576e-01 1.8339560e-01 2.8811992e-01 6.9243531e-02 1.2356230e-01 2.2594502e-01 3.2879953e-01 4.3355634e-02
3.9561740e-01 1.5387217e-01 4.0570797e-01 2.3792153e-01 4.9354518e-01 5.9542359e-01 4.8664480e-01 4.8489066e-01 7.3787879e-01 4.2881213e-01 1.1852254e-01 7.7218883e-02 1.2378080e-01 7.1176956e-02 1.7255329e-01 3.8324271e-01 1.6277778e-01 4.2659595e-01 4.0578038e-01 1.2089051e-01 3.6072572e-01 1.8816631e-01 3.7198068e-01 1.9556134e-01 4.4792974e-01 5.5118317e-01 5.0359425e-01 8.2233677e-01 6.1147250e-01 2.9135511e-01
4.9595343e-01 1.0000000e+00 4.8103103e-01 3.2962884e-01 4.1067076e-01 3.3869088e-01 3.3200562e-01 4.3792247e-01 3.7828283e-01 2.0429655e-01 1.5393808e-01 1.0959600e-01 1.0578146e-01 7.8816133e-02 1.0697896e-01 1.9225223e-01 6.5707071e-02 2.6027657e-01 6.1602972e-02 6.4404461e-02 5.1867663e-01 8.7553305e-01 4.5216395e-01 3.0053087e-01 4.3142046e-01 3.3589467e-01 2.5886581e-01 7.0996564e-01 2.5389316e-01 1.9624820e-01
5.9676274e-01 2.8542442e-01 6.0058047e-01 4.5408271e-01 5.3597544e-01 4.5156739e-01 5.8762887e-01 6.3916501e-01 4.8838384e-01 2.2872789e-01 2.2629006e-01 1.5200672e-01 1.9012392e-01 1.6859981e-01 7.9681817e-02 1.5409920e-01 1.0174242e-01 2.4682705e-01 1.2632971e-01 8.3716817e-02 6.6880114e-01 3.8299574e-01 6.2000100e-01 5.0304758e-01 4.7962755e-01 3.4666395e-01 5.4392971e-01 7.7216495e-01 4.0961955e-01 2.4393283e-01
3.4118983e-01 4.7683463e-01 3.3916108e-01 1.9817603e-01 3.7916403e-01 3.4114472e-01 2.6124649e-01 3.2117296e-01 5.9343434e-01 3.0265375e-01 1.1196813e-01 3.2814710e-01 1.3084861e-01 4.5196284e-02 3.1162253e-01 2.6172380e-01 9.3131313e-02 3.0820231e-01 5.2214780e-01 1.3381148e-01 3.1768054e-01 6.0847548e-01 3.2167937e-01 1.5387829e-01 5.5953246e-01 3.6732932e-01 2.9904153e-01 6.0893471e-01 6.2270846e-01 3.1195068e-01
7.6809125e-01 5.8369970e-01 7.5813696e-01 6.4750795e-01 3.8331678e-01 4.5647506e-01 4.5688847e-01 6.1481113e-01 4.2878788e-01 2.7653749e-01 3.4274851e-01 1.3333186e-01 3.0580031e-01 2.7829390e-01 1.6028147e-01 1.9811037e-01 1.1356061e-01 3.2506156e-01 1.1282152e-01 7.4561585e-02 8.2106012e-01 5.9941365e-01 7.7488919e-01 6.7803775e-01 5.0802351e-01 3.7382969e-01 4.6485623e-01 8.9106529e-01 3.0317366e-01 2.0812016e-01
3.9703725e-01 4.4132567e-01 3.8981411e-01 2.4801697e-01 3.5542114e-01 2.5832771e-01 2.6288660e-01 3.7191849e-01 3.3181818e-01 2.3188711e-01 7.2931378e-02 1.0632514e-01 6.2102436e-02 4.2282564e-02 2.7769657e-01 1.6664163e-01 1.1441919e-01 3.3396477e-01 2.3678730e-01 4.3088319e-02 3.0238349e-01 3.6833689e-01 2.8432691e-01 1.5869544e-01 3.6010038e-01 1.6727304e-01 2.2731629e-01 5.0721649e-01 1.9534792e-01 8.6842450e-02
5.0257939e-01 4.6060196e-01 5.1972911e-01 3.5503712e-01 3.6345581e-01 5.5524201e-01 5.0046860e-01 4.9801193e-01 3.2121212e-01 4.9978939e-01 2.9599855e-01 2.4416549e-01 2.3766668e-01 1.8322444e-01 1.7177142e-01 5.1069487e-01 1.6643939e-01 4.3777231e-01 1.2450048e-01 3.5947929e-01 4.8523657e-01 4.4909382e-01 4.6411674e-01 3.0765828e-01 3.2708182e-01 4.3776620e-01 4.1253994e-01 6.8591065e-01 1.4508181e-01 4.4182081e-01
2.9007525e-01 1.9783564e-01 3.0004837e-01 1.6402969e-01 7.8694592e-01 4.8193362e-01 4.8523899e-01 4.7718688e-01 4.3686869e-01 5.6781803e-01 1.0114068e-01 1.2455799e-01 7.7887198e-02 5.2032320e-02 1.8523303e-01 2.0179049e-01 1.3820707e-01 2.6292858e-01 1.0677098e-01 2.1430842e-01 2.9811455e-01 2.7665245e-01 2.7884855e-01 1.5778608e-01 7.5962491e-01 3.7121014e-01 5.0926518e-01 6.8247423e-01 3.1184703e-01 5.6054047e-01
2.5931185e-01 4.8461278e-01 2.7765877e-01 1.4099682e-01 5.9555836e-01 6.7548003e-01 5.3256795e-01 4.2460239e-01 4.8989899e-01 6.8386689e-01 6.7390911e-02 2.7378006e-01 6.0406163e-02 3.2009832e-02 1.8479111e-01 5.2511491e-01 1.9553030e-01 2.7126350e-01 1.4082287e-01 3.1733068e-01 2.5471363e-01 7.6385928e-01 2.3527068e-01 1.2932560e-01 7.5368157e-01 1.0000000e+00 8.8258786e-01 7.5945017e-01 5.5213877e-01 1.0000000e+00
3.4497610e-01 4.3422388e-01 3.4538042e-01 2.0627784e-01 4.6194818e-01 2.9452181e-01 3.4278351e-01 3.0511928e-01 4.3737374e-01 2.0766639e-01 3.3025530e-02 3.2947313e-01 5.3621071e-02 2.1923877e-02 1.4957338e-01 1.7708114e-01 1.1729798e-01 2.4171245e-01 9.3262791e-02 9.8848859e-02 2.6182853e-01 5.9301706e-01 2.6838986e-01 1.3347916e-01 4.4132603e-01 2.3868013e-01 3.3817891e-01 4.6804124e-01 2.2333925e-01 1.8673750e-01
3.9372427e-01 5.2620900e-01 4.0501693e-01 2.4979852e-01 5.0167013e-01 4.6107601e-01 3.9432990e-01 4.3494036e-01 4.3737374e-01 3.2518955e-01 1.1859497e-01 1.4405057e-01 1.2915233e-01 6.8543401e-02 1.1965870e-01 2.1268063e-01 9.0303030e-02 2.0515249e-01 1.3786796e-01 7.1590454e-02 4.3898968e-01 6.5804904e-01 4.9250461e-01 2.6636846e-01 6.1368289e-01 5.6631836e-01 5.0599042e-01 6.9553265e-01 4.8531441e-01 2.8676374e-01
4.1265559e-01 3.5847142e-01 3.9672448e-01 2.6430541e-01 3.9126117e-01 2.1044721e-01 1.5447516e-01 2.5790258e-01 2.8181818e-01 1.1647009e-01 9.3572334e-02 1.7454915e-01 7.7698723e-02 6.3836622e-02 9.9024374e-02 1.5304774e-01 4.9343434e-02 1.8501610e-01 1.0677098e-01 5.3038155e-02 4.3329776e-01 5.5437100e-01 3.9289805e-01 2.6636846e-01 4.6377864e-01 3.1765482e-01 2.3178914e-01 5.2955326e-01 3.6901242e-01 2.0510298e-01
5.5132756e-01 5.2079811e-01 5.5980927e-01 4.0063627e-01 4.8542024e-01 5.1935464e-01 5.4334583e-01 6.1829026e-01 5.6717172e-01 2.5294861e-01 2.6043817e-01 2.4438649e-01 2.2697074e-01 1.8341122e-01 1.5416256e-01 2.3648872e-01 1.3121212e-01 2.1935973e-01 1.7149772e-01 1.2662549e-01 5.4144433e-01 5.8608742e-01 5.4828428e-01 3.6492332e-01 5.1462722e-01 3.8653938e-01 4.8985623e-01 6.3505155e-01 3.7039227e-01 2.8059819e-01
3.5964788e-01 3.9972946e-01 3.7053417e-01 2.1264051e-01 4.7639253e-01 5.1352678e-01 3.3388004e-01 4.3653082e-01 6.0202020e-01 4.0606571e-01 5.1783451e-02 1.3768564e-01 6.3751590e-02 2.6611978e-02 9.3109427e-02 2.1253042e-01 6.7702020e-02 2.5610911e-01 9.3684921e-02 9.7294197e-02 3.4471718e-01 5.6476546e-01 3.5853379e-01 1.7491644e-01 5.3707984e-01 6.1803029e-01 4.4241214e-01 9.2817869e-01 5.3203233e-01 4.7527220e-01
1.8784609e-01 3.9364220e-01 1.9425057e-01 9.6542948e-02 6.3257200e-01 3.1415251e-01 2.4461106e-01 2.8175944e-01 4.2171717e-01 3.9469250e-01 4.5301467e-02 2.3598833e-01 5.0181407e-02 1.8991479e-02 2.1589557e-01 1.1557064e-01 6.5530303e-02 1.9643872e-01 8.0036022e-02 7.4112461e-02 1.7467094e-01 6.2153518e-01 1.8332586e-01 8.0810067e-02 7.9066235e-01 2.3528442e-01 3.2132588e-01 4.8934708e-01 2.7577370e-01 2.6905418e-01
7.2360263e-01 3.3682787e-01 7.5329970e-01 5.7921527e-01 7.2194638e-01 7.8958346e-01 9.9906279e-01 9.0606362e-01 7.5555556e-01 4.3028644e-01 3.9960167e-01 2.6184583e-01 4.3787400e-01 3.0481623e-01 1.6323894e-01 6.3409139e-01 2.6262626e-01 4.6978594e-01 3.2698261e-01 1.4310490e-01 7.2821060e-01 4.2617271e-01 7.7887345e-01 5.3450649e-01 6.5330516e-01 6.5237555e-01 7.6741214e-01 1.0000000e+00 4.9083383e-01 2.8105733e-01
5.2103744e-01 2.2658099e-02 5.4598853e-01 3.6373277e-01 5.9375282e-01 7.9203730e-01 7.0313964e-01 7.3111332e-01 6.8636364e-01 6.0551811e-01 3.5614702e-01 1.2046941e-01 3.6903360e-01 2.7381126e-01 1.5929565e-01 3.5139844e-01 1.3568182e-01 3.0062512e-01 3.1164518e-01 1.8304244e-01 6.2077552e-01 1.4152452e-01 6.6831017e-01 4.5069799e-01 6.0113584e-01 6.1929156e-01 5.6861022e-01 9.1202749e-01 5.9846245e-01 4.1886396e-01
3.2367836e-01 4.9983091e-01 3.3542948e-01 1.9189820e-01 5.7389185e-01 4.5616833e-01 3.1794752e-01 3.3593439e-01 6.1363636e-01 4.7198821e-01 1.3166757e-01 2.5808876e-01 1.0446214e-01 6.0231828e-02 2.7082979e-01 2.7268904e-01 8.7777778e-02 3.0611858e-01 2.3158102e-01 2.1074997e-01 2.8744219e-01 5.5756930e-01 2.7685642e-01 1.4815179e-01 7.1471967e-01 3.5830641e-01 2.7004792e-01 5.2268041e-01 4.1119653e-01 4.1492851e-01

@ -0,0 +1,357 @@
3.1042643e-01 1.5725397e-01 3.0177597e-01 1.7934252e-01 4.0769161e-01 1.8989633e-01 1.5613871e-01 2.3762425e-01 4.1666667e-01 1.6217355e-01 5.7360130e-02 9.4678218e-02 6.1301418e-02 3.1300080e-02 2.2942516e-01 9.2738907e-02 6.0277778e-02 2.4910021e-01 1.6769854e-01 4.8546909e-02 2.5542512e-01 1.9296375e-01 2.4548035e-01 1.2927645e-01 4.8094829e-01 1.4554045e-01 1.9089457e-01 4.4261168e-01 2.7833629e-01 1.1511216e-01
2.8865540e-01 2.0290835e-01 2.8912998e-01 1.5970308e-01 4.9535073e-01 3.3010245e-01 1.0702905e-01 1.5457256e-01 4.5808081e-01 3.8226622e-01 2.6688394e-02 8.5639144e-02 2.9496301e-02 1.4695610e-02 8.1041575e-02 1.2563463e-01 4.2878788e-02 1.2293995e-01 1.2520403e-01 5.2865415e-02 2.3372465e-01 2.2574627e-01 2.2750137e-01 1.0944259e-01 3.9642079e-01 2.4285201e-01 1.5095847e-01 2.5027491e-01 3.1914055e-01 1.7571822e-01
1.1940934e-01 9.2323301e-02 1.1436666e-01 5.5312831e-02 4.4930938e-01 1.3968468e-01 6.9259606e-02 1.0318091e-01 3.8131313e-01 4.0206403e-01 6.0039833e-02 1.3627122e-01 5.4280733e-02 1.6619412e-02 2.6831424e-01 9.0635984e-02 5.0126263e-02 2.6917977e-01 1.7431193e-01 7.1625002e-02 8.1821416e-02 9.7014925e-02 7.3310424e-02 3.1876720e-02 4.0434524e-01 8.4902640e-02 7.0822684e-02 2.1398625e-01 1.7445299e-01 1.4882592e-01
2.8628899e-01 2.9455529e-01 2.6826066e-01 1.6131495e-01 3.3583100e-01 5.6070180e-02 6.0028116e-02 1.4527833e-01 2.0555556e-01 1.8260320e-01 2.6217635e-02 4.3798621e-01 1.9460020e-02 1.3743047e-02 8.9710032e-02 1.9880133e-02 3.3914141e-02 2.2049631e-01 2.6492936e-01 3.0478283e-02 1.9103522e-01 2.8757996e-01 1.6958016e-01 8.8650216e-02 1.7063990e-01 1.8336875e-02 3.8602236e-02 1.7226804e-01 8.3185492e-02 4.3617998e-02
5.7503905e-02 2.4112276e-01 5.4730150e-02 2.4772004e-02 3.0125485e-01 1.2284522e-01 3.7207123e-02 2.9408549e-02 3.5808081e-01 3.1739680e-01 1.6223067e-02 1.3182903e-01 1.5878999e-02 2.6204805e-03 2.4662610e-01 1.0670832e-01 4.0101010e-02 1.1208562e-01 2.5128046e-01 5.8289457e-02 3.6784063e-02 2.6492537e-01 3.4115245e-02 1.4009044e-02 3.8651522e-01 1.0517992e-01 5.4952077e-02 8.8109966e-02 3.0356791e-01 1.2495081e-01
2.3990724e-01 1.6638485e-01 2.3668026e-01 1.2971368e-01 4.5562878e-01 2.1943439e-01 1.5445173e-01 1.3663022e-01 3.1060606e-01 2.2051390e-01 5.5078762e-02 8.1594767e-02 5.1406493e-02 2.4408010e-02 1.2832716e-01 9.0260462e-02 5.8636364e-02 1.0721728e-01 9.0026454e-02 5.2761771e-02 2.0739950e-01 2.3134328e-01 1.9657353e-01 9.7670075e-02 5.1660833e-01 1.8269930e-01 2.4361022e-01 2.2501718e-01 2.3299823e-01 1.8345796e-01
3.0806001e-01 4.2576936e-01 2.9797526e-01 1.7709438e-01 3.1497698e-01 1.7667628e-01 1.1131678e-01 1.6819085e-01 3.7828283e-01 1.5206403e-01 4.4287525e-02 2.1941301e-01 4.6082081e-02 2.5024374e-02 9.3211408e-02 8.6880764e-02 5.2904040e-02 2.2428490e-01 1.1999775e-01 3.6662383e-02 2.5684810e-01 5.2771855e-01 2.4199412e-01 1.2622886e-01 2.9736512e-01 1.3952518e-01 1.8226837e-01 4.4054983e-01 2.5744136e-01 9.2680047e-02
2.2618202e-01 4.0209672e-01 2.1373782e-01 1.2063627e-01 3.0459511e-01 9.2877738e-02 3.8823805e-02 5.5417495e-02 2.1969697e-01 1.8786858e-01 1.0671736e-01 1.8780941e-01 8.8488904e-02 4.0470827e-02 1.4087092e-01 5.6373359e-02 2.9494949e-02 1.4103050e-01 2.2764113e-01 3.0201899e-02 1.7965137e-01 3.6513859e-01 1.6220927e-01 8.1424499e-02 2.4651654e-01 5.7106267e-02 4.4113419e-02 1.2766323e-01 1.7110191e-01 6.9460842e-02
3.1515926e-01 2.2421373e-01 3.0004837e-01 1.8167550e-01 2.1865126e-01 1.2640329e-01 4.3509841e-02 8.5636183e-02 1.4797980e-01 2.0155855e-01 2.7412638e-02 1.2446959e-01 3.2606135e-02 1.4471477e-02 9.3959275e-02 7.1484363e-02 2.7247475e-02 1.5071036e-01 7.5533292e-02 5.7218468e-02 2.3977232e-01 2.9770789e-01 2.2745157e-01 1.1588183e-01 2.4915803e-01 1.2700954e-01 8.3865815e-02 2.9505155e-01 1.5395230e-01 1.6535485e-01
2.3470112e-01 2.8846804e-01 2.2057909e-01 1.2475080e-01 2.7065090e-01 8.6283050e-02 4.6204311e-02 6.7047714e-02 4.0808081e-01 2.3462511e-01 4.1933732e-02 6.0267857e-02 3.5951562e-02 1.9925364e-02 1.8686474e-01 4.6023973e-02 3.3106061e-02 1.5154385e-01 1.6994991e-01 6.0120504e-02 1.8392031e-01 2.4813433e-01 1.6564570e-01 8.4054267e-02 2.8547844e-01 5.9929563e-02 7.3506390e-02 2.1635739e-01 2.4048886e-01 1.2488522e-01
2.1482323e-01 3.0571525e-01 2.0420151e-01 1.1261930e-01 3.8467094e-01 1.0842893e-01 7.1134021e-02 1.1322068e-01 4.3434343e-01 1.9187026e-01 7.7276842e-02 1.3235944e-01 6.7191255e-02 3.1131980e-02 2.2486997e-01 4.8592544e-02 3.4065657e-02 1.6423565e-01 3.4189790e-01 5.1518041e-02 1.7467094e-01 2.7851812e-01 1.5638229e-01 7.8893040e-02 3.5481741e-01 5.8124982e-02 7.2492013e-02 2.1704467e-01 3.4318943e-01 1.0048537e-01
2.8723555e-01 3.2465336e-01 2.6826066e-01 1.6275716e-01 2.5250519e-01 5.6775658e-02 1.6213683e-03 2.0710736e-02 3.8333333e-01 1.0636057e-01 1.0592070e-01 1.8869342e-01 8.6604156e-02 4.8857112e-02 1.9641704e-01 4.7623697e-02 1.7474747e-03 7.8935404e-02 1.9724771e-01 7.2385059e-02 2.2411953e-01 2.7265458e-01 1.9836645e-01 1.0786964e-01 2.0425279e-01 3.3588497e-02 1.4736422e-03 3.8178694e-02 1.7228464e-01 5.1488915e-02
7.7476454e-02 7.0341562e-02 7.2904430e-02 3.4358431e-02 4.0525413e-01 1.0226366e-01 4.8289597e-02 3.8762425e-02 3.1464646e-01 4.6145746e-01 1.6078218e-02 4.8488331e-02 1.3617302e-02 2.8390095e-03 2.8544719e-01 6.2321627e-02 5.0025253e-02 1.0877060e-01 1.8317668e-01 6.5406354e-02 5.6101032e-02 9.0085288e-02 4.7263310e-02 2.2045812e-02 6.7443703e-01 9.3731505e-02 9.3290735e-02 1.5185567e-01 3.2623694e-01 2.3101141e-01
1.5093000e-01 1.7483936e-01 1.4345933e-01 7.1431601e-02 5.4861425e-01 1.8781056e-01 2.5398313e-02 6.4115308e-02 8.5000000e-01 4.1364785e-01 1.4640594e-01 2.3886139e-01 1.2038826e-01 5.1957609e-02 1.9719890e-01 6.5626220e-02 1.9356061e-02 1.5519985e-01 4.7768335e-01 1.7475091e-01 1.0992529e-01 1.4472281e-01 9.6867374e-02 4.5074715e-02 3.7198706e-01 6.9243531e-02 1.7316294e-02 8.8625430e-02 3.9266706e-01 1.6502689e-01
7.6529888e-02 3.8112952e-01 7.5115749e-02 3.3213150e-02 6.4701634e-01 2.1547758e-01 7.0290534e-02 4.6018887e-02 3.8787879e-01 3.7089301e-01 8.9335506e-02 3.7721004e-01 8.1798049e-02 2.1643712e-02 3.4731618e-01 2.2056659e-01 7.5757576e-02 1.7539307e-01 3.6145663e-01 7.4388845e-02 5.8164354e-02 4.0031983e-01 5.8020818e-02 2.1800039e-02 6.1236215e-01 1.3826392e-01 7.1892971e-02 9.5463918e-02 2.7735068e-01 1.4482487e-01
1.0374367e-01 1.4034494e-01 1.0648884e-01 4.9798515e-02 2.2190124e-01 2.0897491e-01 1.4029991e-01 1.0834990e-01 6.4696970e-01 4.1427970e-01 1.0802100e-01 4.2096888e-01 8.7216699e-02 3.1225369e-02 2.3880749e-01 2.7884760e-01 1.0888889e-01 2.9551051e-01 4.7894974e-01 1.7022512e-01 7.3995020e-02 1.9216418e-01 7.5601375e-02 3.0697011e-02 1.7955491e-01 1.3632351e-01 1.1158147e-01 1.7481100e-01 3.3845851e-01 1.9585465e-01
1.1756354e-01 3.8214406e-01 1.1277728e-01 5.3404030e-02 4.6736481e-01 1.7897675e-01 5.0890347e-02 7.4751491e-02 3.3181818e-01 4.0080034e-01 4.4758284e-02 3.6483380e-01 4.2548179e-02 1.3817758e-02 2.9938471e-01 1.1489470e-01 4.3282828e-02 1.7679485e-01 2.0977092e-01 1.1546647e-01 8.8224831e-02 5.2078891e-01 8.2773046e-02 3.5759929e-02 5.5226837e-01 1.3496522e-01 7.5175719e-02 2.2395189e-01 2.5882121e-01 2.4314574e-01
2.0488428e-01 3.1552249e-01 1.9355953e-01 1.0629905e-01 2.5963709e-01 8.4749402e-02 8.6902530e-02 1.1083499e-01 2.3030303e-01 1.4132266e-01 5.8374072e-02 1.2877917e-01 5.0605475e-02 2.1195447e-02 2.5730020e-01 5.2302701e-02 5.2095960e-02 1.6982383e-01 1.9626273e-01 4.3226511e-02 1.5652793e-01 3.1503198e-01 1.3740724e-01 6.9185018e-02 3.8189262e-01 6.2277459e-02 1.1533546e-01 2.3920962e-01 1.6459689e-01 7.4576938e-02
9.6928392e-02 2.5769361e-01 1.0365559e-01 4.5387063e-02 4.8722578e-01 3.7396479e-01 7.3336457e-01 2.1744533e-01 5.3080808e-01 6.4237574e-01 7.8182147e-02 1.8427334e-01 5.3149885e-02 2.0298918e-02 2.6637658e-01 6.2943491e-01 7.6717172e-01 6.2928585e-01 4.7965329e-01 2.9933115e-01 8.4667378e-02 2.8331557e-01 7.5153145e-02 3.4285293e-02 5.0868388e-01 3.9701759e-01 1.0000000e+00 6.0137457e-01 5.2493594e-01 4.0968123e-01
2.7445691e-01 2.2928644e-01 2.5969180e-01 1.5227996e-01 4.1238603e-01 1.0109809e-01 8.5590440e-02 1.4234592e-01 2.6767677e-01 1.3837405e-01 4.5373891e-02 1.1337518e-01 3.3642746e-02 2.1531646e-02 2.1242819e-01 2.5235077e-02 4.0025253e-02 1.6408411e-01 2.0625317e-01 3.4934981e-02 1.9672714e-01 2.0628998e-01 1.7560635e-01 9.0862171e-02 3.8585485e-01 4.2029281e-02 8.2987220e-02 2.0213058e-01 1.6124581e-01 5.9425423e-02
9.0255100e-02 1.6672303e-01 1.0365559e-01 4.2629905e-02 4.0805272e-01 4.1015889e-01 2.0164011e-01 1.4274354e-01 4.2525253e-01 8.3909014e-01 1.5017201e-01 1.0873409e-01 1.1360317e-01 3.4811486e-02 5.2680423e-01 6.8666446e-01 1.4320707e-01 3.3453306e-01 2.4663702e-01 7.2672498e-01 6.4140875e-02 9.7281450e-02 6.0510982e-02 2.4380653e-02 3.2708182e-01 2.0986504e-01 1.1453674e-01 1.6446735e-01 1.3581707e-01 3.4999344e-01
2.5221260e-01 2.3030098e-01 2.4462719e-01 1.3887593e-01 3.5289338e-01 1.5002147e-01 7.9006560e-02 1.1292247e-01 3.3333333e-01 1.9334457e-01 5.0334963e-02 1.4692362e-01 4.6317674e-02 2.4053134e-02 1.0677499e-01 1.1970138e-01 4.6111111e-02 1.5088085e-01 8.4116621e-02 4.8685102e-02 2.1985059e-01 2.9824094e-01 1.9572688e-01 1.0467460e-01 3.0661031e-01 1.5233189e-01 1.3602236e-01 2.9759450e-01 2.0756949e-01 1.3806900e-01
3.0995314e-01 4.1596212e-02 3.0488563e-01 1.7633086e-01 6.9034937e-01 2.6170174e-01 1.6112933e-01 3.2584493e-01 6.7828283e-01 3.4646167e-01 1.0812964e-01 1.4449257e-01 8.9289921e-02 4.8278103e-02 3.9728728e-01 1.9630787e-01 2.9343434e-02 1.5607123e-01 2.5099904e-01 1.8204055e-01 2.1878335e-01 1.2526652e-02 2.0394442e-01 1.0329827e-01 4.8821238e-01 1.0731438e-01 6.8202875e-02 2.5453608e-01 2.2570471e-01 1.1065197e-01
2.7824317e-01 2.8035171e-01 2.7226868e-01 1.5389183e-01 4.2168457e-01 2.3335992e-01 9.1119963e-02 1.1505964e-01 3.3232323e-01 2.1082561e-01 5.5766793e-02 1.6239392e-01 4.8108185e-02 2.5304540e-02 1.2169834e-01 1.0783489e-01 5.2297980e-02 1.5493465e-01 1.3505375e-01 6.7479237e-02 2.2447528e-01 3.4115139e-01 2.0653419e-01 1.0737810e-01 3.8123225e-01 1.8124400e-01 1.3825879e-01 2.7237113e-01 2.3930613e-01 1.5833661e-01
2.1151025e-01 3.8079134e-01 2.0744938e-01 1.0943796e-01 5.1972556e-01 2.2771609e-01 1.0756795e-01 1.1098410e-01 3.9494949e-01 4.2312553e-01 7.7349267e-02 4.0085750e-01 6.2196673e-02 3.3279915e-02 2.9428562e-01 1.1121459e-01 6.5303030e-02 1.4218602e-01 1.4462205e-01 1.0644943e-01 1.8427606e-01 5.3678038e-01 1.6992878e-01 8.3538144e-02 5.5821171e-01 1.3612946e-01 1.4017572e-01 2.1054983e-01 2.3595506e-01 2.1953299e-01
3.0096076e-01 2.0798106e-01 2.9507290e-01 1.5970308e-01 4.9805904e-01 4.1138580e-01 2.7389878e-01 3.4726640e-01 4.4545455e-01 4.0143218e-01 6.3190295e-02 1.4493458e-01 3.6658342e-02 1.1501724e-02 1.7272326e-01 2.5158470e-01 1.0050505e-01 2.6198144e-01 1.8936793e-01 1.2811105e-01 2.7036642e-01 2.9770789e-01 2.3034016e-01 1.0560853e-01 5.4434392e-01 4.3834832e-01 3.8801917e-01 5.8694158e-01 3.8675340e-01 3.0539158e-01
2.3754082e-01 2.0087927e-01 2.2914795e-01 1.2716861e-01 4.0263609e-01 1.6032759e-01 9.7258669e-02 9.2594433e-02 5.1464646e-01 2.0471778e-01 4.1861307e-02 1.9775460e-01 3.2229185e-02 1.7478586e-02 1.4467825e-01 1.1917565e-01 5.0681818e-02 1.3311233e-01 1.6657286e-01 5.9153158e-02 2.0419779e-01 3.4328358e-01 1.8611485e-01 9.4057216e-02 4.3934491e-01 1.6785517e-01 1.8107029e-01 2.6226804e-01 3.5757934e-01 1.5873016e-01
2.5457901e-01 4.0886033e-01 2.4870431e-01 1.3683987e-01 3.1678252e-01 2.3026195e-01 1.4093252e-01 1.8613320e-01 4.3939394e-01 2.9654591e-01 6.7463335e-02 2.5234264e-01 6.8133629e-02 2.6425201e-02 1.8353333e-01 1.7032175e-01 6.8257576e-02 2.4493275e-01 1.6460292e-01 1.2327433e-01 2.0988972e-01 4.9253731e-01 2.0444245e-01 9.5728470e-02 3.9113782e-01 2.1248460e-01 1.9440895e-01 4.1408935e-01 2.7735068e-01 2.4642529e-01
3.6248758e-01 1.8701387e-01 3.5920116e-01 2.1565217e-01 5.4680870e-01 3.5126679e-01 2.3350515e-01 3.5109344e-01 5.3333333e-01 2.8433024e-01 1.4484881e-01 8.3318600e-02 1.4404184e-01 6.7161252e-02 1.2900704e-01 3.1444708e-01 1.1202020e-01 3.0744459e-01 2.3059605e-01 1.3633349e-01 2.9918179e-01 1.6577825e-01 2.9378953e-01 1.5198584e-01 3.7330780e-01 2.7321943e-01 2.0798722e-01 4.8006873e-01 3.1263552e-01 1.9473960e-01
3.6154101e-01 4.8393642e-01 3.5090871e-01 2.2023330e-01 3.3501851e-01 2.0452733e-01 7.2680412e-02 1.4696819e-01 3.1565657e-01 1.8323505e-01 9.4369002e-02 1.6592999e-01 7.1714649e-02 5.0351327e-02 1.0725091e-01 1.1962628e-01 2.8308081e-02 1.6302330e-01 1.8247312e-01 6.9033899e-02 2.9099964e-01 4.5549041e-01 2.6141740e-01 1.5201042e-01 2.6632768e-01 1.4486131e-01 7.3394569e-02 2.3869416e-01 1.8864577e-01 1.1425948e-01
2.9764778e-01 1.7078120e-01 2.8297975e-01 1.7314952e-01 1.8885980e-01 9.5607631e-02 7.6405811e-02 1.3161034e-01 1.6464646e-01 6.7818029e-02 1.0653630e-01 1.7521216e-01 9.1598737e-02 5.5188850e-02 9.4095251e-02 6.1044852e-02 3.4292929e-02 2.0496306e-01 3.9511454e-02 1.8662853e-02 2.9989328e-01 2.7531983e-01 2.6938593e-01 1.5862171e-01 1.9434722e-01 9.3634485e-02 1.0782748e-01 3.4398625e-01 9.1070373e-02 4.6044864e-02
3.0616688e-01 2.9049713e-01 2.9583305e-01 1.7459173e-01 4.4750384e-01 1.9100055e-01 9.3111528e-02 1.3817097e-01 2.9191919e-01 1.5037911e-01 6.6449393e-02 2.2383310e-01 6.3233285e-02 3.4400577e-02 1.4178876e-01 9.5067143e-02 4.7272727e-02 1.7741997e-01 1.5419035e-01 3.1860205e-02 2.5506937e-01 3.7100213e-01 2.3497186e-01 1.2637633e-01 4.1425081e-01 1.4340600e-01 1.1030351e-01 2.7185567e-01 2.1939681e-01 7.2084481e-02
2.4605992e-01 2.7494082e-01 2.3495266e-01 1.3047720e-01 4.6826758e-01 1.5701491e-01 5.8341143e-02 1.4617296e-01 4.2424242e-01 3.4519798e-01 9.2196270e-02 2.5433168e-01 7.7887198e-02 3.2943717e-02 1.2645749e-01 7.1634572e-02 2.8560606e-02 2.8774389e-01 2.0146902e-01 8.6826140e-02 1.7431519e-01 2.3720682e-01 1.5802580e-01 7.6189540e-02 2.8283695e-01 6.4314890e-02 3.9776358e-02 2.0213058e-01 1.3049478e-01 1.2278630e-01
1.3280326e-01 3.4595874e-01 1.2659802e-01 6.4050901e-02 4.4930938e-01 1.0315318e-01 1.6000469e-02 3.9448310e-02 1.4646465e-01 3.9890480e-01 8.0934275e-02 3.7190594e-01 6.4788201e-02 2.4744209e-02 3.2012102e-01 9.2964220e-02 1.3404040e-02 9.9450654e-02 1.4251140e-01 1.6487017e-01 1.0636784e-01 3.8033049e-01 9.1638030e-02 4.4460283e-02 3.9906227e-01 6.5430625e-02 1.6365815e-02 8.1821306e-02 7.2738025e-02 2.2851896e-01
2.1860949e-01 1.0585052e-01 2.1111188e-01 1.1414634e-01 3.3583100e-01 1.7136985e-01 9.8313027e-02 1.6650099e-01 2.8282828e-01 3.3403538e-01 4.3454644e-02 3.9537659e-02 3.3831221e-02 1.6712801e-02 1.5093313e-01 8.2975336e-02 4.2752525e-02 1.3040349e-01 1.2140485e-01 5.7218468e-02 1.8249733e-01 1.3699360e-01 1.6210967e-01 8.0441408e-02 4.7500495e-01 1.5310805e-01 1.5351438e-01 2.9034364e-01 2.3792628e-01 2.1330185e-01
0.0000000e+00 1.2580318e-01 0.0000000e+00 0.0000000e+00 5.8111402e-01 1.7268879e-01 0.0000000e+00 0.0000000e+00 4.3939394e-01 5.9435552e-01 4.0774941e-02 2.5366867e-01 3.7506479e-02 5.6612090e-03 2.8816671e-01 6.4499655e-02 0.0000000e+00 0.0000000e+00 2.6324084e-01 1.1073339e-01 0.0000000e+00 2.0042644e-01 0.0000000e+00 0.0000000e+00 5.7604174e-01 9.0141747e-02 0.0000000e+00 0.0000000e+00 2.6946580e-01 2.5436180e-01
2.4605992e-01 3.6557322e-01 2.3101375e-01 1.3370095e-01 2.4826216e-01 6.4413226e-02 5.5834114e-02 8.7972167e-02 3.4292929e-01 1.4342881e-01 2.9295673e-02 2.6759194e-01 2.0072563e-02 1.4714287e-02 1.1445763e-01 2.8885150e-02 2.6994949e-02 1.2875545e-01 9.2699949e-02 2.2014013e-02 1.9245820e-01 5.5490405e-01 1.7017780e-01 8.9117184e-02 2.7161065e-01 5.9502673e-02 9.1453674e-02 2.5536082e-01 2.2255076e-01 9.0121999e-02
1.3701548e-01 3.2769699e-01 1.3931311e-01 6.5662778e-02 4.3215672e-01 2.3799153e-01 1.4418932e-01 1.5054672e-01 4.4696970e-01 2.7927548e-01 2.4913996e-02 1.9046146e-01 3.6328512e-02 9.2790784e-03 2.4968556e-01 1.4801574e-01 7.6489899e-02 2.1064596e-01 1.1549502e-01 9.2422923e-02 1.0067592e-01 3.9472281e-01 1.0862095e-01 4.3255997e-02 5.5953246e-01 1.9686430e-01 2.1118211e-01 3.3501718e-01 2.0835797e-01 1.9585465e-01
1.6607506e-01 3.2397700e-01 1.6322300e-01 8.1696713e-02 4.2664981e-01 2.0366849e-01 7.0173383e-02 5.9691849e-02 5.8434343e-01 3.1276327e-01 8.8176716e-02 2.5941478e-01 7.2798379e-02 3.0496939e-02 1.9995241e-01 1.4974314e-01 7.2727273e-02 1.6317484e-01 2.7041707e-01 8.8311706e-02 1.2842405e-01 3.0090618e-01 1.1858160e-01 5.3480142e-02 3.3500627e-01 1.1769557e-01 6.3793930e-02 1.1006873e-01 2.4857087e-01 1.3433032e-01
2.2050263e-01 2.9151167e-01 2.1684749e-01 1.1410392e-01 5.5583642e-01 2.5249985e-01 1.6565136e-01 1.7321074e-01 3.7424242e-01 3.2097725e-01 7.0432736e-02 2.8659830e-01 6.5871931e-02 2.5808838e-02 2.3207669e-01 1.5657764e-01 7.4368687e-02 2.6482288e-01 1.0930377e-01 1.0175089e-01 1.8534329e-01 4.5948827e-01 1.7480950e-01 8.2702517e-02 6.4472033e-01 2.3159764e-01 2.2947284e-01 4.1855670e-01 2.4462842e-01 2.3566837e-01
2.5457901e-01 2.9861346e-01 2.4338332e-01 1.3709438e-01 2.9015076e-01 1.4959205e-01 6.1925961e-02 9.5477137e-02 2.7373737e-01 2.2535805e-01 3.0418251e-03 1.1806047e-01 4.3066484e-03 4.5293408e-03 5.9285447e-02 6.1720792e-02 2.9469697e-02 1.0528509e-01 6.5120729e-02 1.5933557e-02 1.9067947e-01 4.1231343e-01 1.7505852e-01 8.8207825e-02 3.1189328e-01 1.6397435e-01 1.5471246e-01 2.9010309e-01 2.7951902e-01 1.1025843e-01
2.0630413e-01 3.9059858e-01 1.9825859e-01 1.0731707e-01 3.1560892e-01 1.4223054e-01 1.2026710e-01 9.4383698e-02 2.1565657e-01 3.2287279e-01 4.4504798e-02 1.3832656e-01 3.9579701e-02 1.7945528e-02 2.5155522e-01 1.0002403e-01 6.1691919e-02 1.2189809e-01 1.0972590e-01 5.4661913e-02 1.8071861e-01 4.5655650e-01 1.6723940e-01 8.1817735e-02 6.5198442e-01 1.8658012e-01 2.4920128e-01 2.8446735e-01 2.4916223e-01 2.1828676e-01
1.3232997e-01 2.4619547e-01 1.2929307e-01 6.2226935e-02 4.6104541e-01 1.9833139e-01 1.0154639e-01 8.8369781e-02 2.6464646e-01 4.3576243e-01 1.0555857e-01 2.3510431e-01 9.3766197e-02 3.0011319e-02 4.1258456e-01 2.0329258e-01 6.8737374e-02 1.9378670e-01 3.5076265e-01 1.2932023e-01 1.1099253e-01 2.5186567e-01 1.0593157e-01 4.4681479e-02 4.9877831e-01 1.4476429e-01 1.0383387e-01 1.8329897e-01 1.9081411e-01 1.9441165e-01
2.6735766e-01 3.7368955e-01 2.6508189e-01 1.4290562e-01 4.2159429e-01 3.1139194e-01 2.4953140e-01 2.9925447e-01 3.4090909e-01 4.3681550e-01 8.3613978e-02 3.1886492e-01 9.2069924e-02 2.5547350e-02 3.8063025e-01 2.8665846e-01 1.2881313e-01 4.3474143e-01 1.9077503e-01 1.7260893e-01 1.9210245e-01 3.5847548e-01 1.9219085e-01 8.4103421e-02 3.7991151e-01 1.9181923e-01 1.7699681e-01 3.7972509e-01 1.3029765e-01 1.9559229e-01
3.4450282e-01 3.3615150e-01 3.7343653e-01 2.0632025e-01 2.3237339e-01 6.2548310e-01 7.0360825e-01 3.8757455e-01 3.2525253e-01 5.8403538e-01 9.1001267e-02 2.4969059e-01 1.2448758e-01 4.1927687e-02 1.2186831e-01 5.4231382e-01 3.6237374e-01 4.3417314e-01 2.5015478e-01 4.1752000e-01 2.6218428e-01 3.1210021e-01 2.8183674e-01 1.2873575e-01 1.2097999e-01 3.8033006e-01 5.4177316e-01 5.1718213e-01 1.6420264e-01 3.4868162e-01
1.6702163e-01 3.5441326e-01 1.7172276e-01 8.0890774e-02 5.3778099e-01 3.4022453e-01 1.5173383e-01 1.5248509e-01 4.3535354e-01 5.8677338e-01 8.0427304e-02 3.3146216e-01 6.0500401e-02 2.4482721e-02 3.4561648e-01 2.6450266e-01 1.1593434e-01 2.9247964e-01 2.1089661e-01 2.0373672e-01 1.1490573e-01 2.8598081e-01 1.1061308e-01 4.6500197e-02 3.8849633e-01 1.7231811e-01 1.0343450e-01 2.1085911e-01 1.6124581e-01 2.3101141e-01
8.2587912e-02 2.0696652e-01 8.3269988e-02 3.7073171e-02 5.6305859e-01 1.9210478e-01 9.6813496e-02 9.5626243e-02 2.9747475e-01 5.5539174e-01 1.9916712e-02 4.9991160e-02 2.8129859e-02 4.0418530e-03 2.2259238e-01 1.4929252e-01 8.2297980e-02 1.9700701e-01 1.2942534e-01 1.0057626e-01 6.0405550e-02 2.0255864e-01 7.0073211e-02 2.4380653e-02 6.6849369e-01 2.0287957e-01 1.9616613e-01 3.6082474e-01 2.6828307e-01 3.0604749e-01
2.3422784e-01 3.9972946e-01 2.2624559e-01 1.2517497e-01 4.0669856e-01 1.8130790e-01 7.7975633e-02 9.9801193e-02 3.1717172e-01 2.5231676e-01 7.2533044e-02 1.2431489e-01 5.8568534e-02 3.3597436e-02 2.0702315e-01 1.7137321e-01 4.6338384e-02 1.4606933e-01 6.8919908e-02 1.0230366e-01 2.0419779e-01 3.7659915e-01 1.8491957e-01 9.7768384e-02 5.2057056e-01 2.0627529e-01 1.2004792e-01 2.4903780e-01 1.7208752e-01 1.9919979e-01
9.3189455e-02 2.0459926e-01 1.0331007e-01 4.3138918e-02 3.7907376e-01 3.2182075e-01 2.1703374e-01 1.1471173e-01 1.2373737e-01 4.5640270e-01 7.3040014e-02 1.3673533e-01 1.1888046e-01 1.8935446e-02 5.6555733e-01 4.9079220e-01 2.3391414e-01 4.3720402e-01 2.2454551e-01 1.6259000e-01 5.2792600e-02 1.3459488e-01 6.4395637e-02 2.0841526e-02 3.0859143e-01 1.5582463e-01 1.2332268e-01 1.3216495e-01 1.7149616e-02 1.4548078e-01
2.0961711e-01 3.7538045e-02 2.0420151e-01 1.1020148e-01 3.7103909e-01 1.4560456e-01 8.2286785e-02 1.3036779e-01 3.0656566e-01 2.3525695e-01 1.0610176e-02 2.2210926e-02 1.6303067e-02 6.9070112e-03 1.4709182e-01 9.7921110e-02 3.8232323e-02 1.2237166e-01 7.8206788e-02 4.5299393e-02 1.7395945e-01 1.0527719e-01 1.6599432e-01 7.9949862e-02 5.5226837e-01 2.0540210e-01 1.6789137e-01 3.0783505e-01 2.8602405e-01 1.9801915e-01
3.5586161e-01 3.9905309e-02 3.4890471e-01 2.1090138e-01 5.1882279e-01 2.7765168e-01 2.0716963e-01 2.8717694e-01 4.0202020e-01 2.9612468e-01 6.5688937e-02 1.0979491e-01 5.5175988e-02 3.2476774e-02 7.1557263e-02 7.8919698e-02 7.2777778e-02 2.2731578e-01 1.5784882e-01 6.6097315e-02 2.7641409e-01 1.0554371e-01 2.6091937e-01 1.3770645e-01 3.9708116e-01 1.4699576e-01 2.0447284e-01 4.1958763e-01 2.6098955e-01 1.6410862e-01
3.0238061e-01 2.2590463e-01 2.9237786e-01 1.7391304e-01 1.6719328e-01 1.6523526e-01 1.8959700e-01 1.3916501e-01 1.8282828e-01 1.7417860e-01 1.8975195e-02 1.7233911e-01 2.1957310e-02 1.4676932e-02 1.4297855e-01 2.2867786e-01 1.2517677e-01 1.9662815e-01 5.9070186e-02 1.0990423e-01 2.2518677e-01 2.8598081e-01 2.0708203e-01 1.0983582e-01 2.0689427e-01 2.1908199e-01 2.6421725e-01 3.0852234e-01 9.5209935e-02 1.3931523e-01
3.2509821e-01 2.5363544e-01 3.0854813e-01 1.8884411e-01 3.1795613e-01 1.2876511e-01 3.3270853e-02 5.6709742e-02 2.7979798e-01 1.8828981e-01 3.8747058e-02 1.0959600e-01 3.4773595e-02 2.0747182e-02 9.8106537e-02 5.1949710e-02 2.3047980e-02 9.1191514e-02 6.4557888e-02 2.8094468e-02 2.6894344e-01 3.0810235e-01 2.4846855e-01 1.3288930e-01 2.9406326e-01 1.0450078e-01 6.4816294e-02 1.7539519e-01 1.5750049e-01 1.1006166e-01
3.8425860e-01 2.2590463e-01 3.8552968e-01 2.2523860e-01 5.6305859e-01 4.9481627e-01 2.6663543e-01 4.2415507e-01 4.7525253e-01 3.0981466e-01 1.1566178e-01 1.5642680e-01 9.6075013e-02 6.1707365e-02 2.4791787e-01 2.9739838e-01 8.0909091e-02 4.2773253e-01 2.2018349e-01 1.4127386e-01 2.9099964e-01 1.6817697e-01 2.7635838e-01 1.4190916e-01 4.4528825e-01 2.5323321e-01 1.5654952e-01 4.8900344e-01 2.0205007e-01 1.4921947e-01
2.4653320e-01 1.2106865e-01 2.4386704e-01 1.3247084e-01 4.8722578e-01 2.3222502e-01 6.6893158e-02 1.4324056e-01 4.1414141e-01 3.1065712e-01 3.2228861e-02 1.0080004e-01 5.7296329e-02 1.5760238e-02 1.7200938e-01 1.6754288e-01 2.5707071e-02 1.5332449e-01 2.6366297e-01 1.1221895e-01 1.9245820e-01 1.5431770e-01 2.0404403e-01 8.8478175e-02 4.7236347e-01 2.2432110e-01 7.9193291e-02 2.8134021e-01 3.7532032e-01 2.4511347e-01
4.1312888e-01 1.4271221e-01 4.0225278e-01 2.6222694e-01 3.7907376e-01 2.3078339e-01 1.6717432e-01 2.9488072e-01 3.8181818e-01 1.5311710e-01 7.2496831e-02 1.0062323e-01 5.7249211e-02 3.9480910e-02 1.1911480e-01 9.6869649e-02 4.2373737e-02 2.4019701e-01 1.2393764e-01 4.9583351e-02 3.4044824e-01 1.9269723e-01 3.1819314e-01 1.8128195e-01 3.3764776e-01 1.6261606e-01 1.3650160e-01 4.7216495e-01 2.2826730e-01 1.0278106e-01
2.2381561e-01 2.3537369e-01 2.1373782e-01 1.1881230e-01 4.7368421e-01 1.2750751e-01 8.4161200e-02 1.2922465e-01 1.4090909e-01 1.9987363e-01 1.2217997e-01 4.7467291e-01 1.1784385e-01 5.1490667e-02 1.6538056e-01 8.6730555e-02 6.7222222e-02 2.4758477e-01 8.0317442e-02 9.7156005e-02 1.9210245e-01 3.5874200e-01 1.7804672e-01 8.8846834e-02 3.6934557e-01 7.3260180e-02 8.3546326e-02 2.3945017e-01 2.8976937e-02 1.2062180e-01
2.1056368e-01 1.9208657e-01 2.0226660e-01 1.0871686e-01 3.9505281e-01 1.5186185e-01 8.2075914e-02 1.4289264e-01 3.4040404e-01 1.8302443e-01 2.3320659e-02 1.4002829e-01 1.8187815e-02 1.0960071e-02 1.1625931e-01 9.7320275e-02 3.6212121e-02 1.6294753e-01 1.0029831e-01 2.3948703e-02 1.5617218e-01 2.6652452e-01 1.4701927e-01 6.8029886e-02 3.1585551e-01 1.3341289e-01 1.1174121e-01 2.9127148e-01 2.1900256e-01 8.2710219e-02
2.0346443e-01 1.2445046e-01 2.0185198e-01 1.0235419e-01 5.7569739e-01 2.8900067e-01 1.0859888e-01 2.3836978e-01 3.5909091e-01 2.2662174e-01 8.2165490e-02 2.1720297e-01 5.1547849e-02 3.6473801e-02 3.2488017e-01 2.4580166e-01 5.5227273e-02 3.7222959e-01 1.1141442e-01 8.8000774e-02 1.4194237e-01 9.9946695e-02 1.3008616e-01 6.1148250e-02 4.3274120e-01 1.5029446e-01 6.9241214e-02 2.9591065e-01 1.0585452e-01 8.3956448e-02
1.3048417e-01 7.6428813e-02 1.2058600e-01 6.1505832e-02 3.5993500e-01 6.6376296e-02 0.0000000e+00 0.0000000e+00 4.2575758e-01 3.0033698e-01 3.1613254e-02 3.0012376e-02 2.1721717e-02 1.0194285e-02 1.4709182e-01 2.5565536e-02 0.0000000e+00 0.0000000e+00 2.0948950e-01 8.0331108e-02 9.5695482e-02 5.5437100e-02 8.0282883e-02 3.8758356e-02 3.4491184e-01 4.3416674e-02 0.0000000e+00 0.0000000e+00 3.0356791e-01 1.7361931e-01
2.1056368e-01 2.5701725e-01 2.0641283e-01 1.0795334e-01 5.1069784e-01 2.3151954e-01 4.7586692e-02 9.2495030e-02 2.9545455e-01 3.2982308e-01 6.2574688e-02 3.4207037e-01 5.5600057e-02 2.7228342e-02 1.6830404e-01 1.1339262e-01 2.9242424e-02 1.8033719e-01 2.1019305e-01 9.0902809e-02 1.7253646e-01 3.9285714e-01 1.6061557e-01 7.8106567e-02 4.6311827e-01 1.4738384e-01 6.1565495e-02 2.2000000e-01 2.0086734e-01 1.7001181e-01
2.8013631e-01 2.1001015e-01 2.7606938e-01 1.5639449e-01 3.0820619e-01 2.3222502e-01 1.1466729e-01 1.5347913e-01 3.6262626e-01 2.6095198e-01 3.7226145e-02 9.0832744e-02 4.3914621e-02 1.8375115e-02 1.2275215e-01 1.0047466e-01 3.8131313e-02 1.4366357e-01 1.8514662e-01 3.4278568e-02 2.3301316e-01 2.6119403e-01 2.3288012e-01 1.1271136e-01 3.9642079e-01 2.2073134e-01 1.6693291e-01 3.4776632e-01 3.9109008e-01 1.7145481e-01
1.7838043e-01 1.7788299e-01 1.6909681e-01 8.9840933e-02 2.2840119e-01 9.8184160e-02 5.2741331e-02 3.9140159e-02 1.7121212e-01 1.4574558e-01 5.1059207e-02 1.9421853e-01 4.9427508e-02 2.0429662e-02 1.6432675e-01 1.1684742e-01 5.0959596e-02 1.0630801e-01 1.2421906e-01 5.0619792e-02 1.4300961e-01 2.3187633e-01 1.3636137e-01 6.2917814e-02 2.4057320e-01 9.2179177e-02 7.7915335e-02 1.1728522e-01 1.4488468e-01 8.2972583e-02
2.3280799e-01 1.6706121e-01 2.3716398e-01 1.2271474e-01 5.6486413e-01 3.3807742e-01 8.6925961e-02 1.4925447e-01 4.7222222e-01 5.9877843e-01 1.0309614e-01 6.4886846e-02 1.0667672e-01 3.4045701e-02 2.8748683e-01 3.3915643e-01 7.0429293e-02 2.1026710e-01 3.2909326e-01 2.9463262e-01 1.8569904e-01 1.1966951e-01 1.7854475e-01 7.9728667e-02 4.7038235e-01 2.1772371e-01 7.5239617e-02 2.0762887e-01 2.2905579e-01 3.1850977e-01
3.7715935e-01 3.0639161e-01 3.7350563e-01 2.3160127e-01 2.5954681e-01 2.9850929e-01 2.1204311e-01 1.7703777e-01 3.4545455e-01 3.1529065e-01 1.1243889e-01 3.4229137e-01 1.1845639e-01 6.0941580e-02 1.3859333e-01 3.4937063e-01 1.3391414e-01 2.8925933e-01 3.6131592e-01 2.9273247e-01 2.9598008e-01 3.5847548e-01 2.8233478e-01 1.5348506e-01 1.8840388e-01 2.1811179e-01 1.9968051e-01 2.8883162e-01 2.5369604e-01 2.4360488e-01
3.5302191e-01 1.8498478e-01 3.4676249e-01 2.1064687e-01 4.2493455e-01 2.5372677e-01 1.9885192e-01 2.7495030e-01 3.3535354e-01 2.2851727e-01 4.6749955e-02 8.3804809e-02 6.4222777e-02 2.6892144e-02 1.3573784e-01 1.5560129e-01 7.8636364e-02 2.8281872e-01 9.3684921e-02 5.6423863e-02 2.8175027e-01 2.0868870e-01 2.8980527e-01 1.4296599e-01 3.9906227e-01 2.3887417e-01 2.4784345e-01 5.4948454e-01 2.2195939e-01 1.4292273e-01
3.1989209e-01 2.7730808e-01 3.0633681e-01 1.8727466e-01 2.4203304e-01 1.3612662e-01 6.7502343e-02 6.6053678e-02 2.0858586e-01 1.2299916e-01 5.0153902e-02 8.7782885e-02 3.8448853e-02 2.7396442e-02 3.8243193e-02 1.0265269e-01 4.4949495e-02 1.1039970e-01 7.6096133e-02 3.7353344e-02 2.6360726e-01 2.7825160e-01 2.3297973e-01 1.3288930e-01 1.7130027e-01 1.5048850e-01 1.2492013e-01 2.0683849e-01 1.5474078e-01 9.9042372e-02
2.8486914e-01 3.7436591e-01 2.7447999e-01 1.5944857e-01 5.4951702e-01 1.7333292e-01 7.3477038e-02 1.3146123e-01 7.4747475e-01 2.2978096e-01 1.1178707e-01 2.1256188e-01 9.9703152e-02 5.2256452e-02 1.8030391e-01 6.8855709e-02 4.9217172e-02 2.1841258e-01 3.0432825e-01 2.2048561e-02 2.2162931e-01 3.2222814e-01 2.0125504e-01 1.0605092e-01 3.8651522e-01 8.0730758e-02 6.4792332e-02 2.1635739e-01 3.2150601e-01 6.1065197e-02
5.8592456e-02 3.7166047e-01 6.5510331e-02 2.5620361e-02 3.7392796e-01 3.4083799e-01 3.0951265e-01 1.0775348e-01 5.8686869e-01 6.8765796e-01 2.9694007e-02 3.5400460e-01 2.2899684e-02 6.3653581e-03 3.6431315e-01 3.8985189e-01 1.9578283e-01 1.9359727e-01 2.1399223e-01 3.7606235e-01 4.1337602e-02 4.7174840e-01 3.8199114e-02 1.5876917e-02 6.0641881e-01 3.9168146e-01 4.2979233e-01 2.7075601e-01 3.4634339e-01 6.1366916e-01
1.3015287e-01 1.9039567e-01 1.3813835e-01 6.6468717e-02 4.9264241e-01 4.3101650e-01 9.6251172e-01 3.9050696e-01 7.5151515e-01 9.0564448e-01 2.5819301e-01 5.0914958e-01 1.5624558e-01 8.0403737e-02 3.1468199e-01 7.0303722e-01 1.0000000e+00 1.0000000e+00 3.8805088e-01 1.0000000e+00 1.0992529e-01 1.9909382e-01 1.0274416e-01 4.7999410e-02 3.8321337e-01 2.4246393e-01 6.5623003e-01 5.3986254e-01 3.0415927e-01 4.6477765e-01
1.9731175e-01 1.1396686e-01 1.8713289e-01 1.0112407e-01 4.0543468e-01 9.7386663e-02 4.6438613e-02 8.8767396e-02 3.8888889e-01 2.3357203e-01 4.1137063e-02 9.3109088e-02 3.1663761e-02 1.6208503e-02 2.4835979e-01 5.0567789e-02 3.0202020e-02 1.5593862e-01 2.2510835e-01 2.5019692e-02 1.4443259e-01 1.1407249e-01 1.2869167e-01 6.2819505e-02 4.1557155e-01 6.0560196e-02 5.6837061e-02 1.8920962e-01 2.5507589e-01 8.3169356e-02
2.9196838e-01 1.9039567e-01 2.8691866e-01 1.6772004e-01 3.7203214e-01 2.0121465e-01 2.1773664e-01 1.7311133e-01 3.8484848e-01 2.5505476e-01 5.7758465e-02 9.5584335e-02 5.0040051e-02 2.9861897e-02 2.3357242e-01 1.3457206e-01 7.6944444e-02 1.8064027e-01 2.7871897e-01 8.9279051e-02 2.4332978e-01 2.2601279e-01 2.3537029e-01 1.2094475e-01 5.0604240e-01 1.9240135e-01 2.4033546e-01 3.3408935e-01 4.5022669e-01 2.0523416e-01
2.4937290e-01 2.7832262e-01 2.3826964e-01 1.3437964e-01 3.0612982e-01 1.4542053e-01 9.1026242e-02 1.1585487e-01 4.5959596e-01 2.5947767e-01 3.9290241e-02 1.3748674e-01 3.4255289e-02 1.8132305e-02 1.2934698e-01 1.0039956e-01 5.0353535e-02 1.5010419e-01 1.4222998e-01 5.4903749e-02 2.0135183e-01 3.5181237e-01 1.8023806e-01 9.3147857e-02 3.3368553e-01 1.4699576e-01 1.5519169e-01 2.8216495e-01 3.0514488e-01 1.7237308e-01
4.6660987e-01 3.2972607e-01 4.4647917e-01 3.1249205e-01 1.9698474e-01 1.6210662e-01 1.2066542e-01 1.3772366e-01 3.9595960e-01 5.7287279e-02 1.3304364e-01 3.7566301e-01 1.2825708e-01 7.4352164e-02 5.8809532e-02 1.8293929e-01 7.7171717e-02 2.1026710e-01 1.0297180e-01 2.1564888e-02 3.6606190e-01 4.2777186e-01 3.4807510e-01 2.0812033e-01 1.0942350e-01 1.3942816e-01 1.5031949e-01 2.8989691e-01 1.8963138e-01 3.0696576e-02
2.4038052e-01 1.0246872e-01 2.2838781e-01 1.2941676e-01 3.6544191e-01 1.0131280e-01 4.6204311e-02 9.7564612e-02 2.6767677e-01 1.9187026e-01 2.5602028e-02 8.1395863e-02 1.9507138e-02 1.2043377e-02 1.2968692e-01 5.6606183e-02 2.1065657e-02 1.1882932e-01 9.5232735e-02 5.6492959e-02 1.8534329e-01 1.7030917e-01 1.6768763e-01 8.5430594e-02 3.7198706e-01 9.3052362e-02 6.8977636e-02 2.4140893e-01 1.8706880e-01 1.5702479e-01
1.8547967e-01 1.0990869e-01 1.7206827e-01 9.4718982e-02 2.0330414e-01 5.4597877e-02 7.2399250e-03 3.2743539e-02 1.9292929e-01 1.5732940e-01 6.1669383e-02 8.8666902e-02 4.9521745e-02 2.1923877e-02 1.5055920e-01 2.9155526e-02 4.6338384e-03 6.7740102e-02 1.1943491e-01 6.1156945e-02 1.5759516e-01 1.6471215e-01 1.3775586e-01 6.9996068e-02 3.0330846e-01 5.3991908e-02 1.4808307e-02 1.3584192e-01 2.3122413e-01 1.4305392e-01
2.2570874e-01 3.5407508e-01 2.2327413e-01 1.1720042e-01 5.0798953e-01 2.9053432e-01 1.6033271e-01 1.8578529e-01 4.7121212e-01 3.0686605e-01 1.4133623e-01 2.9455446e-01 1.4931913e-01 5.8905711e-02 2.6243329e-01 1.6371256e-01 1.0522727e-01 2.1822315e-01 3.6708505e-01 1.4393405e-01 1.9174671e-01 3.7819829e-01 1.9174262e-01 8.8158671e-02 4.2679786e-01 1.5708589e-01 1.5623003e-01 2.7178694e-01 3.1598660e-01 1.6286239e-01
2.5363245e-01 4.2306392e-01 2.4918803e-01 1.3616119e-01 4.3847612e-01 2.5188639e-01 1.2582006e-01 1.4025845e-01 2.4797980e-01 3.7173547e-01 6.6413181e-02 2.8637730e-01 5.6448193e-02 2.7545863e-02 3.2725975e-01 2.2154294e-01 7.8914141e-02 2.1500284e-01 1.5348680e-01 1.5384934e-01 2.0099609e-01 4.4402985e-01 1.8402311e-01 9.0395203e-02 4.8887275e-01 2.0035704e-01 1.3482428e-01 2.8158076e-01 1.3857678e-01 2.3468451e-01
3.7810592e-01 3.3987149e-01 3.5733536e-01 2.3189820e-01 2.8509524e-01 1.0471750e-01 4.5618557e-02 9.6371769e-02 2.2979798e-01 5.6866049e-02 2.6253848e-02 1.5576379e-01 2.4925788e-02 1.8375115e-02 6.5302376e-02 4.3042329e-02 2.0878788e-02 1.2184126e-01 1.5981877e-01 2.1599436e-02 2.8637496e-01 3.6780384e-01 2.5842920e-01 1.4670173e-01 2.2010170e-01 7.0495096e-02 6.1900958e-02 1.9773196e-01 2.1308890e-01 3.8108356e-02
1.8074684e-01 0.0000000e+00 1.7262110e-01 9.0816543e-02 3.9099034e-01 1.1649592e-01 5.9301781e-02 8.4393638e-02 1.6212121e-01 2.9570345e-01 2.2198081e-02 1.0210396e-02 1.7386797e-02 8.7374252e-03 2.0722711e-01 5.6808964e-02 2.7752525e-02 1.0123129e-01 6.5542860e-02 4.2328262e-02 1.3055852e-01 0.0000000e+00 1.1579262e-01 5.6232796e-02 4.7830681e-01 9.5477874e-02 8.3626198e-02 1.5817869e-01 1.0348906e-01 1.4397219e-01
3.7810592e-01 2.4484275e-01 3.6231083e-01 2.3007423e-01 4.1455268e-01 1.8241212e-01 6.0965323e-02 1.8792247e-01 3.6363636e-01 1.3774221e-01 5.7867101e-02 1.8935644e-01 5.3526834e-02 3.2644874e-02 1.1445763e-01 8.5979512e-02 1.8373737e-02 1.7186967e-01 7.9051050e-02 2.8025372e-02 2.9099964e-01 2.9264392e-01 2.6988396e-01 1.4955269e-01 3.3302516e-01 1.3234566e-01 5.3099042e-02 2.9158076e-01 1.6538537e-01 6.0606061e-02
2.5268588e-01 9.0632398e-02 2.4227766e-01 1.3599152e-01 4.5292047e-01 1.5468376e-01 9.3416120e-02 1.8389662e-01 4.5404040e-01 2.0197978e-01 4.5084193e-02 6.7494696e-02 4.3019366e-02 1.9850653e-02 2.1524969e-01 7.1709676e-02 4.2500000e-02 2.3508240e-01 1.5981877e-01 4.6750411e-02 1.9815012e-01 9.6481876e-02 1.8208078e-01 8.9436689e-02 4.4462788e-01 9.6351059e-02 9.9201278e-02 3.2271478e-01 2.4876799e-01 8.3103765e-02
1.9399877e-01 1.6909029e-01 1.8257204e-01 9.7221633e-02 4.3305949e-01 1.1671063e-01 5.5365511e-02 1.2837972e-01 2.5555556e-01 3.5235889e-01 3.4691291e-02 3.1930693e-01 2.9213589e-02 2.2932473e-02 4.5031784e-01 1.4238291e-01 3.6691919e-02 2.9986740e-01 3.2276130e-01 1.3439879e-01 1.2166489e-01 1.2793177e-01 1.0757508e-01 5.1931773e-02 3.3302516e-01 5.3467998e-02 3.1453674e-02 1.4797251e-01 6.6430120e-02 1.1865407e-01
1.7412088e-01 1.8397024e-01 1.6377583e-01 8.7423118e-02 3.1858807e-01 7.2510889e-02 0.0000000e+00 0.0000000e+00 4.3838384e-01 2.0619208e-01 7.9449575e-02 3.4582744e-01 6.5871931e-02 2.8349004e-02 2.3795764e-01 5.9467660e-02 0.0000000e+00 0.0000000e+00 3.4851128e-01 3.7035502e-03 1.2842405e-01 1.9136461e-01 1.1350167e-01 5.4831891e-02 2.4057320e-01 3.9409727e-02 0.0000000e+00 0.0000000e+00 2.2570471e-01 4.3290043e-02
7.9984855e-02 1.6029760e-01 7.3457259e-02 3.5503712e-02 3.4982396e-01 7.1713392e-02 0.0000000e+00 0.0000000e+00 3.3434343e-01 3.6394271e-01 3.9435090e-02 9.4390912e-02 3.1946473e-02 8.5132929e-03 2.5356087e-01 4.3222579e-02 0.0000000e+00 0.0000000e+00 2.7055778e-01 8.6515208e-02 4.7385272e-02 1.3379531e-01 3.9593605e-02 1.8187180e-02 2.9736512e-01 4.1990473e-02 0.0000000e+00 0.0000000e+00 2.0244431e-01 1.5374524e-01
1.3834067e-01 2.8238079e-01 1.4380485e-01 6.7401909e-02 4.0046944e-01 3.3746396e-01 3.0623243e-01 1.8469185e-01 3.0757576e-01 6.5711879e-01 1.1573420e-01 4.2008487e-01 1.1190689e-01 3.8621736e-02 3.7893055e-01 6.4460600e-01 3.0227273e-01 4.6599735e-01 4.3504812e-01 5.8818733e-01 1.1846318e-01 3.2969083e-01 1.1285423e-01 5.0383405e-02 3.8915671e-01 2.5973358e-01 2.7843450e-01 3.4054983e-01 2.0678100e-01 4.0115440e-01
2.8534242e-01 4.2306392e-01 2.6411444e-01 1.6241782e-01 8.9193825e-02 0.0000000e+00 3.7371134e-03 9.2047714e-03 1.6919192e-01 5.0126369e-02 2.2306717e-02 1.7278112e-01 1.6208830e-02 1.4079246e-02 5.7959683e-02 0.0000000e+00 4.0277778e-03 3.5082402e-02 1.1605786e-01 2.5392811e-03 2.1593739e-01 4.5309168e-01 1.8810698e-01 1.0410932e-01 6.6565410e-02 6.8205412e-03 6.3714058e-03 3.1817869e-02 1.4389907e-01 2.2235340e-02
2.7587676e-01 1.1329050e-01 2.5913897e-01 1.5495228e-01 3.1380338e-01 5.6315563e-02 2.1539363e-02 6.6103380e-02 2.0505051e-01 2.3946925e-01 6.4240449e-02 1.3916637e-01 4.8108185e-02 2.7994128e-02 2.3187273e-01 3.0882927e-02 1.5606061e-02 1.4032961e-01 3.8948613e-02 8.4856902e-02 2.0277481e-01 1.1007463e-01 1.8073609e-01 9.4745379e-02 2.9736512e-01 2.6350768e-02 2.2028754e-02 1.3711340e-01 4.2972600e-02 1.1904762e-01
2.0961711e-01 1.7619209e-01 2.0551448e-01 1.0965005e-01 3.4269206e-01 1.9069382e-01 1.4482193e-01 1.1734592e-01 5.4040404e-02 2.5716091e-01 8.0717002e-02 1.6526697e-01 5.3950902e-02 2.9824542e-02 1.9182785e-01 2.6307568e-01 1.4936869e-01 3.2430385e-01 1.9372995e-01 1.3436425e-01 1.5795091e-01 1.5138593e-01 1.4298521e-01 6.9307904e-02 2.7028990e-01 1.2972611e-01 1.3162939e-01 2.1635739e-01 4.8492017e-02 1.2613144e-01
1.4667045e-01 1.8261752e-01 1.3800014e-01 7.3806999e-02 3.6146971e-01 8.4565364e-02 3.7417994e-03 1.1948310e-02 3.2474747e-01 2.2156698e-01 1.1334420e-01 2.0062765e-01 9.0609245e-02 3.6660578e-02 4.3094129e-01 7.3211764e-02 4.0328283e-03 4.5538928e-02 2.4621489e-01 8.8968119e-02 1.4016364e-01 2.4413646e-01 1.2440859e-01 6.1885568e-02 5.3443835e-01 7.2386995e-02 5.5271565e-03 3.5807560e-02 2.6966292e-01 1.4384101e-01
2.2381561e-01 2.5295908e-01 2.1346141e-01 1.1741251e-01 4.0724023e-01 1.2891847e-01 8.9245548e-02 1.6098410e-01 2.3030303e-01 2.3146588e-01 4.8379504e-02 8.9573020e-02 4.6411912e-02 2.0653794e-02 1.7649658e-01 4.8457356e-02 4.9949495e-02 2.2447433e-01 1.5601959e-01 2.6816191e-02 1.8071861e-01 2.4973348e-01 1.6938095e-01 8.2653362e-02 4.0368487e-01 7.4424426e-02 1.2148562e-01 3.7766323e-01 1.9850187e-01 1.0448642e-01
2.2854844e-01 2.5972269e-01 2.1753853e-01 1.2106045e-01 4.3396226e-01 1.1115882e-01 5.5131209e-02 7.7186879e-02 3.3232323e-01 1.6512216e-01 2.6941879e-02 3.4604844e-01 1.1968148e-02 1.4322056e-02 2.0797498e-01 4.8998107e-02 3.9292929e-02 1.1820421e-01 3.3078179e-01 3.7767920e-02 1.6506581e-01 3.8539446e-01 1.4522636e-01 7.4788635e-02 4.2547712e-01 7.0543606e-02 7.0311502e-02 1.4797251e-01 3.2229450e-01 7.0313525e-02
2.5173932e-01 2.0933378e-01 2.4213945e-01 1.3582185e-01 2.5431073e-01 1.6302681e-01 9.0065604e-02 8.2206759e-02 3.0656566e-01 1.0067397e-01 4.5880862e-02 1.0504332e-01 4.3820384e-02 2.1512968e-02 1.4559608e-01 1.4921741e-01 5.3459596e-02 1.2186020e-01 1.7403051e-01 2.8681785e-02 1.9281395e-01 2.0175906e-01 1.8048708e-01 8.8846834e-02 2.5378062e-01 1.3360693e-01 1.1365815e-01 1.6546392e-01 1.8076089e-01 5.2603962e-02
2.7398362e-01 3.9567129e-01 2.6418354e-01 1.5435843e-01 3.1470615e-01 1.4302804e-01 7.2914714e-02 1.4234592e-01 3.2020202e-01 2.7190396e-01 2.2437081e-01 3.0670969e-01 2.0548462e-01 8.7501261e-02 9.7154706e-02 1.1752336e-01 5.4949495e-02 3.3282819e-01 3.6370800e-01 1.7205616e-01 2.0704376e-01 3.0597015e-01 1.9239006e-01 9.6908179e-02 1.4997028e-01 6.0628111e-02 4.1421725e-02 1.6402062e-01 1.2103292e-01 8.9662862e-02
1.2963226e-01 2.8779168e-01 1.1706171e-01 6.1336161e-02 1.5229755e-01 1.2453224e-02 0.0000000e+00 0.0000000e+00 2.9949495e-01 3.0560236e-01 8.7778381e-02 1.0000000e+00 6.9405833e-02 2.7807351e-02 0.0000000e+00 3.3676811e-02 0.0000000e+00 0.0000000e+00 4.2365059e-01 2.7403507e-02 7.2500889e-02 2.3480810e-01 5.8967080e-02 2.9148643e-02 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 6.7809974e-02 6.9198478e-02
2.8060959e-01 2.2387555e-01 2.6770783e-01 1.5817603e-01 2.4176221e-01 1.0514692e-01 9.0745080e-02 1.1814115e-01 3.8838384e-01 1.4132266e-01 2.9947492e-02 1.2119873e-01 3.4679357e-02 1.6712801e-02 1.2186831e-01 1.0227717e-01 5.8611111e-02 1.5949991e-01 1.4982833e-01 4.3433799e-02 2.1166845e-01 2.6599147e-01 2.0120524e-01 1.0209398e-01 2.5444100e-01 1.1963598e-01 1.4089457e-01 2.8298969e-01 2.8760103e-01 9.4778958e-02
2.4842633e-01 3.3310788e-01 2.4013544e-01 1.3467656e-01 3.9026812e-01 1.8860806e-01 9.8102156e-02 2.0412525e-01 4.6414141e-01 2.1419545e-01 8.7597320e-02 2.1344590e-01 7.3081091e-02 3.8173471e-02 1.9719890e-01 1.1669721e-01 3.5378788e-02 2.1594999e-01 1.0057973e-01 8.4407777e-02 2.3159018e-01 4.3550107e-01 2.0787888e-01 1.1138419e-01 4.7368421e-01 1.7163897e-01 1.0998403e-01 3.7113402e-01 2.1742559e-01 1.7512790e-01
2.5978513e-01 3.0064254e-01 2.5775689e-01 1.4354189e-01 4.2448316e-01 2.6507576e-01 1.8755858e-01 1.8991054e-01 4.3686869e-01 2.9001685e-01 1.0305993e-01 1.5112270e-01 8.1986524e-02 4.3870168e-02 1.7812829e-01 1.2661099e-01 6.8207071e-02 1.9643872e-01 1.3983790e-01 9.2975692e-02 2.5044468e-01 3.3635394e-01 2.2730216e-01 1.2109221e-01 4.7170310e-01 2.0423786e-01 2.1333866e-01 3.4879725e-01 2.8562980e-01 2.1290830e-01
1.3701548e-01 2.5566452e-01 1.3219543e-01 6.4432662e-02 5.0798953e-01 1.6238268e-01 4.1143393e-02 9.7017893e-02 4.4141414e-01 2.7148273e-01 3.7008872e-02 2.1698197e-01 3.5810206e-02 1.0325029e-02 2.7215556e-01 7.6891880e-02 2.0138889e-02 1.4258382e-01 2.0006191e-01 5.4489173e-02 8.8580576e-02 2.9850746e-01 8.3022063e-02 3.5981125e-02 4.6443901e-01 9.4507669e-02 4.9624601e-02 1.9202749e-01 2.8070175e-01 1.2304867e-01
2.9007525e-01 4.3388569e-01 2.9873540e-01 1.6369035e-01 4.2944841e-01 3.9543586e-01 2.0395970e-01 2.5357853e-01 3.9898990e-01 4.8736310e-01 2.9549158e-02 1.2422649e-01 3.4585120e-02 1.5480073e-02 1.2027059e-01 2.1147896e-01 6.3787879e-02 1.5730252e-01 2.4283785e-01 1.1411909e-01 2.3550338e-01 4.5682303e-01 2.4438468e-01 1.1160539e-01 4.2085452e-01 4.0060735e-01 2.5255591e-01 3.8694158e-01 5.0522373e-01 3.4474616e-01
3.9230442e-01 1.0821779e-01 3.7578605e-01 2.4687169e-01 2.6351900e-01 1.3164837e-01 1.3805061e-01 1.5690855e-01 1.5101010e-01 1.1162595e-01 3.6900235e-02 5.7461103e-04 3.6187155e-02 2.4650821e-02 8.7636401e-02 7.5915523e-02 4.6489899e-02 1.3966660e-01 2.3315698e-02 2.6297970e-02 3.3617930e-01 1.0394456e-01 3.1520494e-01 1.8371510e-01 3.3698739e-01 1.8560992e-01 2.3658147e-01 3.5567010e-01 1.4882712e-01 1.2921422e-01
2.2996829e-01 3.1214068e-01 2.1919701e-01 1.2067869e-01 3.2571996e-01 1.5219925e-01 6.2535145e-02 6.9234592e-02 2.3888889e-01 2.2346251e-01 4.0086909e-02 1.1160714e-01 3.2370541e-02 1.9271645e-02 1.2931298e-01 1.1279178e-01 5.1641414e-02 1.2780830e-01 1.1647999e-01 7.0035792e-02 1.9103522e-01 3.4568230e-01 1.7336521e-01 8.8748525e-02 3.7528891e-01 1.5592165e-01 1.1749201e-01 2.3756014e-01 1.9120836e-01 1.6325594e-01
2.3233471e-01 2.9218803e-01 2.3170479e-01 1.2246023e-01 3.7013632e-01 2.9452181e-01 1.5548266e-01 1.5616302e-01 4.5808081e-01 2.7759056e-01 6.6920152e-02 2.6582390e-01 6.2667860e-02 2.7377764e-02 2.4336268e-01 2.9792411e-01 1.5015152e-01 3.3813222e-01 2.8209602e-01 1.3405331e-01 1.8925649e-01 4.0191898e-01 1.7824593e-01 8.5037357e-02 4.5783530e-01 2.6904755e-01 2.2412141e-01 3.9106529e-01 3.6112754e-01 1.8765578e-01
1.5234985e-01 2.6276632e-01 1.4691452e-01 7.5376458e-02 2.5196353e-01 1.2174100e-01 1.3528585e-01 5.3230616e-02 4.5656566e-01 2.7780118e-01 8.8792323e-02 3.4516443e-01 9.3766197e-02 2.9861897e-02 1.0086005e-01 2.1741220e-01 1.4580808e-01 2.0287933e-01 2.4931052e-01 1.2845653e-01 1.2628958e-01 3.3182303e-01 1.2445839e-01 5.3701337e-02 1.5914944e-01 1.0906074e-01 1.5375399e-01 1.2271478e-01 2.5684999e-01 1.5118720e-01
3.1563254e-01 1.1667230e-01 3.0467832e-01 1.8044539e-01 3.9568475e-01 2.0774799e-01 9.1096532e-02 1.2738569e-01 1.5151515e-01 2.8390901e-01 3.5741445e-02 1.6221711e-02 2.9873251e-02 1.9794620e-02 8.2265357e-02 1.1038844e-01 4.1717172e-02 1.2614131e-01 8.2005966e-02 6.3575308e-02 2.6360726e-01 1.1540512e-01 2.4553016e-01 1.2804758e-01 3.9576042e-01 2.1355182e-01 1.4049521e-01 2.7683849e-01 1.6065445e-01 2.1080939e-01
3.1137299e-01 1.4169767e-01 3.0958469e-01 1.7722163e-01 4.7368421e-01 3.0617754e-01 1.8416120e-01 2.2122266e-01 4.5555556e-01 2.7527380e-01 5.2652544e-02 3.0476485e-02 5.9086840e-02 2.6574623e-02 1.4066696e-01 1.5687806e-01 6.4242424e-02 1.5836333e-01 1.4828052e-01 6.9897600e-02 2.5080043e-01 1.3619403e-01 2.5245281e-01 1.2323044e-01 4.3868454e-01 2.3528442e-01 2.0583067e-01 3.1237113e-01 2.9568303e-01 1.7532468e-01
1.5140328e-01 2.6445722e-01 1.4739824e-01 7.1940615e-02 4.8271193e-01 2.0133734e-01 4.1424555e-02 9.5178926e-02 4.2929293e-01 4.0269587e-01 4.8958899e-02 1.8935644e-01 4.1652924e-02 1.5405362e-02 2.1028657e-01 8.8232643e-02 2.1550505e-02 1.4442129e-01 2.6014521e-01 9.9021599e-02 1.1526147e-01 2.8837953e-01 1.0722646e-01 4.6795124e-02 4.5849567e-01 1.1323263e-01 5.2492013e-02 1.9158076e-01 2.9371181e-01 2.1599108e-01
2.9764778e-01 2.4721001e-01 2.8166678e-01 1.7090138e-01 2.8726189e-01 9.3736581e-02 8.3270853e-02 1.2206759e-01 2.2020202e-01 1.4279697e-01 6.5616513e-02 1.1724275e-01 6.0641757e-02 3.3391981e-02 1.4681987e-01 6.6001742e-02 5.7045455e-02 1.7156658e-01 9.7624810e-02 5.5318326e-02 2.5649235e-01 3.0863539e-01 2.4119727e-01 1.2868659e-01 3.7264743e-01 1.0071698e-01 1.4265176e-01 3.3257732e-01 1.8549182e-01 1.3898728e-01
3.4828908e-01 1.2715590e-01 3.3667335e-01 2.1111347e-01 4.1915681e-01 1.7440648e-01 1.3411434e-01 2.2877734e-01 5.1262626e-01 9.5197978e-02 1.4865110e-01 9.9871818e-02 1.4163879e-01 7.7490017e-02 1.8275147e-01 9.0335566e-02 5.9595960e-02 2.4360674e-01 2.0794169e-01 1.9630198e-02 3.1447883e-01 1.3006397e-01 2.9876986e-01 1.6909162e-01 3.8651522e-01 1.2147937e-01 1.3035144e-01 3.7353952e-01 2.9509166e-01 3.7255674e-02
1.6370865e-01 1.9445384e-01 1.5776380e-01 7.8939555e-02 4.7548975e-01 1.7741243e-01 1.5564667e-02 6.0437376e-02 3.6767677e-01 3.0623420e-01 2.8897338e-02 1.1989480e-01 2.1250530e-02 9.4471776e-03 1.6317096e-01 4.3628143e-02 7.1136364e-03 9.4184505e-02 1.0043902e-01 6.6546439e-02 1.2771256e-01 2.0735608e-01 1.1484636e-01 5.1661424e-02 4.1557155e-01 8.5387742e-02 2.1078275e-02 1.5340206e-01 2.0697812e-01 1.8135904e-01
3.7952577e-01 1.9614474e-01 3.7081059e-01 2.2948038e-01 2.8058138e-01 2.7673149e-01 1.5241331e-01 1.8787276e-01 4.1464646e-01 1.9187026e-01 4.3563281e-02 3.0144979e-02 7.1573293e-02 2.4426688e-02 8.1789441e-02 2.2394629e-01 9.2020202e-02 2.1879144e-01 8.4820172e-02 7.9778340e-02 3.0167200e-01 1.9429638e-01 3.1769510e-01 1.5311640e-01 2.8019547e-01 3.2541646e-01 2.7172524e-01 4.7388316e-01 2.7380248e-01 1.8745901e-01
2.6688438e-01 4.8224552e-01 2.5955359e-01 1.4969247e-01 2.3833168e-01 1.7149255e-01 1.2741331e-01 1.0119284e-01 2.2929293e-01 2.1545914e-01 4.8307079e-02 1.5598479e-01 3.2417660e-02 2.1867844e-02 1.1748309e-01 1.5537597e-01 7.6161616e-02 1.6463345e-01 8.1161704e-02 8.6791592e-02 2.2305229e-01 5.1412580e-01 2.0050799e-01 1.0784506e-01 3.4028924e-01 3.0863191e-01 3.1238019e-01 4.0549828e-01 2.4857087e-01 2.6767677e-01
2.0535757e-01 5.8741968e-01 1.9328312e-01 1.0697773e-01 1.4624898e-01 5.7511809e-02 3.8261481e-02 1.5531809e-02 4.0858586e-01 1.3310868e-01 3.4401593e-03 1.1768476e-01 1.4229845e-02 3.3675882e-03 6.5948261e-02 1.0678343e-01 4.1237374e-02 5.9196818e-02 1.0536388e-01 3.9978995e-02 1.4763429e-01 5.7915778e-01 1.4647144e-01 6.5645891e-02 1.3775342e-01 1.1245646e-01 8.6980831e-02 7.1580756e-02 2.5310467e-01 1.0383051e-01
2.0062473e-01 8.1501522e-01 1.8658006e-01 1.0320255e-01 2.2722759e-01 5.0180970e-02 1.1637769e-02 3.1978131e-02 3.9646465e-01 1.7523168e-01 4.0702517e-02 2.8438826e-01 3.4490883e-02 1.6171147e-02 8.9947989e-02 3.4255115e-02 8.1388889e-03 6.4766054e-02 1.5869308e-01 5.6631151e-02 1.5759516e-01 7.9317697e-01 1.3959859e-01 7.0217263e-02 1.8998877e-01 4.0321720e-02 1.8514377e-02 1.0316151e-01 2.6532624e-01 1.1826053e-01
1.2239103e-01 2.0967196e-01 1.1346832e-01 5.7730647e-02 2.8897716e-01 6.5916201e-02 3.8706654e-02 8.2852883e-02 2.4797980e-01 2.9633530e-01 3.7552055e-02 1.0384989e-01 2.1580361e-02 1.0904038e-02 3.3745793e-01 6.1195061e-02 2.9949495e-02 1.8228831e-01 2.2440480e-01 9.1386482e-02 9.1782284e-02 1.9029851e-01 7.6348424e-02 3.7037947e-02 5.2321205e-01 6.5838112e-02 5.7196486e-02 2.4817869e-01 2.3496945e-01 1.7539027e-01
3.3361730e-01 3.9026040e-01 3.1787713e-01 1.9507953e-01 3.4368511e-01 1.5357953e-01 3.4254920e-02 9.4234592e-02 2.3080808e-01 1.7670598e-01 5.3376788e-02 2.5256365e-01 4.2878010e-02 2.8517103e-02 1.9294965e-01 8.6955869e-02 1.8439394e-02 1.9018754e-01 6.6809253e-02 7.0139436e-02 2.6325151e-01 4.8667377e-01 2.3835848e-01 1.3033327e-01 3.7991151e-01 1.2031512e-01 4.9768371e-02 2.7364261e-01 1.3029765e-01 1.3859373e-01
3.4260968e-01 6.1345959e-01 3.3694976e-01 2.0377519e-01 2.6722037e-01 2.5924790e-01 2.5843486e-01 2.1908549e-01 1.4242424e-01 2.3862679e-01 8.1079124e-02 4.3400813e-01 6.3515997e-02 4.3253804e-02 1.5616820e-01 1.9675849e-01 9.7222222e-02 1.9151354e-01 5.5833849e-02 9.3079336e-02 2.7819281e-01 7.6012793e-01 2.5942527e-01 1.4225324e-01 2.4387506e-01 2.0889484e-01 2.4472843e-01 2.8243986e-01 6.4064656e-02 1.5033451e-01
3.1515926e-01 1.9918837e-01 3.0122314e-01 1.8316013e-01 3.7555295e-01 1.4391755e-01 1.1023899e-01 1.8543738e-01 3.3181818e-01 1.3984836e-01 7.7023357e-02 6.6522277e-02 5.8380059e-02 3.8080082e-02 1.6170922e-01 7.6816775e-02 4.5707071e-02 2.0894109e-01 1.5616030e-01 3.1065600e-02 2.4617574e-01 1.8736674e-01 2.1764032e-01 1.2244396e-01 3.7396817e-01 9.8776571e-02 1.2244409e-01 3.1690722e-01 1.9022275e-01 6.5984521e-02
2.5741871e-01 1.8025025e-01 2.4061917e-01 1.4125133e-01 2.4040805e-01 4.4629164e-02 2.4671978e-02 5.5069583e-02 2.4545455e-01 1.5964617e-01 1.3760637e-03 6.9461634e-02 0.0000000e+00 4.1165638e-03 5.2758609e-02 2.0112957e-02 1.6396465e-02 7.1263497e-02 1.3111386e-01 1.6071749e-02 1.8747777e-01 2.2254797e-01 1.6654216e-01 8.8035785e-02 2.1481873e-01 4.8966247e-02 4.9864217e-02 1.3924399e-01 2.6335502e-01 8.3890857e-02
2.0441100e-01 2.8677714e-01 2.0827863e-01 1.0430541e-01 3.9080979e-01 3.4697258e-01 3.6269916e-01 1.4184891e-01 5.0202020e-01 5.6297388e-01 4.7546623e-02 2.8328324e-01 7.5955331e-02 1.7908173e-02 1.6827005e-01 4.2725388e-01 2.2424242e-01 2.4891078e-01 1.6980920e-01 2.6879068e-01 1.6542156e-01 4.2484009e-01 1.8302704e-01 7.0708808e-02 4.1953378e-01 4.4387849e-01 5.9392971e-01 4.1855670e-01 3.4358368e-01 4.8970222e-01
3.2036537e-01 4.7548191e-01 3.0923917e-01 1.8939555e-01 2.5097048e-01 1.4934667e-01 1.1005155e-01 1.1650099e-01 3.6010101e-01 9.1196293e-02 1.1703784e-01 1.5399576e-01 9.7629930e-02 6.1875465e-02 8.9676038e-02 1.8338991e-01 8.5126263e-02 1.9075582e-01 2.5465751e-01 7.5736219e-02 2.5186766e-01 3.8166311e-01 2.3701380e-01 1.2799843e-01 1.4864954e-01 1.1342667e-01 1.0854633e-01 2.0982818e-01 2.1643998e-01 5.3587826e-02
1.6560178e-01 3.4325330e-01 1.5845484e-01 8.2375398e-02 4.9083687e-01 1.2370407e-01 1.1319119e-01 1.5258449e-01 3.4191919e-01 3.0412805e-01 9.4296578e-02 4.9765736e-01 8.2928898e-02 3.0665038e-02 4.8703131e-01 8.7181182e-02 4.7095960e-02 2.1462398e-01 3.7820116e-01 9.2077443e-02 1.2628958e-01 4.6481876e-01 1.1589223e-01 5.3480142e-02 5.3047613e-01 7.3066139e-02 9.4329073e-02 2.3147766e-01 2.5980682e-01 1.4718615e-01
2.9433480e-01 2.6107541e-01 2.7876443e-01 1.6886532e-01 1.7622100e-01 7.9320287e-02 1.0159325e-01 5.4920477e-02 2.1565657e-01 1.3458298e-01 1.8649285e-02 2.7422207e-01 5.4657683e-03 1.2622386e-02 1.5460448e-01 1.0092529e-01 7.7752525e-02 1.0197007e-01 1.6516576e-01 4.6819507e-02 2.1380292e-01 4.2110874e-01 1.8860501e-01 1.0243807e-01 2.5708248e-01 1.1983002e-01 1.8354633e-01 1.7079038e-01 2.3694067e-01 1.1111111e-01
2.7966302e-01 1.4879946e-01 2.8443093e-01 1.5639449e-01 3.1569920e-01 3.5341390e-01 3.2193065e-01 1.9781312e-01 2.7070707e-01 2.9759899e-01 3.2953105e-02 1.7680339e-02 7.7086180e-02 1.7833462e-02 1.2876908e-01 4.0307027e-01 2.0601010e-01 2.5951885e-01 6.7231384e-02 2.3009687e-01 2.2981145e-01 1.5138593e-01 2.7187609e-01 1.1155623e-01 3.5811926e-01 5.4099601e-01 6.1717252e-01 5.3642612e-01 2.1170905e-01 4.1164896e-01
1.7364759e-01 5.2451809e-01 1.6736922e-01 8.6320255e-02 3.9667780e-01 1.6244402e-01 5.5740394e-02 8.0268390e-02 4.2272727e-01 2.8074979e-01 5.0045265e-02 2.5035361e-01 3.4867832e-02 1.8375115e-02 1.8615087e-01 6.0819539e-02 2.7297980e-02 1.1829892e-01 1.9274498e-01 5.9567735e-02 1.5368196e-01 6.1753731e-01 1.3730763e-01 6.6481518e-02 5.1991019e-01 1.0915777e-01 8.9856230e-02 2.1085911e-01 3.6349300e-01 1.7335695e-01
2.1482323e-01 1.7653027e-01 2.0786400e-01 1.1147402e-01 4.3937889e-01 1.8005030e-01 1.0140581e-01 1.4557654e-01 4.1565657e-01 2.4684078e-01 5.2399058e-02 1.4979668e-01 4.3773265e-02 2.2073299e-02 1.6823605e-01 7.5314687e-02 5.3156566e-02 1.9056640e-01 1.2506332e-01 6.5268162e-02 1.6791178e-01 2.4440299e-01 1.5175059e-01 7.5353913e-02 4.4726937e-01 1.2700954e-01 1.4408946e-01 3.3017182e-01 2.1663710e-01 1.5118720e-01
2.1387666e-01 2.9556983e-01 2.0378688e-01 1.1194062e-01 3.6851133e-01 1.2431753e-01 6.1808810e-02 1.0283300e-01 3.9090909e-01 1.9755687e-01 1.0182872e-01 1.0667875e-01 9.0797719e-02 3.7706529e-02 1.5864976e-01 6.3072671e-02 3.1439394e-02 1.7380186e-01 2.1160016e-01 1.9561102e-02 1.7929562e-01 2.7825160e-01 1.6290652e-01 7.9556626e-02 3.1123291e-01 7.5297610e-02 6.4736422e-02 2.2487973e-01 2.3161837e-01 6.4475928e-02
1.7128118e-01 3.1247886e-01 1.7614539e-01 8.6065748e-02 3.9947639e-01 2.9237470e-01 1.4964855e-01 1.3131213e-01 4.3535354e-01 3.1486942e-01 1.2275937e-01 1.8493635e-01 1.2594826e-01 3.7911983e-02 1.9570316e-01 2.5203533e-01 8.4696970e-02 2.5857170e-01 3.8214105e-01 8.3716817e-02 1.4051939e-01 2.9104478e-01 1.3880173e-01 5.8887141e-02 3.3104405e-01 2.1752966e-01 1.5303514e-01 2.7237113e-01 2.7104278e-01 1.3662600e-01
3.1279284e-01 4.1021305e-01 2.9970285e-01 1.7709438e-01 2.4311637e-01 1.9388381e-01 9.5407685e-02 1.0646123e-01 2.9040404e-01 1.8176074e-01 8.2020641e-02 3.4383840e-01 8.6415681e-02 3.7276942e-02 1.2655947e-01 1.6378766e-01 7.8257576e-02 1.8789543e-01 1.7473406e-01 7.3041471e-02 2.4439701e-01 4.8027719e-01 2.3532048e-01 1.1706154e-01 1.9368685e-01 1.4136857e-01 1.1605431e-01 2.1268041e-01 1.7366450e-01 9.9698282e-02
2.7871646e-01 2.1981738e-01 2.6667127e-01 1.5639449e-01 3.7573350e-01 1.3131096e-01 9.1377694e-02 8.0268390e-02 4.7979798e-01 1.6280539e-01 4.4541010e-02 1.8979844e-01 3.7176648e-02 2.1363546e-02 1.2934698e-01 1.4666386e-01 6.5378788e-02 1.1990907e-01 2.5395396e-01 4.3606539e-02 2.1237994e-01 3.0970149e-01 1.9353553e-01 1.0133209e-01 3.5944001e-01 1.4893617e-01 1.5910543e-01 1.9862543e-01 4.0193180e-01 1.0219074e-01
1.7648729e-01 3.6117687e-01 1.7766568e-01 8.5429480e-02 5.0167013e-01 3.3593031e-01 1.9793814e-01 1.4249503e-01 3.0707071e-01 3.9300758e-01 7.5430020e-02 2.4946959e-01 6.9405833e-02 2.6032970e-02 2.4438250e-01 3.4246102e-01 1.8532828e-01 3.3055503e-01 2.7294985e-01 2.3199702e-01 1.3376023e-01 3.5154584e-01 1.2998655e-01 5.5348014e-02 4.1160932e-01 2.2092538e-01 2.0239617e-01 2.9553265e-01 2.0500690e-01 2.0969435e-01
3.4592267e-01 2.4044640e-01 3.2140142e-01 2.0746554e-01 1.0526316e-01 2.2605975e-02 1.6986879e-02 3.1063618e-02 2.2626263e-01 8.0033698e-02 6.7716821e-03 7.9473126e-02 4.0946143e-03 7.4113090e-03 6.0475235e-02 1.0950221e-02 1.2186869e-02 6.8346278e-02 1.0522317e-01 1.6797258e-02 2.4831021e-01 2.3001066e-01 2.1928383e-01 1.2273889e-01 9.5753814e-02 2.2382629e-02 3.0878594e-02 1.1453608e-01 1.7602996e-01 4.0404040e-02
2.0393772e-01 1.1261414e-01 1.9653099e-01 1.0371156e-01 4.1265686e-01 1.7391571e-01 7.6499531e-02 1.3692843e-01 3.5808081e-01 2.6832350e-01 2.8571429e-02 3.7371818e-02 1.9177308e-02 1.1893956e-02 1.6177720e-01 6.7353622e-02 3.2373737e-02 1.6762644e-01 1.2717397e-01 6.6408247e-02 1.5617218e-01 1.1087420e-01 1.3875193e-01 6.6923909e-02 4.2679786e-01 1.1973300e-01 1.0183706e-01 3.0068729e-01 2.3023852e-01 1.6515807e-01
1.3067348e-01 2.0155563e-01 1.2238270e-01 6.2099682e-02 3.4070597e-01 8.4381326e-02 2.5843486e-02 6.9930417e-02 5.1565657e-01 2.7716933e-01 5.6816947e-02 2.3178925e-01 4.6788861e-02 1.7908173e-02 4.1088486e-01 6.3222880e-02 2.1078283e-02 1.7942792e-01 1.4208927e-01 1.1629562e-01 1.0032017e-01 2.3614072e-01 8.8052194e-02 4.1781361e-02 4.9877831e-01 6.4431314e-02 3.2292332e-02 1.7728522e-01 2.5152770e-01 1.7519349e-01
2.3233471e-01 2.5870815e-01 2.2396517e-01 1.2390244e-01 6.3076645e-01 1.6170787e-01 1.3891753e-01 3.6799205e-01 4.8232323e-01 1.8513058e-01 1.9181604e-01 4.2715700e-01 1.5379541e-01 7.8517290e-02 4.2380256e-01 9.4916935e-02 3.1994949e-02 3.6181095e-01 2.6591434e-01 7.2799635e-02 1.5901814e-01 1.8576759e-01 1.4467852e-01 7.0585922e-02 4.2745823e-01 5.4709860e-02 5.7132588e-02 3.0742268e-01 1.2911492e-01 3.4697626e-02
2.0583085e-01 1.5049036e-01 1.9349043e-01 1.0735949e-01 3.7158075e-01 5.9321514e-02 3.4840675e-03 1.6565606e-02 4.5151515e-01 1.7375737e-01 4.5627376e-02 2.0327970e-01 3.8071903e-02 1.9215612e-02 2.2820138e-01 5.0665425e-02 3.7550505e-03 6.3136958e-02 2.2088704e-01 2.5296077e-02 1.5190324e-01 1.8576759e-01 1.3426963e-01 6.7046795e-02 3.6142112e-01 4.4813769e-02 3.9576677e-03 3.8178694e-02 2.3516657e-01 5.7851240e-02
3.1279284e-01 2.7494082e-01 2.9334531e-01 1.8188759e-01 2.4239415e-01 6.4842648e-02 4.6790066e-02 6.1530815e-02 2.5909091e-01 1.1036226e-01 5.3050878e-02 1.7808522e-01 4.3631909e-02 2.8797269e-02 6.8939729e-02 2.2696548e-02 2.6893939e-02 9.5548399e-02 7.8206788e-02 7.9875074e-03 2.6929918e-01 3.7526652e-01 2.4154589e-01 1.3613350e-01 2.2340355e-01 4.7472131e-02 8.4664537e-02 1.7817869e-01 1.5178395e-01 4.9783550e-02
3.2509821e-01 1.8498478e-01 3.1234884e-01 1.8829268e-01 3.8394872e-01 1.7636955e-01 1.0494377e-01 1.8444334e-01 5.3030303e-01 1.8049705e-01 4.9393446e-02 1.2360767e-01 5.0558356e-02 2.3548837e-02 8.5732740e-02 9.8822363e-02 3.6792929e-02 1.9757530e-01 1.0409748e-01 2.4121443e-02 2.5080043e-01 2.5906183e-01 2.3885652e-01 1.1915061e-01 3.1255366e-01 1.4078645e-01 1.1629393e-01 3.4340206e-01 2.7399961e-01 9.2352092e-02
2.2523546e-01 1.4575583e-01 2.1042084e-01 1.2038176e-01 2.3020673e-01 7.3676462e-02 5.2600750e-02 1.3732604e-01 5.2575758e-01 2.3525695e-01 1.6309976e-01 2.0062765e-01 1.3947133e-01 5.7953149e-02 2.1487575e-01 9.1387028e-02 3.8232323e-02 3.4968744e-01 3.0010694e-01 3.8355237e-02 1.9139096e-01 1.6631130e-01 1.7077544e-01 8.5651789e-02 2.1415836e-01 5.5990531e-02 5.3793930e-02 2.8487973e-01 3.0277942e-01 7.7659714e-02
2.7966302e-01 2.0257017e-01 2.7841891e-01 1.5826087e-01 2.3065812e-01 2.3440280e-01 2.6124649e-01 1.6848907e-01 1.8787879e-01 1.9776748e-01 6.5109542e-02 2.2736917e-01 7.4918720e-02 3.0795782e-02 1.5994153e-01 2.8057500e-01 2.0017677e-01 3.3604849e-01 1.5334609e-01 9.6775977e-02 2.1237994e-01 2.0442431e-01 2.0772947e-01 1.0086512e-01 1.8549825e-01 1.9831960e-01 2.6709265e-01 3.4948454e-01 8.5550956e-02 1.0645415e-01
2.6499124e-01 2.9387893e-01 2.4904982e-01 1.4655355e-01 2.8256748e-01 6.9873014e-02 4.3580131e-03 1.4532803e-02 3.2171717e-01 1.8091828e-01 5.8084374e-02 2.1875000e-01 4.5422419e-02 2.9226856e-02 1.5875174e-01 4.3230090e-02 4.6969697e-03 5.5389278e-02 2.5085833e-01 3.8700717e-02 1.9815012e-01 2.9477612e-01 1.7505852e-01 9.3123280e-02 2.1547910e-01 3.7789485e-02 4.4560703e-03 3.0144330e-02 1.8529470e-01 6.0802834e-02
2.3470112e-01 3.7368955e-01 2.3550549e-01 1.2619300e-01 3.0170624e-01 2.5065947e-01 1.5402999e-01 1.8841948e-01 2.6666667e-01 3.7278854e-01 5.8917255e-02 2.2759017e-01 1.1501673e-01 2.8218260e-02 1.7017371e-01 3.7032475e-01 1.1078283e-01 3.0933889e-01 1.5250183e-01 2.4598897e-01 1.8890075e-01 4.0698294e-01 2.0812789e-01 8.8699371e-02 2.6698805e-01 2.4644177e-01 1.8889776e-01 3.9690722e-01 1.7740982e-01 2.9365079e-01
2.7966302e-01 1.1531958e-01 2.6328519e-01 1.5796394e-01 1.5274894e-01 5.4935280e-02 5.2952202e-02 5.8200795e-02 1.3989899e-01 1.2320977e-01 1.5100489e-02 2.4045262e-02 1.6868492e-02 1.0978749e-02 1.0259374e-01 8.4101902e-02 4.1717172e-02 1.1185831e-01 1.1690212e-01 4.0980888e-02 2.0241907e-01 9.3816631e-02 1.8422232e-01 9.6293748e-02 1.6502675e-01 8.4805619e-02 9.4728435e-02 1.8439863e-01 1.4665878e-01 9.2548865e-02
2.0251787e-01 3.4663510e-01 2.0682745e-01 1.0629905e-01 2.4889410e-01 3.0280351e-01 2.1729147e-01 2.7773360e-01 7.7525253e-01 2.6053075e-01 1.3583198e-01 3.4140736e-01 9.9891627e-02 5.2069675e-02 4.7683312e-01 6.0359900e-01 2.0452020e-01 6.6054177e-01 3.7003996e-01 1.9423600e-01 1.3980790e-01 2.7478678e-01 1.3875193e-01 6.2033032e-02 2.0887539e-01 1.5233189e-01 1.2348243e-01 3.2006873e-01 2.7399961e-01 9.8714417e-02
2.0772398e-01 3.1044978e-01 1.9611637e-01 1.0710498e-01 3.1145617e-01 9.4166002e-02 5.6208997e-02 1.0800199e-01 4.8131313e-01 2.0197978e-01 5.5803006e-02 3.5665665e-01 5.6401074e-02 1.9962719e-02 1.6402080e-01 8.7857121e-02 3.4747475e-02 1.8799015e-01 3.6975854e-01 7.0243080e-02 1.5759516e-01 3.7633262e-01 1.4383186e-01 6.7366300e-02 2.6830879e-01 6.7710607e-02 6.0135783e-02 2.1316151e-01 3.3550168e-01 9.7730552e-02
3.5160206e-01 3.3885695e-01 3.6099786e-01 2.1527041e-01 3.1542837e-01 4.5463468e-01 3.1911903e-01 3.2813121e-01 3.3030303e-01 4.6251053e-01 2.7868912e-01 3.1157178e-01 1.6976865e-01 1.3131913e-01 2.0562940e-01 7.8219725e-01 2.5151515e-01 5.2491002e-01 4.6276805e-01 7.5885466e-01 2.7890430e-01 2.6945629e-01 2.5544101e-01 1.4306429e-01 1.8926237e-01 2.1335778e-01 1.7731629e-01 3.5085911e-01 1.3936527e-01 2.1612226e-01
3.7763264e-01 3.1755157e-01 3.6790823e-01 2.3066808e-01 3.3664350e-01 2.4185633e-01 1.3917526e-01 2.3951292e-01 4.1363636e-01 1.8028644e-01 6.3805903e-02 1.2990629e-01 6.6625830e-02 3.3746857e-02 1.2302410e-01 1.4193229e-01 3.8787879e-02 2.2485319e-01 1.0325322e-01 6.6339151e-02 2.9598008e-01 3.7766525e-01 2.9229543e-01 1.5350963e-01 3.9708116e-01 2.6749522e-01 1.4408946e-01 5.1168385e-01 2.7537946e-01 1.9467401e-01
2.8250272e-01 2.1339195e-01 2.7192316e-01 1.5703075e-01 4.3215672e-01 1.8419115e-01 1.4421275e-01 1.6749503e-01 3.3838384e-01 3.1044650e-01 3.5451747e-02 8.9153112e-02 2.2334260e-02 2.0298918e-02 2.3836557e-01 1.3352059e-01 5.8964646e-02 2.1443455e-01 2.5845669e-01 1.3236046e-01 2.0668801e-01 2.1082090e-01 1.9124458e-01 9.8358238e-02 5.0934425e-01 1.7416150e-01 1.7899361e-01 3.6288660e-01 3.5777646e-01 2.6761118e-01
2.3044157e-01 2.6208996e-01 2.1940433e-01 1.2267232e-01 2.8067166e-01 1.1361266e-01 6.2980319e-02 1.1332008e-01 4.1161616e-01 1.5143218e-01 3.4582654e-02 1.9399752e-01 2.2475616e-02 1.3220072e-02 1.9995241e-01 9.5743083e-02 3.5656566e-02 1.6249290e-01 1.4124500e-01 3.0720119e-02 1.8249733e-01 3.6593817e-01 1.6903232e-01 8.1744003e-02 4.3406194e-01 1.4408515e-01 1.0511182e-01 3.1408935e-01 3.0277942e-01 9.8583235e-02
2.7161721e-01 1.3763950e-01 2.6252505e-01 1.4786850e-01 3.9758057e-01 1.9799399e-01 3.0178069e-02 9.5626243e-02 2.9191919e-01 2.3251896e-01 2.5058845e-02 7.3572313e-02 2.7470197e-02 1.2286187e-02 1.4790767e-01 7.1709676e-02 1.6575758e-02 1.5112711e-01 8.2428097e-02 1.7177287e-02 1.9815012e-01 1.4552239e-01 1.8989990e-01 9.0567243e-02 3.8717559e-01 1.1633728e-01 4.1797125e-02 2.1797251e-01 1.5848610e-01 9.3008002e-02
3.2131194e-01 1.2039229e-01 3.0592219e-01 1.8629905e-01 3.5524059e-01 1.3137231e-01 2.4906279e-02 9.5278330e-02 2.6868687e-01 1.9292334e-01 3.8964331e-02 7.3903819e-02 3.4019696e-02 2.0429662e-02 8.9574056e-02 4.4319104e-02 1.0787879e-02 1.2936162e-01 1.9218214e-01 3.1341984e-02 2.3977232e-01 1.3086354e-01 2.1793914e-01 1.1696323e-01 3.0264809e-01 7.7529082e-02 2.9808307e-02 1.9938144e-01 2.4797950e-01 8.4612357e-02
1.8595296e-01 8.9279675e-02 1.7517794e-01 9.3404030e-02 2.9385213e-01 8.5362861e-02 2.8959700e-02 6.8041750e-02 1.9646465e-01 2.1798652e-01 2.3103386e-02 1.4736563e-01 2.4030533e-02 8.0089952e-03 5.9999320e-02 7.4788957e-02 2.7070707e-02 1.7793143e-01 3.0292115e-01 8.7517101e-02 1.2237638e-01 7.4626866e-02 1.0961701e-01 5.0874951e-02 1.4495146e-01 4.6346693e-02 2.3035144e-02 1.0975945e-01 1.1393653e-01 7.4708120e-02
3.4450282e-01 2.8610078e-01 3.2775897e-01 2.0767762e-01 1.1853390e-01 1.0066867e-01 5.7989691e-02 6.8290258e-02 2.9040404e-01 1.2426285e-01 4.2911461e-02 6.8246110e-02 4.2595298e-02 2.5696771e-02 4.9495190e-02 8.6505242e-02 2.7247475e-02 9.9318053e-02 4.4295604e-02 3.6696931e-02 2.9491284e-01 3.5287846e-01 2.7586035e-01 1.5594278e-01 1.5373440e-01 1.8376653e-01 1.2500000e-01 2.5876289e-01 2.1111768e-01 1.4246360e-01
1.6702163e-01 4.5248563e-01 1.5935319e-01 8.0890774e-02 4.4118444e-01 1.4903994e-01 5.8458294e-02 9.3190855e-02 3.2070707e-01 3.2855939e-01 6.3479993e-02 1.7300212e-01 7.2185836e-02 2.5696771e-02 2.8748683e-01 9.1462132e-02 4.6994949e-02 2.3678727e-01 3.7651264e-01 3.7180603e-02 1.0672359e-01 3.2515991e-01 9.8062653e-02 4.3624656e-02 2.8481807e-01 5.7096565e-02 3.3210863e-02 1.0738832e-01 1.3049478e-01 8.3497311e-02
2.5931185e-01 3.4426784e-01 2.5319605e-01 1.3904560e-01 2.8780356e-01 2.5157966e-01 1.6002812e-01 1.5402584e-01 3.6414141e-01 2.6390059e-01 9.1508238e-02 1.5023868e-01 8.5850257e-02 4.0190662e-02 1.6374885e-01 2.3611320e-01 1.1898990e-01 2.6577003e-01 2.7463837e-01 1.2976936e-01 1.9672714e-01 2.9450959e-01 1.8785796e-01 8.9977389e-02 2.2340355e-01 1.8289335e-01 1.5207668e-01 2.6202749e-01 2.2077666e-01 1.4823560e-01
1.6607506e-01 3.0098072e-01 1.5942229e-01 8.0933192e-02 4.8903133e-01 1.4538985e-01 5.3819119e-02 8.8469185e-02 2.1313131e-01 3.3782645e-01 1.3398515e-02 2.6582390e-01 1.3098996e-02 6.1225481e-03 2.4346466e-01 5.3399225e-02 4.5656566e-02 1.7425649e-01 1.4110429e-01 8.3682269e-02 1.1134827e-01 3.3368870e-01 1.0134967e-01 4.6745969e-02 4.6311827e-01 7.4812508e-02 6.7276358e-02 2.2432990e-01 1.2773507e-01 1.5335170e-01
2.1198353e-01 2.8576260e-01 2.0592910e-01 1.1011665e-01 3.2409497e-01 1.7655359e-01 7.8350515e-02 7.4652087e-02 1.7727273e-01 2.6263690e-01 7.8326996e-02 1.5443777e-01 8.0949913e-02 3.0123385e-02 1.6789611e-01 1.8226335e-01 5.6085859e-02 1.4788786e-01 1.5559746e-01 8.6929785e-02 1.6897901e-01 2.5559701e-01 1.6076498e-01 7.4862367e-02 2.8547844e-01 1.4709278e-01 9.7923323e-02 1.8931271e-01 1.2674946e-01 1.3997114e-01
2.1860949e-01 4.9983091e-01 2.1035174e-01 1.1609756e-01 1.9960278e-01 1.1502362e-01 4.6251172e-02 6.5258449e-02 4.4191919e-01 1.8576243e-01 5.0588448e-02 3.1510785e-01 5.6730905e-02 2.1307513e-02 1.4987932e-01 1.5860546e-01 4.0303030e-02 1.3256299e-01 3.3852085e-01 4.5472134e-02 1.6044112e-01 5.2238806e-01 1.5429055e-01 7.1593590e-02 1.6033811e-01 1.0556801e-01 5.7819489e-02 1.6546392e-01 3.3096787e-01 8.1398400e-02
2.9433480e-01 2.0662834e-01 2.7834980e-01 1.6704136e-01 2.9322019e-01 1.0161953e-01 3.4231490e-03 1.6207753e-02 2.8888889e-01 1.8913227e-01 2.8535216e-02 4.7140205e-02 2.1062055e-02 1.6245858e-02 6.5234388e-02 4.2126055e-02 2.8484848e-03 4.5197954e-02 7.8206788e-02 5.8393101e-02 2.3052295e-01 2.2468017e-01 2.0713183e-01 1.1101553e-01 2.7491250e-01 1.0411270e-01 8.9456869e-03 8.5910653e-02 2.1407451e-01 1.8896760e-01
9.5555871e-02 1.5860670e-01 8.6863382e-02 4.3605514e-02 1.5726280e-01 3.6132753e-02 8.6246485e-03 1.7256461e-02 3.6767677e-01 3.8689975e-01 2.2849900e-02 2.0880481e-01 1.8234934e-02 5.5790272e-03 1.9294965e-01 1.9759966e-02 9.2954545e-03 6.5770032e-02 2.6915067e-01 4.3468347e-02 6.2931341e-02 2.1455224e-01 5.2243638e-02 2.4651003e-02 1.8120584e-01 2.4284231e-02 1.1757188e-02 4.7731959e-02 2.8109600e-01 1.5085924e-01
3.0853330e-01 1.0145418e-01 2.8954461e-01 1.7930011e-01 1.9075562e-01 5.1407889e-02 6.4620431e-03 2.1963221e-02 1.5404040e-01 7.1398484e-02 4.0883578e-02 7.2091584e-02 3.5433256e-02 2.5379251e-02 5.5240167e-02 1.1220597e-02 5.1262626e-03 6.1413146e-02 9.7343389e-02 2.3188646e-02 2.5044468e-01 1.3113006e-01 2.2446337e-01 1.2620429e-01 1.2586674e-01 3.0144269e-02 1.1014377e-02 7.5945017e-02 1.3837966e-01 4.5126591e-02
2.8723555e-01 1.3966858e-01 2.6895170e-01 1.6419936e-01 2.7886612e-01 5.5119318e-02 1.0681818e-02 4.3881710e-02 1.9848485e-01 1.0994103e-01 1.0356690e-01 1.0349629e-01 8.5284832e-02 4.8950500e-02 8.2775266e-02 1.8468171e-02 7.1489899e-03 9.1324114e-02 8.9182192e-02 4.7614112e-02 2.4190679e-01 1.4339019e-01 2.1689327e-01 1.1974046e-01 2.0095093e-01 3.0250992e-02 1.4568690e-02 1.2137457e-01 1.0684013e-01 7.0575889e-02
2.2334233e-01 3.1788975e-01 2.1104278e-01 1.1673383e-01 3.2057416e-01 1.0168088e-01 3.7089972e-02 5.7057654e-02 4.4242424e-01 2.3841618e-01 1.7599131e-02 2.3643034e-01 1.6585780e-02 8.3638714e-03 1.4790767e-01 5.1506594e-02 2.6313131e-02 1.4468649e-01 2.1962065e-01 2.6470710e-02 1.6648879e-01 3.8726013e-01 1.5194980e-01 7.3215690e-02 3.3764776e-01 7.8984389e-02 6.3218850e-02 1.9728522e-01 3.7886852e-01 9.5369277e-02
3.6106773e-01 2.0223199e-01 3.3784811e-01 2.2116649e-01 2.1260269e-01 4.8371266e-02 3.3903468e-02 9.3290258e-02 2.8888889e-01 5.4549284e-02 7.4053956e-02 1.2183964e-01 5.6401074e-02 4.1273968e-02 1.1279192e-01 2.8306847e-02 1.3446970e-02 1.1979542e-01 9.9313334e-02 0.0000000e+00 3.0345073e-01 2.5932836e-01 2.6540166e-01 1.6112859e-01 1.9764908e-01 4.2281534e-02 3.7907348e-02 1.9975945e-01 1.9022275e-01 1.2527876e-02
2.7351034e-01 1.2377410e-01 2.6604934e-01 1.5295864e-01 3.1876862e-01 1.8434452e-01 9.4939082e-02 1.2664016e-01 2.7323232e-01 2.4094356e-01 7.7856238e-02 6.6124470e-02 7.4871602e-02 3.4325866e-02 1.6252507e-01 1.9097546e-01 7.9217172e-02 2.0250047e-01 1.3266168e-01 1.2082141e-01 2.2269655e-01 1.1673774e-01 2.0733104e-01 1.0656705e-01 3.1849700e-01 1.8774437e-01 1.4129393e-01 2.8903780e-01 1.9692490e-01 1.8030959e-01
2.1576980e-01 3.4156239e-02 2.0689655e-01 1.1266172e-01 3.0098402e-01 1.2364272e-01 3.2029053e-02 4.4269384e-02 3.9040404e-01 2.3251896e-01 7.1338041e-03 0.0000000e+00 1.6491542e-02 4.9234401e-03 8.1959411e-02 8.3726380e-02 2.5328283e-02 8.8406895e-02 1.7501548e-01 3.6524191e-02 1.5688367e-01 2.2654584e-02 1.5349370e-01 6.9455368e-02 2.5113914e-01 1.3127844e-01 6.6485623e-02 1.6202749e-01 3.5974768e-01 1.2659058e-01
7.6482560e-02 3.0064254e-01 7.1176836e-02 3.2958643e-02 4.9444796e-01 1.1990062e-01 0.0000000e+00 0.0000000e+00 5.5707071e-01 4.9768324e-01 8.1586095e-02 5.3412306e-01 6.9028884e-02 2.0560406e-02 6.4714281e-01 8.8457957e-02 0.0000000e+00 0.0000000e+00 7.5389768e-01 2.0470406e-01 3.6357168e-02 2.7771855e-01 3.1077245e-02 1.3492922e-02 4.1953378e-01 4.8878928e-02 0.0000000e+00 0.0000000e+00 3.1086142e-01 1.7132363e-01
2.6073170e-01 2.4146094e-01 2.4462719e-01 1.4341463e-01 2.9322019e-01 5.8155941e-02 1.0480319e-02 3.1923459e-02 7.8282828e-02 1.4258635e-01 2.1763534e-02 7.8434406e-02 1.3664421e-02 1.0997426e-02 1.0929055e-01 5.7079340e-03 6.6161616e-03 6.4216708e-02 8.5101593e-02 1.5518981e-02 1.9245820e-01 2.0495736e-01 1.6967976e-01 8.8232403e-02 2.5906359e-01 2.1577359e-02 1.5479233e-02 9.5670103e-02 6.9386951e-02 4.3945953e-02
2.4605992e-01 1.4778492e-01 2.3122106e-01 1.3484624e-01 2.2307484e-01 3.9077357e-02 2.6312090e-02 2.5104374e-02 3.0959596e-01 1.3753159e-01 3.6139779e-02 5.2908416e-02 3.2087829e-02 1.6843544e-02 1.2339804e-01 2.6399195e-02 2.8358586e-02 9.5681000e-02 1.6727641e-01 1.9139616e-03 1.7502668e-01 1.1860341e-01 1.5533642e-01 8.0588871e-02 1.9104537e-01 2.5254436e-02 3.2875399e-02 6.3642612e-02 1.4350483e-01 3.4959990e-02
9.7543660e-02 3.1078796e-01 1.1250086e-01 4.2841994e-02 4.2475399e-01 5.4542666e-01 4.6274602e-01 2.4393638e-01 6.4141414e-01 7.8917439e-01 1.2811878e-01 3.4273338e-01 1.4192150e-01 3.2495452e-02 2.7643879e-01 4.7802445e-01 2.5934343e-01 4.7868915e-01 3.8031181e-01 2.4122134e-01 7.5773746e-02 3.0330490e-01 9.0691768e-02 2.7501966e-02 3.3632702e-01 3.3715594e-01 3.6813099e-01 3.9347079e-01 3.0948157e-01 3.3097206e-01
2.5789200e-01 2.4653365e-01 2.4055007e-01 1.4159067e-01 2.0709578e-01 4.6500215e-02 3.1443299e-02 8.4443340e-02 2.0808081e-01 1.1899747e-01 9.6433098e-02 4.0660361e-01 8.1515337e-02 4.5495127e-02 1.9186185e-01 6.4124133e-02 2.5148990e-02 2.1216139e-01 3.7215062e-01 7.1383165e-02 1.7680541e-01 2.1828358e-01 1.5613327e-01 8.1277035e-02 8.5319950e-02 1.9239165e-02 1.7867412e-02 9.7319588e-02 6.6232998e-02 2.8072937e-02
1.5471627e-01 2.1880284e-01 1.5707277e-01 7.6648993e-02 4.8271193e-01 2.8133243e-01 1.5759138e-01 1.9706759e-01 3.4494949e-01 4.8083404e-01 9.2775665e-02 2.4549151e-01 3.9579701e-02 2.9656442e-02 2.9836489e-01 3.0340674e-01 1.0111111e-01 2.9247964e-01 2.7168346e-01 2.3151334e-01 1.1917467e-01 2.2894456e-01 1.0518452e-01 5.0432560e-02 4.5585419e-01 2.0249149e-01 1.5159744e-01 3.3484536e-01 2.0559827e-01 2.7535091e-01
2.7824317e-01 1.2208319e-01 2.6971184e-01 1.5325557e-01 5.4861425e-01 2.1152077e-01 8.9034677e-02 1.6898608e-01 2.4393939e-01 3.1171019e-01 3.9724787e-02 1.5068069e-01 4.0380719e-02 1.8244371e-02 1.4267260e-01 1.3449695e-01 4.8030303e-02 1.9151354e-01 5.8225924e-02 7.6427180e-02 2.1736037e-01 2.4147122e-01 2.1111609e-01 1.0182363e-01 5.5160800e-01 1.8997584e-01 1.4305112e-01 3.9690722e-01 1.6104869e-01 1.9998688e-01
2.4700648e-01 1.8599932e-01 2.3647295e-01 1.3336161e-01 3.0784508e-01 1.4131035e-01 4.6719775e-02 8.4095427e-02 2.9191919e-01 2.3862679e-01 5.2869817e-02 9.8810997e-02 5.6636668e-02 2.2801729e-02 1.2543767e-01 8.9584522e-02 2.6540404e-02 9.7404812e-02 7.6658975e-02 4.0428119e-02 2.0704376e-01 2.4946695e-01 2.0269934e-01 9.7792961e-02 3.5944001e-01 1.6057863e-01 9.3210863e-02 1.9092784e-01 2.1604573e-01 1.6115702e-01
2.6925079e-01 2.5667907e-01 2.5886255e-01 1.4693531e-01 4.5292047e-01 1.7563340e-01 7.4812559e-02 1.0472167e-01 3.2676768e-01 2.0808762e-01 3.5669020e-02 1.3045880e-01 3.8119022e-02 2.0186852e-02 1.7323316e-01 5.4540812e-02 3.3560606e-02 1.2263686e-01 1.7853324e-01 3.0720119e-02 2.0562078e-01 2.4200426e-01 1.9069675e-01 9.5654738e-02 4.4396751e-01 9.1111952e-02 8.1469649e-02 1.9250859e-01 2.2136803e-01 9.0777909e-02
3.3740357e-01 1.0720325e-01 3.1953562e-01 2.0063627e-01 3.6526135e-01 1.0330655e-01 4.1354264e-02 1.3583499e-01 1.5808081e-01 1.4827296e-01 5.2724968e-02 1.5929986e-01 3.7742072e-02 3.1972477e-02 1.6925587e-01 6.8104665e-02 1.4436869e-02 1.2553514e-01 8.8337930e-02 5.4627365e-02 2.7036642e-01 1.5938166e-01 2.3900593e-01 1.3878785e-01 3.7594928e-01 8.1118840e-02 4.2388179e-02 2.0240550e-01 1.0546028e-01 1.0356815e-01
2.3896067e-01 2.7798444e-01 2.2320503e-01 1.2831389e-01 2.1847071e-01 5.9934973e-02 3.6223055e-03 2.7793241e-02 1.6262626e-01 2.2620051e-01 4.4178888e-02 1.2144183e-01 3.3407153e-02 1.8991479e-02 1.0252575e-01 3.4810887e-02 2.9898990e-03 7.4843720e-02 9.5373445e-02 2.9718226e-02 1.8285308e-01 2.7265458e-01 1.6101399e-01 8.3120330e-02 1.9896982e-01 4.5221255e-02 6.1757188e-03 9.6082474e-02 1.1945594e-01 1.0055096e-01
2.8392257e-01 3.2600609e-01 2.8145947e-01 1.5715801e-01 3.8963618e-01 2.8562665e-01 1.6651828e-01 1.4662028e-01 3.5404040e-01 3.2518955e-01 5.6816947e-02 4.5571075e-02 8.0478726e-02 2.5864871e-02 1.3645171e-01 2.2755130e-01 1.1093434e-01 1.8584959e-01 2.7618619e-01 1.2704006e-01 2.3087869e-01 2.6465885e-01 2.4303999e-01 1.1037652e-01 3.8057188e-01 2.8913079e-01 2.7468051e-01 3.3876289e-01 4.0035482e-01 2.4019415e-01
2.0062473e-01 3.4325330e-01 1.9452699e-01 1.0341463e-01 4.7639253e-01 1.4848782e-01 1.1729147e-02 3.7688867e-02 4.4444444e-01 2.1735468e-01 6.7390911e-02 3.5488861e-01 5.6636668e-02 2.3941068e-02 3.7995037e-01 6.6001742e-02 8.3257576e-03 9.4089790e-02 4.8612596e-01 3.6904219e-02 1.4407684e-01 3.6673774e-01 1.3197868e-01 6.1664373e-02 4.7038235e-01 6.7332227e-02 1.0662939e-02 6.9484536e-02 3.4042973e-01 6.6771612e-02
2.0204458e-01 1.7145756e-01 1.9065718e-01 1.0455992e-01 2.7471337e-01 7.7295871e-02 2.2813964e-03 1.4617296e-02 3.6010101e-01 2.2851727e-01 3.7262357e-02 1.4053660e-01 3.6375630e-02 1.5442717e-02 1.3271238e-01 3.6590861e-02 2.4588384e-03 5.5711309e-02 1.2829966e-01 3.9218938e-02 1.7182497e-01 2.6759062e-01 1.5772698e-01 7.5575108e-02 3.0000660e-01 6.8544984e-02 4.4073482e-03 5.7285223e-02 2.4640252e-01 1.2554113e-01
2.5173932e-01 3.1484613e-01 2.3557460e-01 1.3611877e-01 2.7534531e-01 6.9443592e-02 1.8172446e-02 4.2420477e-02 2.4191919e-01 1.9987363e-01 2.6253848e-02 2.5897277e-01 2.0826462e-02 1.2024699e-02 2.0967468e-01 4.6414516e-02 1.7686869e-02 1.2354613e-01 1.6192942e-01 4.5852162e-02 1.9281395e-01 4.3816631e-01 1.6992878e-01 8.8256980e-02 3.3698739e-01 6.1346062e-02 2.8905751e-02 1.3687285e-01 1.9495368e-01 1.1170143e-01
2.8439585e-01 1.5285763e-01 2.7841891e-01 1.5728526e-01 3.7907376e-01 2.4621189e-01 8.7582006e-02 1.0427435e-01 2.9898990e-01 4.7219882e-01 2.5312330e-02 6.2102192e-02 7.7698723e-03 1.4209990e-02 1.1959071e-01 1.5620212e-01 7.8611111e-02 1.3856791e-01 1.1971633e-01 1.6604480e-01 2.0597652e-01 1.3033049e-01 1.8412272e-01 9.6047975e-02 2.8415770e-01 1.6513859e-01 1.1581470e-01 2.0103093e-01 1.7090479e-01 3.0080021e-01
1.4525060e-01 2.6445722e-01 1.4249188e-01 7.0965005e-02 4.3396226e-01 1.6526593e-01 5.8833177e-02 8.8220676e-02 4.1919192e-01 2.8117102e-01 5.4463154e-02 3.6571782e-01 4.8108185e-02 1.8767347e-02 2.0702315e-01 9.1912759e-02 4.2676768e-02 1.5235840e-01 1.8458378e-01 6.5060874e-02 1.1490573e-01 3.9498934e-01 1.0742567e-01 4.8859615e-02 4.5585419e-01 1.0954585e-01 8.4265176e-02 2.2333333e-01 2.6197516e-01 1.4167651e-01
3.5207535e-01 2.3097734e-01 3.4800636e-01 2.1111347e-01 4.0516385e-01 2.8992086e-01 1.8760544e-01 2.0989066e-01 4.3030303e-01 2.9823083e-01 8.6040196e-02 9.0700141e-02 9.0467889e-02 4.7325541e-02 9.7358670e-02 2.1238021e-01 9.6969697e-02 2.3546126e-01 1.5264254e-01 8.5616959e-02 3.1092138e-01 2.5293177e-01 3.0375019e-01 1.6636355e-01 3.8453411e-01 3.0057921e-01 2.9992013e-01 4.8591065e-01 2.9331756e-01 2.1382658e-01
1.2423683e-01 2.4112276e-01 1.2335015e-01 5.8112407e-02 2.9051187e-01 2.2360591e-01 1.9732896e-01 1.1391650e-01 4.9292929e-01 4.4839933e-01 2.6398696e-02 1.2877917e-01 3.1663761e-02 9.8394092e-03 1.4416834e-01 2.4377385e-01 1.2696970e-01 1.6120477e-01 1.3533517e-01 1.0834957e-01 1.0032017e-01 2.9450959e-01 1.0379003e-01 4.1388124e-02 3.4425147e-01 3.0494513e-01 3.4672524e-01 2.7903780e-01 2.7932190e-01 2.8341860e-01
1.9305220e-01 1.7754481e-01 1.9141732e-01 9.7730647e-02 4.5743432e-01 2.1958776e-01 1.2645267e-01 1.6605368e-01 3.6161616e-01 4.0248526e-01 1.7599131e-02 1.0217026e-01 2.8176978e-02 7.4673421e-03 1.9386749e-01 1.2405744e-01 6.9646465e-02 1.9132411e-01 2.1947993e-01 6.9863052e-02 1.4194237e-01 2.1002132e-01 1.4617262e-01 6.2622886e-02 4.6642013e-01 1.8793841e-01 1.8362620e-01 3.6941581e-01 3.4220382e-01 2.3455333e-01
2.2381561e-01 1.9411566e-01 2.1588004e-01 1.1741251e-01 5.6305859e-01 1.6388565e-01 9.3861293e-02 1.6153082e-01 4.7929293e-01 3.1802864e-01 8.4410646e-02 8.3826909e-02 7.5295670e-02 3.3111816e-02 2.6593466e-01 6.5476012e-02 4.1691919e-02 2.1235082e-01 1.6389936e-01 7.6185343e-02 1.8249733e-01 1.6364606e-01 1.6808606e-01 8.1399921e-02 4.9415572e-01 8.1700963e-02 8.6821086e-02 2.7024055e-01 2.3654642e-01 1.5099042e-01
1.5518955e-01 1.6909029e-01 1.5486145e-01 7.5546129e-02 4.1699016e-01 2.2148948e-01 8.3903468e-02 1.0124254e-01 2.8939394e-01 4.2312553e-01 8.2020641e-02 4.7489392e-01 7.7133299e-02 2.3399415e-02 5.3190332e-01 3.3389912e-01 6.5934343e-02 2.4550104e-01 4.0620251e-01 2.0256208e-01 1.0494486e-01 1.9882729e-01 1.0199711e-01 4.2248329e-02 4.2811860e-01 1.3224864e-01 5.7204473e-02 1.4000000e-01 1.7129903e-01 1.9572347e-01
2.4038052e-01 3.1078796e-01 2.2714394e-01 1.2801697e-01 2.8193554e-01 1.1827495e-01 1.7596064e-02 4.2186879e-02 2.5000000e-01 2.2156698e-01 4.7619048e-02 1.7499116e-01 3.7789191e-02 2.0952637e-02 1.8584492e-01 6.5400907e-02 1.4727273e-02 1.0409168e-01 1.6797996e-01 6.4231721e-02 2.0313056e-01 4.0085288e-01 1.7993924e-01 9.2754621e-02 3.8123225e-01 1.0469482e-01 3.5990415e-02 1.7501718e-01 2.5921545e-01 1.6915912e-01
3.6816697e-01 1.7010484e-01 3.5298183e-01 2.2277837e-01 3.2608107e-01 1.7919146e-01 1.0796626e-01 1.7534791e-01 2.3282828e-01 1.9292334e-01 8.3758827e-02 8.3760608e-03 8.3871272e-02 4.1572811e-02 1.0262773e-01 9.6193709e-02 4.6843434e-02 2.0212161e-01 1.9344853e-01 6.5233614e-02 3.3226610e-01 1.5751599e-01 3.1769510e-01 1.7095950e-01 3.3566664e-01 1.6843729e-01 1.7180511e-01 4.2989691e-01 3.0435640e-01 1.7598059e-01
2.1245681e-01 2.1373013e-01 2.0199019e-01 1.0994698e-01 3.4422678e-01 1.2109687e-01 6.0613871e-02 1.1540755e-01 2.8989899e-01 2.8980623e-01 2.1437624e-02 8.8689003e-02 1.5690524e-02 1.0175608e-02 2.5420675e-01 4.7285727e-02 2.3737374e-02 1.1962493e-01 1.3603872e-01 7.3041471e-02 1.6293134e-01 2.3374200e-01 1.4572439e-01 7.1421549e-02 5.4104207e-01 8.2186066e-02 7.8458466e-02 2.2501718e-01 2.5349892e-01 2.1376099e-01
2.3517440e-01 1.7754481e-01 2.3108286e-01 1.2012725e-01 5.7028076e-01 3.1047175e-01 2.7436739e-02 8.8817097e-02 7.0656566e-01 3.3382477e-01 9.0349448e-02 1.5244873e-01 8.0007539e-02 3.7071487e-02 1.3893327e-01 1.6461381e-01 1.9737374e-02 1.9928017e-01 2.7379411e-01 7.6669016e-02 1.7360370e-01 1.5191898e-01 1.6275711e-01 7.6435313e-02 3.8387374e-01 1.5640675e-01 2.4936102e-02 1.6378007e-01 3.0731323e-01 1.3682277e-01
2.2144919e-01 2.4890091e-01 2.0668924e-01 1.1770944e-01 2.0745689e-01 5.1898657e-02 1.9461106e-02 5.7753479e-02 3.0858586e-01 1.5480202e-01 8.7597320e-02 6.8997525e-02 6.9170240e-02 3.5913470e-02 1.6555053e-01 3.5591973e-02 1.5022727e-02 1.1926501e-01 2.0090617e-01 6.1260589e-02 1.9032373e-01 2.0575693e-01 1.6534688e-01 8.7814589e-02 1.8761144e-01 3.6353582e-02 2.4329073e-02 1.4646048e-01 2.2984427e-01 8.6645678e-02
1.9683847e-01 1.4744674e-01 1.8968972e-01 1.0226935e-01 1.8154735e-01 1.2655665e-01 1.0555295e-01 7.3111332e-02 3.1818182e-01 2.2893850e-01 1.1251132e-01 9.9230905e-02 1.2123639e-01 4.1161902e-02 1.3012884e-01 2.3746508e-01 1.1376263e-01 2.7865126e-01 3.2557551e-01 1.3598800e-01 1.4905727e-01 1.0127932e-01 1.4547537e-01 6.5940818e-02 1.1536684e-01 9.5380854e-02 9.5926518e-02 1.3477663e-01 1.9929036e-01 9.9304736e-02
2.6404468e-01 3.1653703e-01 2.6349250e-01 1.4519618e-01 3.1569920e-01 2.5894117e-01 2.4133083e-01 2.1824056e-01 2.3888889e-01 2.5021061e-01 9.0059750e-02 2.4703854e-01 1.1567639e-01 3.8640413e-02 2.7671075e-01 3.0115360e-01 1.5835859e-01 3.7241902e-01 2.6042663e-01 1.1436093e-01 1.9352544e-01 2.7745203e-01 1.9229045e-01 8.9018875e-02 2.5378062e-01 1.6775815e-01 1.9073482e-01 3.1838488e-01 1.0959984e-01 1.1045520e-01
2.8723555e-01 3.0030436e-01 2.8539838e-01 1.5630965e-01 5.0167013e-01 3.4053126e-01 2.2500000e-01 2.7847913e-01 4.9242424e-01 3.1697557e-01 7.2098497e-02 2.5411068e-01 8.6368562e-02 2.7583218e-02 2.0715913e-01 2.7839697e-01 1.2909091e-01 3.5537034e-01 2.9152361e-01 1.6652847e-01 2.2269655e-01 3.4195096e-01 2.1818816e-01 9.9783720e-02 4.1689229e-01 2.3140360e-01 2.0551118e-01 4.3230241e-01 3.0514488e-01 1.8450741e-01
3.2604477e-01 2.1981738e-01 3.0910096e-01 1.9096501e-01 3.1416448e-01 1.0901172e-01 3.5192127e-02 1.0377734e-01 1.8383838e-01 1.8681550e-01 5.1711027e-02 2.2162306e-01 4.6176318e-02 2.6032970e-02 1.3342625e-01 4.2711869e-02 1.3267677e-02 1.1445349e-01 1.0634885e-01 4.1188176e-02 2.5542512e-01 3.6140725e-01 2.3073858e-01 1.2514746e-01 2.9142178e-01 7.1319770e-02 4.2212460e-02 1.9092784e-01 1.5710625e-01 1.0553588e-01
8.9781816e-02 1.9546838e-01 8.9489323e-02 4.1357370e-02 2.7353977e-01 1.7667628e-01 1.1061387e-01 1.1833996e-01 4.3939394e-01 3.4224937e-01 1.5448126e-01 1.8559936e-01 1.6585780e-01 4.3664713e-02 3.1332223e-01 2.0081413e-01 8.1161616e-02 2.8528130e-01 2.8828727e-01 1.1328994e-01 7.2963358e-02 1.5138593e-01 7.4007670e-02 2.8706252e-02 2.0029056e-01 9.4604690e-02 7.5407348e-02 1.6364261e-01 1.7129903e-01 1.2639381e-01
1.1619102e-01 2.9117349e-01 1.1077327e-01 5.7306469e-02 4.3576781e-01 1.2324397e-01 6.3495783e-02 6.9880716e-02 2.2525253e-01 4.1343724e-01 1.4354517e-01 1.9598656e-01 1.1826792e-01 4.4225044e-02 1.7415100e-01 5.0545258e-02 5.9292929e-02 1.2436067e-01 1.6235155e-01 6.2815251e-02 1.4549982e-01 3.4648188e-01 1.2640072e-01 6.2524577e-02 4.1028858e-01 7.5297610e-02 9.1373802e-02 1.7360825e-01 1.7524147e-01 1.7263545e-01
2.6309811e-01 2.8271897e-01 2.4621657e-01 1.4778367e-01 1.9617225e-01 2.1839151e-02 2.7975633e-03 2.7082505e-02 2.3636364e-01 3.9806234e-02 8.6764440e-02 1.3094501e-01 7.4070584e-02 4.0153307e-02 1.3835537e-01 1.8332983e-02 2.0022727e-03 6.8516765e-02 1.7656329e-01 5.6382405e-03 2.0597652e-01 2.3880597e-01 1.8133373e-01 9.8431970e-02 1.4369676e-01 1.5503876e-02 2.8602236e-03 5.6185567e-02 1.3167751e-01 1.1150466e-03
2.9906763e-01 4.0108218e-01 2.8643494e-01 1.7077413e-01 2.9962986e-01 1.3603460e-01 7.8350515e-02 1.2047714e-01 3.8131313e-01 1.4743050e-01 5.4535578e-02 2.6051980e-01 5.9887858e-02 2.6481235e-02 1.2866710e-01 1.3667498e-01 4.5328283e-02 1.2121614e-01 1.4645129e-01 3.6662383e-02 2.2305229e-01 4.5788913e-01 2.1181334e-01 1.0715690e-01 2.8283695e-01 1.3525628e-01 9.6805112e-02 1.9292096e-01 2.1131480e-01 7.5691985e-02
2.7351034e-01 3.0875888e-01 2.6314698e-01 1.4977731e-01 3.9839307e-01 1.8446721e-01 6.2980319e-02 8.8518887e-02 3.5303030e-01 2.5000000e-01 3.9760999e-02 2.0438472e-01 3.6658342e-02 1.9533132e-02 1.3240643e-01 1.0670832e-01 3.8611111e-02 1.8937299e-01 1.5770811e-01 4.2777386e-02 2.0704376e-01 3.7233475e-01 1.8631406e-01 9.6957334e-02 3.8717559e-01 1.5194381e-01 1.0023962e-01 2.8563574e-01 2.3240686e-01 1.1373475e-01
4.5051825e-01 2.9015894e-01 4.3404049e-01 2.9463415e-01 3.9929584e-01 2.0029446e-01 1.3734770e-01 2.4030815e-01 2.1969697e-01 1.2573715e-01 8.2346551e-02 2.3841938e-01 7.4777364e-02 5.0015129e-02 1.8846245e-01 1.1864992e-01 4.6262626e-02 1.9568100e-01 1.2745539e-01 3.8217045e-02 3.6286019e-01 3.5794243e-01 3.3263609e-01 2.0246756e-01 4.1359044e-01 1.3642053e-01 1.3282748e-01 3.1350515e-01 1.6341415e-01 6.3295291e-02
3.0380046e-01 2.4484275e-01 2.8809343e-01 1.7344645e-01 2.4140110e-01 1.1526900e-01 5.1101218e-02 7.3210736e-02 2.9797980e-01 1.4848357e-01 1.6983523e-02 5.5737270e-02 1.3146115e-02 1.1987344e-02 9.1137777e-02 7.6966984e-02 3.6641414e-02 1.0388331e-01 7.0749142e-02 4.0739052e-02 2.4190679e-01 2.5799574e-01 2.1589721e-01 1.1755309e-01 3.3104405e-01 1.3612946e-01 1.0894569e-01 2.4010309e-01 2.3181549e-01 1.3629805e-01
2.4747977e-01 2.8102807e-01 2.3854606e-01 1.3357370e-01 3.5821973e-01 1.6063432e-01 1.0290534e-01 1.0074553e-01 3.2070707e-01 1.9376580e-01 5.1131631e-02 9.2468175e-02 5.2631579e-02 2.1979910e-02 1.4005507e-01 8.7331391e-02 5.0505051e-02 1.3424891e-01 1.6178871e-01 3.6800575e-02 2.2625400e-01 3.2036247e-01 2.1634544e-01 1.0799253e-01 4.3340157e-01 1.8405759e-01 1.9273163e-01 3.0340206e-01 3.2584270e-01 1.2895186e-01
3.8851815e-01 1.1836321e-01 3.7219266e-01 2.4106045e-01 2.4374831e-01 1.5324213e-01 7.9498594e-02 1.3205765e-01 3.3383838e-01 1.1541702e-01 2.4189752e-02 1.1558522e-02 2.7375960e-02 2.0392306e-02 1.1214604e-01 9.4616517e-02 3.9166667e-02 1.7342300e-01 1.2084201e-01 3.0132803e-02 2.9420135e-01 9.8880597e-02 2.6938593e-01 1.5579532e-01 2.7359176e-01 1.4204771e-01 1.0878594e-01 2.8103093e-01 1.8174650e-01 8.2775810e-02
3.1752568e-01 2.1508285e-01 3.0440191e-01 1.8477200e-01 2.7435226e-01 1.3606527e-01 5.9887535e-02 1.0094433e-01 4.1010101e-01 1.4174389e-01 2.1365200e-02 3.2355021e-02 2.8977996e-02 1.3444204e-02 8.5562770e-02 1.0227717e-01 2.9520202e-02 1.2000379e-01 1.6249226e-01 4.4297500e-02 2.4581999e-01 2.1828358e-01 2.4279098e-01 1.1929807e-01 2.5972396e-01 1.7687807e-01 1.0750799e-01 2.4010309e-01 3.4654051e-01 1.4410337e-01
4.3489990e-01 2.1508285e-01 4.3196738e-01 2.7359491e-01 4.1680961e-01 3.8163303e-01 1.5583411e-01 2.6824056e-01 4.6969697e-01 3.3192923e-01 2.2813688e-02 2.8465347e-02 2.7894266e-02 1.5143874e-02 9.5081076e-02 1.1917565e-01 4.9267677e-02 2.2655806e-01 1.6122587e-01 9.6775977e-02 3.2159374e-01 1.8976546e-01 3.1221674e-01 1.6621608e-01 3.4557221e-01 2.2092538e-01 1.6884984e-01 4.2989691e-01 3.1302977e-01 2.2668241e-01
1.6986133e-01 3.5542780e-01 1.8215742e-01 8.2629905e-02 3.4395594e-01 4.4972701e-01 5.3420806e-01 2.9527833e-01 5.6969697e-01 7.2746420e-01 0.0000000e+00 1.9245050e-01 7.5672619e-02 7.9566976e-04 2.3068294e-01 5.5710938e-01 3.8762626e-01 5.5294563e-01 1.1662070e-01 3.9057253e-01 1.0387762e-01 2.8784648e-01 1.2998655e-01 4.0970311e-02 2.8481807e-01 3.2464030e-01 4.8162939e-01 5.0343643e-01 2.0342992e-01 4.2607897e-01
3.0664016e-01 6.2563409e-01 2.9092668e-01 1.7756098e-01 2.0348470e-01 8.5516226e-02 2.9779756e-02 5.5516899e-02 1.8232323e-01 1.6154170e-01 2.0785805e-02 1.7454915e-01 3.0297319e-02 1.5143874e-02 1.0976646e-01 7.3437078e-02 1.8959596e-02 9.8105702e-02 9.1996398e-02 2.7265315e-02 2.4048381e-01 6.2926439e-01 2.3258130e-01 1.2175580e-01 2.6170508e-01 1.1488197e-01 6.3370607e-02 1.9865979e-01 2.2255076e-01 1.0212515e-01
3.1610583e-01 1.8397024e-01 3.0737337e-01 1.8540827e-01 2.7128284e-01 1.7207533e-01 9.9554827e-02 1.2281312e-01 3.6969697e-01 1.8976411e-01 1.0392902e-02 4.0112270e-02 1.6208830e-02 8.4946152e-03 1.1894483e-01 2.0719801e-01 6.1691919e-02 1.5828755e-01 1.4490347e-01 1.3726628e-01 2.3514763e-01 2.0309168e-01 2.3681458e-01 1.1595556e-01 3.7198706e-01 2.7467474e-01 2.0519169e-01 3.6219931e-01 3.5915632e-01 2.7115309e-01
2.0299115e-01 1.0990869e-01 2.0295764e-01 1.0299046e-01 6.4159971e-01 2.8133243e-01 1.8509841e-01 2.7584493e-01 4.8383838e-01 4.0395956e-01 5.2399058e-02 1.3826025e-01 4.9568864e-02 1.7254454e-02 1.6731822e-01 1.1654700e-01 5.3055556e-02 2.2049631e-01 1.8570946e-01 9.7639678e-02 1.7467094e-01 2.2681237e-01 1.7192091e-01 7.1495281e-02 5.9321138e-01 2.0918590e-01 1.7947284e-01 4.5292096e-01 3.5048295e-01 2.4340811e-01
1.9210564e-01 1.7653027e-01 1.8575081e-01 9.7221633e-02 2.4591496e-01 1.5768971e-01 8.3083411e-02 1.0308151e-01 4.7626263e-01 2.6326874e-01 1.9083831e-02 1.4824965e-01 2.4690195e-02 9.1109791e-03 1.2180032e-01 1.2601015e-01 4.3510101e-02 1.3184315e-01 1.5362751e-01 3.6144162e-02 1.4799004e-01 2.3480810e-01 1.4602321e-01 6.4367873e-02 2.5312025e-01 1.6581774e-01 1.2404153e-01 2.3209622e-01 3.2268874e-01 1.1694871e-01
2.3990724e-01 4.3997295e-01 2.4158662e-01 1.2907741e-01 1.5094340e-01 2.6967671e-01 1.8610590e-01 1.4801193e-01 7.2222222e-02 3.5025274e-01 2.8607641e-03 2.3731436e-01 4.8108185e-02 5.1307625e-03 1.1316586e-01 3.2556253e-01 1.0871212e-01 3.1577950e-01 2.3664659e-01 2.2329091e-01 1.6506581e-01 4.4482942e-01 1.8402311e-01 7.4518285e-02 1.1107442e-01 2.8534699e-01 2.3258786e-01 3.7525773e-01 1.2339838e-01 2.5219730e-01
2.5599886e-01 2.6276632e-01 2.5464723e-01 1.3548250e-01 4.6555927e-01 3.3838415e-01 1.3805061e-01 1.4314115e-01 3.6313131e-01 3.3529907e-01 5.4064820e-02 1.1333098e-01 6.4081421e-02 2.3156605e-02 1.7003773e-01 2.6134827e-01 1.2012626e-01 1.9909074e-01 1.4771768e-01 2.0691514e-01 2.2234080e-01 2.9610874e-01 2.2321829e-01 1.0206941e-01 4.7236347e-01 3.2211776e-01 2.5607029e-01 3.3690722e-01 2.4719101e-01 3.7229437e-01
2.9812107e-01 1.3561042e-01 2.9023564e-01 1.6895016e-01 2.7985917e-01 2.0357647e-01 1.1895501e-01 1.4234592e-01 2.8131313e-01 1.2594777e-01 2.6000362e-02 3.7703324e-02 3.9344108e-02 1.5797594e-02 8.6956522e-02 1.3877790e-01 7.1414141e-02 1.6040917e-01 9.4669894e-02 5.9360447e-02 2.2447528e-01 1.4259062e-01 2.2999153e-01 1.0777133e-01 3.0000660e-01 2.3402315e-01 2.2891374e-01 3.1522337e-01 2.3082988e-01 1.1911321e-01
2.4747977e-01 1.4812310e-01 2.4179393e-01 1.3510074e-01 2.5683849e-01 1.8051040e-01 1.6023899e-01 1.2594433e-01 2.9595960e-01 2.4389217e-01 5.6165128e-02 1.0402670e-01 6.3139047e-02 2.4576110e-02 9.1511711e-02 2.1035239e-01 1.0969697e-01 2.0591021e-01 1.5939663e-01 1.2876746e-01 1.8498755e-01 1.9376333e-01 1.8546740e-01 8.4717853e-02 2.0755465e-01 2.0937994e-01 2.4568690e-01 3.1408935e-01 2.1919968e-01 2.1776204e-01
3.2651806e-01 2.1812648e-01 3.0806440e-01 1.9219512e-01 1.5915862e-01 8.8736887e-02 4.7914714e-02 4.2281312e-02 2.7626263e-01 1.0067397e-01 5.1638602e-02 5.7814710e-02 4.4856995e-02 3.0478261e-02 6.8497807e-02 8.9359209e-02 5.0202020e-02 1.3290396e-01 1.2084201e-01 3.7146055e-02 2.6965493e-01 2.1188699e-01 2.4528114e-01 1.3765729e-01 9.0272733e-02 9.3149382e-02 8.7140575e-02 1.5591065e-01 1.9258821e-01 7.3396301e-02
2.0299115e-01 1.9580656e-01 2.0447792e-01 1.0540827e-01 2.8003972e-01 2.8225262e-01 2.3594189e-01 1.3702783e-01 3.7878788e-01 4.7514743e-01 7.9304726e-02 1.5620580e-01 8.5379070e-02 3.0198096e-02 2.9462556e-01 4.8395770e-01 2.3919192e-01 3.8776283e-01 6.0618000e-02 3.9506378e-01 1.4621131e-01 1.8416844e-01 1.4602321e-01 6.5080613e-02 2.5774285e-01 2.4605369e-01 2.4129393e-01 2.8426117e-01 1.1669623e-01 3.2310114e-01
1.5518955e-01 8.4883328e-02 1.5175178e-01 7.5546129e-02 4.2728175e-01 1.7189130e-01 4.5056232e-02 9.7813121e-02 3.7373737e-01 3.3129739e-01 2.8824914e-02 4.1438296e-02 2.7847147e-02 9.4845330e-03 1.3492198e-01 8.5603990e-02 2.1454545e-02 1.3125592e-01 1.6178871e-01 5.0999820e-02 1.2273212e-01 9.6748401e-02 1.1365108e-01 5.1440228e-02 4.1689229e-01 1.3360693e-01 6.8809904e-02 2.3010309e-01 2.7045141e-01 1.4548078e-01
8.2966539e-02 2.4112276e-01 7.9331076e-02 3.8515376e-02 4.6285095e-01 1.6839458e-01 0.0000000e+00 0.0000000e+00 4.6717172e-01 4.4271272e-01 1.4680427e-01 3.7986209e-01 1.1355605e-01 4.1180580e-02 4.7955264e-01 1.3074173e-01 0.0000000e+00 0.0000000e+00 1.5151686e-01 2.0180203e-01 7.9686944e-02 2.8731343e-01 6.7732457e-02 3.2392843e-02 4.9415572e-01 1.0061996e-01 0.0000000e+00 0.0000000e+00 1.7346738e-01 2.2045127e-01
2.4227365e-01 2.7088265e-01 2.3688757e-01 1.2839873e-01 4.5382324e-01 2.3986259e-01 1.1206654e-01 1.6530815e-01 4.4292929e-01 2.4536647e-01 6.2502263e-02 2.8549328e-01 5.2395985e-02 2.8797269e-02 2.1868307e-01 1.0558176e-01 4.6540404e-02 1.4231862e-01 1.7262340e-01 3.1203792e-02 2.0028460e-01 3.6727079e-01 1.8885403e-01 9.1992725e-02 4.7566532e-01 1.4554045e-01 1.2803514e-01 2.1532646e-01 2.9252908e-01 1.0343697e-01
3.3503715e-01 2.5262090e-01 3.1760072e-01 1.9749735e-01 2.5115103e-01 1.0499356e-01 6.2816307e-02 1.6158052e-01 2.9343434e-01 1.6175232e-01 1.4086547e-02 2.9278642e-01 2.2616972e-02 1.0960071e-02 1.2434987e-01 7.8694385e-02 2.8585859e-02 1.7342300e-01 1.3097315e-01 1.8973785e-02 2.4866596e-01 3.5501066e-01 2.2914488e-01 1.2271431e-01 2.3396949e-01 9.2955341e-02 6.7571885e-02 2.7185567e-01 1.8884289e-01 7.2478027e-02
3.0900658e-01 3.1044978e-01 3.0619860e-01 1.7586426e-01 4.8090638e-01 2.9237470e-01 2.0103093e-01 2.6744533e-01 3.7676768e-01 2.2809604e-01 3.6972660e-02 2.1477192e-01 3.5621731e-02 2.3324704e-02 1.2676344e-01 1.3006579e-01 8.3434343e-02 2.5895056e-01 7.4126189e-02 5.4212788e-02 2.4439701e-01 4.0458422e-01 2.3367698e-01 1.2042863e-01 4.7302384e-01 2.2286579e-01 2.7460064e-01 4.9931271e-01 2.1703134e-01 1.4311951e-01
2.7540347e-01 2.6208996e-01 2.7130122e-01 1.5474019e-01 2.5106076e-01 2.1339182e-01 1.7314902e-01 2.0293241e-01 2.5959596e-01 1.5880371e-01 9.1399602e-02 1.9996464e-01 9.0043820e-02 4.4393143e-02 1.2604956e-01 2.4422447e-01 1.1477273e-01 2.6217087e-01 1.5207970e-01 1.0959330e-01 2.0668801e-01 2.4093817e-01 2.0075701e-01 9.9734565e-02 1.5961170e-01 1.4932425e-01 1.5183706e-01 2.8508591e-01 8.3382614e-02 1.0160042e-01
1.9305220e-01 1.7314846e-01 1.8326308e-01 9.9554613e-02 2.2370678e-01 8.6804491e-02 6.3542643e-02 3.6013917e-02 2.3989899e-01 2.5652906e-01 2.6797031e-02 7.2467291e-02 2.3842058e-02 1.1539079e-02 8.6548594e-02 9.3414847e-02 4.8989899e-02 7.8954347e-02 5.6678111e-02 9.1282838e-02 1.6897901e-01 2.2201493e-01 1.5130236e-01 7.6558199e-02 2.6962953e-01 1.5582463e-01 1.6605431e-01 1.9092784e-01 2.0205007e-01 2.3966942e-01
2.2807516e-01 2.5532634e-01 2.1746942e-01 1.2233298e-01 3.4521982e-01 1.3170971e-01 6.6846298e-02 8.1411531e-02 3.9747475e-01 2.1545914e-01 8.4120949e-02 1.7233911e-01 6.9170240e-02 3.4101734e-02 1.2747731e-01 1.3059152e-01 5.2500000e-02 1.0225421e-01 9.6921259e-02 7.5183450e-02 1.9637140e-01 3.3235608e-01 1.7724986e-01 9.2607157e-02 3.5151555e-01 1.4098049e-01 1.1573482e-01 1.8405498e-01 2.3930613e-01 1.7165158e-01
2.3422784e-01 4.0581671e-02 2.2355055e-01 1.2691410e-01 3.2581024e-01 1.0134348e-01 6.1059044e-02 8.9264414e-02 2.7323232e-01 1.1478517e-01 5.0950570e-02 1.5134371e-01 4.2029873e-02 2.2689663e-02 1.5168100e-01 7.3512182e-02 3.4747475e-02 1.1047547e-01 4.3310632e-02 3.3242127e-02 2.0882248e-01 2.1641791e-01 1.8541760e-01 9.9365906e-02 4.3736380e-01 1.2633039e-01 1.2092652e-01 2.3628866e-01 1.7642421e-01 1.1530893e-01
2.8297600e-01 2.9015894e-01 2.7910994e-01 1.6190880e-01 1.8849869e-01 1.8284154e-01 9.5056232e-02 9.3588469e-02 4.1111111e-01 1.9018534e-01 4.4975557e-02 2.0747878e-01 7.7274655e-02 2.5043052e-02 6.5132406e-02 2.6194911e-01 8.7171717e-02 2.0174275e-01 2.5944166e-01 9.7086909e-02 2.2056208e-01 3.3555437e-01 2.2859704e-01 1.0732894e-01 1.4607409e-01 1.9841663e-01 1.2811502e-01 2.2707904e-01 3.2367435e-01 1.1432507e-01
2.8202944e-01 2.1846466e-01 2.7219957e-01 1.5444327e-01 4.1671933e-01 2.1158211e-01 7.7225867e-02 1.1878728e-01 3.4090909e-01 2.5358045e-01 1.2420786e-02 1.2040311e-01 1.1332045e-02 8.5132929e-03 3.9908896e-02 7.9595638e-02 4.0732323e-02 1.3843531e-01 1.5222041e-01 3.7215151e-02 2.1095695e-01 2.9317697e-01 1.9562727e-01 9.7252261e-02 3.0396883e-01 1.6348925e-01 1.4456869e-01 2.8824742e-01 3.4141534e-01 1.5282697e-01
2.5363245e-01 1.7720663e-01 2.3840785e-01 1.3811241e-01 3.0865758e-01 8.0761916e-02 4.9414246e-02 1.0208748e-01 2.5808081e-01 1.4995788e-01 9.8424769e-02 1.2102192e-01 8.6933987e-02 4.3608680e-02 2.0358976e-01 4.6857632e-02 3.3005051e-02 1.9511271e-01 3.0700174e-01 1.8559208e-02 1.8676628e-01 1.2873134e-01 1.6783704e-01 8.5504326e-02 2.2208281e-01 3.8953731e-02 3.9305112e-02 1.6470790e-01 1.4449044e-01 3.0827758e-02
1.8737281e-01 3.0030436e-01 1.8381591e-01 9.6076352e-02 4.3125395e-01 1.6937611e-01 1.1583880e-01 1.4572565e-01 2.1515152e-01 3.4098568e-01 9.7084918e-02 3.0560467e-01 1.0653536e-01 3.5446528e-02 2.6535677e-01 1.4335927e-01 5.0252525e-02 2.1879144e-01 1.8162886e-01 6.2400674e-02 1.5901814e-01 3.6140725e-01 1.6111360e-01 7.0585922e-02 4.3009972e-01 1.3302481e-01 1.1277955e-01 2.7103093e-01 1.3522570e-01 1.4613669e-01
4.3348005e-01 1.7416300e-01 4.1814664e-01 2.7847296e-01 3.8205290e-01 2.0130667e-01 1.2886598e-01 2.2504970e-01 3.4090909e-01 1.8513058e-01 4.6061923e-02 6.1218175e-02 4.5799369e-02 2.8068839e-02 7.6316416e-02 7.6666567e-02 4.6237374e-02 1.6569426e-01 1.0015760e-01 2.5088788e-02 3.4791889e-01 2.0149254e-01 3.2616166e-01 1.8745085e-01 3.2642145e-01 1.4059241e-01 1.8450479e-01 3.8797251e-01 2.3910901e-01 9.8911190e-02
2.7776989e-01 3.9431857e-01 2.6839887e-01 1.5737010e-01 2.0655412e-01 1.9563217e-01 1.4353327e-01 9.2793241e-02 2.6262626e-01 2.3546757e-01 1.4043093e-01 3.1775990e-01 8.4578052e-02 6.4322243e-02 1.4610599e-01 3.1955418e-01 1.3068182e-01 2.5402538e-01 2.6464794e-01 2.3617733e-01 2.3016720e-01 3.9952026e-01 2.0528911e-01 1.1320291e-01 1.5089480e-01 1.6135479e-01 1.4680511e-01 1.9247423e-01 1.8194362e-01 1.7361931e-01
2.5031947e-01 2.7764626e-01 2.3923709e-01 1.3683987e-01 3.0892841e-01 1.4072756e-01 7.5234302e-02 1.3185885e-01 4.5757576e-01 1.2657961e-01 8.0644577e-02 3.1400283e-01 6.2290911e-02 3.5465205e-02 1.4192474e-01 1.5657764e-01 5.1994949e-02 2.0363705e-01 2.5184331e-01 4.7406824e-02 2.1949484e-01 4.4936034e-01 1.9219085e-01 1.0445340e-01 3.4887407e-01 1.4767490e-01 1.0998403e-01 3.2756014e-01 3.7256062e-01 9.1302637e-02
2.0725070e-01 2.6580994e-01 1.9832769e-01 1.0871686e-01 3.2454636e-01 1.0352126e-01 6.5206186e-02 1.0437376e-01 2.7323232e-01 1.9313395e-01 2.9005975e-02 2.6405587e-01 2.8365453e-02 1.2809163e-02 1.2502974e-01 5.7792832e-02 2.9368687e-02 1.1123319e-01 7.7784657e-02 2.6401614e-02 1.8214159e-01 6.4765458e-01 1.7261816e-01 8.2604208e-02 4.8953312e-01 1.3089036e-01 1.4464856e-01 2.9890034e-01 2.7754780e-01 1.4698937e-01
1.9210564e-01 2.4078458e-01 1.8747841e-01 9.7433722e-02 4.9715627e-01 1.7992761e-01 7.1368322e-02 1.2326044e-01 3.3030303e-01 2.8306655e-01 3.0852797e-02 2.2692716e-01 2.7564435e-02 1.2585030e-02 1.1710915e-01 5.3346652e-02 2.6666667e-02 1.4175033e-01 1.3083244e-01 4.5023009e-02 1.5937389e-01 3.8432836e-01 1.4701927e-01 7.0340149e-02 4.3406194e-01 1.1730749e-01 8.5223642e-02 2.5536082e-01 2.8247585e-01 1.5590975e-01
1.1434521e-01 4.0480216e-01 1.1028954e-01 5.3149523e-02 2.4428997e-01 1.2621925e-01 8.7511715e-02 2.5487078e-02 1.0808081e-01 3.6394271e-01 2.5710664e-03 1.8162129e-01 1.9648495e-02 0.0000000e+00 1.2924499e-01 1.8391564e-01 9.4318182e-02 9.7139610e-02 1.6361794e-01 1.2742009e-01 7.2394166e-02 4.2563966e-01 8.0681309e-02 2.8460480e-02 2.4717691e-01 1.5660079e-01 1.4920128e-01 8.8109966e-02 1.5986596e-01 2.4281779e-01
3.7905249e-01 4.1934393e-01 3.7136342e-01 2.3338282e-01 2.9358129e-01 2.5495368e-01 1.6070759e-01 1.9264414e-01 4.4646465e-01 1.9313395e-01 7.4995473e-02 2.1565594e-01 7.3175329e-02 4.0545538e-02 9.3007445e-02 1.9397963e-01 8.3636364e-02 2.2655806e-01 1.5728598e-01 1.0779680e-01 3.1412309e-01 5.2052239e-01 2.9777379e-01 1.6759241e-01 2.4123357e-01 2.9805668e-01 2.4872204e-01 4.4948454e-01 3.1500099e-01 2.4576938e-01
2.3233471e-01 3.8755495e-01 2.2527814e-01 1.2313892e-01 4.0714995e-01 1.8962027e-01 5.9864105e-02 1.0830020e-01 4.8434343e-01 2.7253580e-01 5.9098316e-02 1.8626238e-01 5.5270226e-02 2.3772969e-02 2.7813849e-01 2.1238021e-01 4.1161616e-02 1.7571510e-01 2.0681601e-01 4.7579564e-02 1.8214159e-01 4.0485075e-01 1.7271776e-01 8.2997444e-02 4.7170310e-01 1.8570694e-01 9.2971246e-02 2.8395189e-01 2.9765425e-01 1.2114653e-01
1.1472384e-01 4.0547853e-01 1.0925299e-01 5.4167550e-02 4.6736481e-01 1.2947058e-01 4.7961575e-02 6.2475149e-02 4.8737374e-01 3.3803707e-01 1.1540829e-01 5.5644448e-01 9.4331621e-02 3.4307188e-02 4.4283917e-01 1.0881125e-01 3.4520202e-02 1.6431142e-01 3.1741431e-01 1.2766193e-01 1.0387762e-01 5.1226013e-01 9.1239604e-02 4.2813606e-02 5.3774021e-01 8.9268562e-02 4.9049521e-02 1.2955326e-01 2.5763848e-01 1.8365473e-01
2.7067064e-01 8.3192425e-02 2.5630571e-01 1.4909862e-01 3.1795613e-01 1.1827495e-01 5.5295220e-02 1.1938370e-01 2.6414141e-01 2.6937658e-01 4.1209488e-02 6.3096711e-02 3.6281393e-02 1.9738587e-02 1.5018527e-01 7.7943341e-02 2.2916667e-02 1.5591968e-01 1.3012889e-01 1.2158147e-01 2.0348630e-01 1.3059701e-01 1.8780816e-01 9.3811443e-02 3.9774153e-01 1.2943505e-01 7.4960064e-02 2.8261168e-01 2.3851764e-01 2.5974026e-01
1.9778503e-01 3.9567129e-01 1.8768572e-01 1.0044539e-01 4.4389275e-01 1.2391878e-01 2.0981724e-02 5.3479125e-02 2.8030303e-01 2.4178602e-01 6.3371356e-02 2.9123939e-01 5.7060736e-02 2.2764373e-02 1.7659857e-01 5.4000060e-02 1.7606061e-02 1.1666982e-01 2.6816570e-01 4.0255379e-02 1.5759516e-01 4.5042644e-01 1.4368245e-01 6.7046795e-02 3.7660965e-01 8.1021820e-02 2.8610224e-02 1.4797251e-01 2.7813917e-01 1.0619179e-01
2.1718964e-01 3.1552249e-01 2.1014443e-01 1.1291622e-01 2.9637989e-01 1.7741243e-01 1.2851453e-01 7.0974155e-02 4.9040404e-01 2.6769166e-01 6.3335144e-02 2.3864038e-01 6.8274985e-02 2.5211151e-02 1.8917633e-01 1.3682519e-01 1.1229798e-01 1.6667930e-01 1.5193899e-01 8.4442325e-02 1.8285308e-01 3.9872068e-01 1.7939140e-01 8.2407589e-02 3.5481741e-01 1.6145181e-01 2.0447284e-01 2.2900344e-01 2.8976937e-01 1.8234291e-01
3.6485399e-01 1.4440311e-01 3.7613157e-01 2.1743372e-01 4.5562878e-01 5.0371143e-01 3.3973758e-01 3.1312127e-01 5.1818182e-01 5.0758214e-01 1.5741445e-01 2.5433168e-01 1.9026528e-01 7.9656629e-02 2.8089200e-01 3.7693394e-01 1.3328283e-01 2.9929911e-01 2.6239658e-01 1.5716595e-01 3.0345073e-01 1.6844350e-01 3.1719707e-01 1.5336217e-01 3.9642079e-01 3.2619262e-01 2.5710863e-01 3.8075601e-01 2.4876799e-01 2.4294897e-01
2.1908278e-01 2.1339195e-01 2.1885150e-01 1.1227996e-01 5.0708676e-01 2.9881602e-01 1.6628397e-01 2.2350895e-01 4.1717172e-01 2.7885425e-01 4.8560565e-02 8.2589286e-02 4.2878010e-02 1.6974288e-02 1.4178876e-01 1.3367080e-01 6.6439394e-02 2.4701648e-01 1.4912478e-01 3.7560632e-02 1.6755603e-01 2.0389126e-01 1.5697993e-01 7.1396972e-02 4.6443901e-01 1.8405759e-01 1.8386581e-01 3.7972509e-01 2.4088311e-01 1.2613144e-01
3.1610583e-01 3.1856611e-01 3.1559671e-01 1.8316013e-01 3.4251151e-01 2.9237470e-01 2.2626523e-01 2.3916501e-01 3.9797980e-01 2.4957877e-01 4.0883578e-02 1.1819307e-01 4.9333271e-02 2.3455448e-02 7.7064283e-02 1.9405474e-01 9.2651515e-02 2.4133359e-01 1.1155513e-01 1.0575847e-01 2.5649235e-01 3.5927505e-01 2.5394691e-01 1.2868659e-01 2.8745955e-01 2.8078703e-01 2.9233227e-01 4.8350515e-01 2.3240686e-01 2.1874590e-01
1.3067348e-01 3.1822793e-01 1.2535416e-01 6.2014846e-02 4.9535073e-01 1.9615361e-01 2.0932521e-02 9.7763419e-02 7.4646465e-01 4.2818029e-01 2.1184139e-01 3.0648868e-01 1.8140696e-01 6.8580757e-02 3.8606928e-01 1.2465828e-01 1.5204545e-02 1.9928017e-01 3.2529408e-01 1.1505189e-01 1.1668445e-01 2.9717484e-01 1.0647941e-01 4.8097719e-02 4.5321271e-01 1.0469482e-01 1.6653355e-02 1.5769759e-01 3.2150601e-01 1.6430539e-01
1.4430404e-01 3.9127494e-01 1.3406123e-01 6.9480382e-02 2.5765099e-01 6.0548433e-02 5.7872540e-03 2.5641153e-02 2.8787879e-01 3.0391744e-01 2.6652182e-02 2.1676096e-01 2.0119681e-02 8.9615576e-03 1.3634973e-01 2.5873464e-02 5.2373737e-03 6.6811896e-02 9.2418529e-02 5.2381742e-02 1.1312700e-01 4.5095949e-01 9.7166194e-02 4.6967165e-02 2.7359176e-01 4.2349448e-02 9.8642173e-03 8.8625430e-02 1.5454366e-01 1.6771612e-01
1.6560178e-01 1.7822117e-01 1.6377583e-01 8.0636267e-02 4.1103187e-01 2.5127293e-01 1.4843018e-01 1.1023857e-01 4.3686869e-01 4.0417018e-01 7.8254572e-02 1.6946605e-01 8.5143476e-02 2.6089003e-02 1.9209981e-01 2.7351519e-01 1.3290404e-01 2.3943929e-01 1.9316711e-01 1.3595346e-01 1.4941302e-01 2.5453092e-01 1.5439016e-01 6.2721195e-02 4.0632636e-01 2.6419652e-01 2.3474441e-01 3.1993127e-01 2.8681254e-01 2.7167782e-01
1.8074684e-01 4.1494758e-01 1.7275931e-01 9.1792153e-02 3.1940056e-01 1.1671063e-01 8.4676664e-02 6.9781312e-02 4.8282828e-01 2.0661331e-01 7.1048343e-02 2.7864215e-01 6.9877020e-02 2.5024374e-02 1.6419077e-01 1.4441073e-01 7.5530303e-02 1.9795416e-01 1.4856194e-01 6.2020646e-02 1.7182497e-01 5.3358209e-01 1.6574531e-01 7.4788635e-02 3.9047745e-01 1.3806987e-01 1.5391374e-01 2.5721649e-01 2.7597083e-01 1.4154532e-01
1.9636519e-01 2.3368279e-01 1.8436874e-01 1.0078473e-01 2.6072041e-01 5.8155941e-02 3.2075914e-02 6.8091451e-02 2.2777778e-01 2.4262848e-01 1.0863661e-02 1.3412748e-01 9.9420440e-03 5.4202668e-03 1.4175477e-01 3.0124373e-02 2.3732323e-02 1.1723811e-01 1.7177914e-01 5.1207109e-02 1.3340448e-01 2.2041578e-01 1.1922905e-01 5.7977782e-02 2.1019613e-01 3.3860155e-02 3.6581470e-02 1.3896907e-01 1.6124581e-01 1.0356815e-01
2.7161721e-01 2.6919175e-01 2.5699675e-01 1.5177094e-01 2.3769974e-01 7.9258941e-02 3.2849110e-02 9.1202783e-02 2.0151515e-01 1.1541702e-01 6.6594242e-02 1.1567362e-01 6.3704472e-02 3.0702393e-02 1.9118197e-01 7.1259050e-02 1.3593434e-02 1.0651639e-01 1.6207013e-01 9.8531017e-03 2.0953397e-01 2.3827292e-01 1.9154340e-01 9.8702320e-02 2.3529023e-01 6.6711296e-02 2.7707668e-02 1.2412371e-01 1.1827321e-01 3.4172898e-02
2.5647215e-01 2.6952993e-01 2.6038283e-01 1.3756098e-01 4.7639253e-01 3.4421201e-01 1.8137301e-01 1.3911531e-01 3.7929293e-01 4.4355518e-01 2.3610357e-02 2.4306047e-01 6.8180747e-02 1.6115114e-02 2.8170786e-01 2.3055547e-01 1.2275253e-01 2.2106460e-01 1.9682558e-01 1.7654741e-01 1.7609392e-01 2.9024520e-01 1.9522885e-01 8.1252458e-02 4.8755200e-01 2.2859000e-01 1.9193291e-01 2.5326460e-01 1.9534792e-01 2.5285321e-01
3.7289981e-01 2.4450457e-01 3.5312003e-01 2.2489926e-01 3.3050465e-01 1.5753635e-01 7.8397376e-02 1.4299205e-01 2.5909091e-01 1.4890480e-01 6.9273945e-02 6.8091407e-02 4.0286482e-02 3.1972477e-02 1.3743754e-01 1.0813531e-01 3.6893939e-02 1.5686683e-01 1.0733382e-01 4.3986568e-02 2.9811455e-01 2.2707889e-01 2.5842920e-01 1.4557118e-01 3.3434590e-01 1.2390488e-01 9.7444089e-02 2.7391753e-01 1.8923714e-01 8.6776860e-02
2.7871646e-01 3.3243152e-01 2.6867528e-01 1.5512195e-01 3.4964341e-01 1.8235078e-01 4.2104030e-02 1.0387674e-01 4.0454545e-01 2.8454086e-01 9.2341119e-02 9.0412836e-02 8.6698393e-02 3.6791322e-02 1.4267260e-01 8.5378676e-02 1.7843434e-02 1.2316727e-01 2.0189115e-01 5.1241657e-02 2.3194593e-01 3.2942431e-01 2.2277006e-01 1.0855781e-01 3.3170442e-01 1.3380097e-01 5.6924920e-02 2.1938144e-01 3.4456929e-01 1.4633346e-01
3.3409059e-01 2.1203923e-01 3.1780803e-01 1.9838812e-01 2.8843550e-01 1.2137292e-01 8.2802249e-02 1.4632207e-01 3.3030303e-01 1.8997473e-01 1.0056129e-01 1.5156471e-01 8.8912972e-02 4.8446203e-02 2.1290410e-01 8.0346682e-02 4.0606061e-02 1.7135821e-01 1.7121630e-01 6.6857372e-02 2.7499111e-01 2.5479744e-01 2.5295084e-01 1.3881243e-01 3.1915737e-01 9.4992772e-02 8.9217252e-02 2.5611684e-01 2.2866154e-01 1.1347239e-01
3.2509821e-01 3.3446060e-01 3.1020662e-01 1.9049841e-01 3.0883813e-01 1.3471566e-01 3.1443299e-02 1.1396620e-01 2.5000000e-01 1.4258635e-01 8.3432917e-02 2.9123939e-01 7.4164821e-02 4.2637440e-02 1.4015705e-01 6.5325803e-02 1.4676768e-02 1.3333965e-01 1.7248269e-01 4.9445158e-02 2.7392387e-01 4.2617271e-01 2.5145675e-01 1.3859123e-01 2.6830879e-01 8.4223496e-02 3.7963259e-02 2.0240550e-01 1.8687167e-01 9.2286501e-02
3.3314402e-01 2.0121745e-01 3.1649506e-01 1.9639449e-01 2.4401914e-01 1.1174161e-01 4.8898782e-02 1.3180915e-01 2.6717172e-01 1.2426285e-01 3.7189933e-02 6.5129950e-02 4.0003769e-02 2.3249993e-02 1.0619710e-01 5.2467930e-02 2.3265152e-02 2.0382648e-01 5.3863905e-02 4.1775493e-02 2.4831021e-01 1.9429638e-01 2.2969271e-01 1.2379571e-01 2.1283761e-01 7.2192954e-02 5.0000000e-02 2.8233677e-01 1.1255667e-01 7.9102715e-02
1.8879265e-01 2.5329726e-01 1.9307581e-01 9.6712619e-02 3.2969215e-01 2.8194589e-01 2.2157919e-01 1.7957256e-01 2.1666667e-01 3.4625105e-01 5.2833605e-02 2.2449611e-01 9.6546200e-02 2.1195447e-02 2.3292654e-01 3.3142067e-01 1.6237374e-01 3.3491192e-01 1.0240896e-01 1.4099747e-01 1.5759516e-01 3.9578891e-01 1.9786842e-01 7.1569013e-02 4.4859011e-01 3.6956079e-01 3.8170927e-01 5.3436426e-01 1.9219397e-01 2.6420045e-01
3.2178522e-01 2.0561380e-01 3.0806440e-01 1.8765642e-01 3.2084499e-01 1.4661677e-01 2.4718838e-02 4.9388668e-02 1.7424242e-01 1.7944398e-01 8.8647474e-02 2.7205622e-02 6.9641427e-02 4.2095787e-02 1.6041745e-01 6.9907171e-02 1.9547980e-02 1.0716045e-01 6.1743682e-02 5.7667593e-02 2.6111704e-01 1.4605544e-01 2.3651576e-01 1.2814589e-01 2.3793172e-01 7.7432061e-02 2.8091054e-02 1.1381443e-01 5.7953873e-02 8.5661813e-02
1.6986133e-01 2.9117349e-01 1.5914588e-01 8.3732768e-02 2.5990792e-01 7.7418563e-02 4.6696345e-02 5.5218688e-02 6.6262626e-01 1.6259478e-01 2.5457179e-02 4.8218706e-01 2.4501720e-02 1.1800567e-02 3.0618350e-01 8.3050440e-02 5.0328283e-02 2.1045653e-01 1.3069173e-01 1.2427622e-01 1.0707933e-01 3.0090618e-01 9.4327407e-02 4.4509438e-02 1.7678135e-01 3.6993917e-02 3.1837061e-02 7.6357388e-02 2.2353637e-01 8.0808081e-02
2.3706754e-01 5.1335813e-01 2.3370880e-01 1.2632025e-01 4.5472601e-01 2.2329918e-01 1.2748360e-01 2.1242545e-01 3.8383838e-01 3.9048020e-01 5.4608003e-02 1.8648338e-01 5.2207511e-02 2.3511481e-02 2.2459802e-01 1.3517289e-01 5.8939394e-02 3.1540064e-01 1.8373952e-01 9.6015920e-02 1.7965137e-01 4.8880597e-01 1.6967976e-01 8.0785490e-02 3.9576042e-01 1.5029446e-01 1.2851438e-01 4.1305842e-01 2.0382417e-01 1.8017841e-01
3.7006011e-01 2.6885357e-01 3.5996130e-01 2.2536585e-01 3.5352532e-01 2.1323845e-01 9.5337395e-02 1.1232604e-01 4.2070707e-01 1.8744735e-01 3.9435090e-02 5.7881011e-02 3.4161052e-02 2.4183878e-02 1.0480335e-01 7.1033737e-02 4.4393939e-02 1.3064974e-01 2.0625317e-01 3.7180603e-02 3.0238349e-01 2.8571429e-01 2.7635838e-01 1.5835136e-01 3.3962887e-01 1.5601867e-01 1.6453674e-01 2.8549828e-01 4.0114331e-01 1.1681753e-01
3.5728146e-01 3.2566791e-01 3.4869739e-01 2.1896076e-01 2.8211610e-01 1.7980492e-01 2.0658388e-01 1.4537773e-01 2.0858586e-01 1.5796125e-01 5.1421329e-02 2.1963402e-01 5.8285822e-02 3.0328839e-02 8.2741272e-02 1.3690029e-01 8.5328283e-02 1.6760750e-01 8.5242303e-02 4.9479706e-02 2.9775880e-01 4.3630064e-01 2.8731511e-01 1.5859713e-01 2.4915803e-01 2.3053041e-01 3.0183706e-01 3.2969072e-01 1.7859255e-01 1.2849272e-01
2.3138814e-01 4.0006764e-01 2.2831871e-01 1.2237540e-01 1.2187415e-01 2.6691614e-01 2.0564667e-01 1.1858847e-01 1.4595960e-01 3.4035383e-01 5.2326634e-02 2.6383487e-01 5.6448193e-02 2.5099085e-02 1.7476289e-01 4.3844444e-01 1.6825758e-01 2.9418450e-01 2.2032420e-01 2.7742769e-01 1.7289221e-01 4.3070362e-01 1.6484885e-01 7.9138812e-02 1.5452684e-01 3.0329579e-01 2.5702875e-01 3.0068729e-01 1.4587029e-01 2.9174866e-01
2.3754082e-01 6.2631045e-01 2.2790408e-01 1.2682927e-01 2.8653968e-01 1.3839642e-01 9.5009372e-02 9.6669980e-02 2.8030303e-01 2.3336142e-01 2.8861126e-02 2.9720651e-01 3.5763087e-02 1.3182716e-02 1.9107999e-01 1.7753177e-01 7.4267677e-02 1.7363137e-01 1.3463162e-01 1.1771209e-01 1.8356457e-01 6.8923241e-01 1.7261816e-01 8.3194062e-02 3.2774219e-01 1.5359315e-01 1.4464856e-01 2.4453608e-01 1.7386162e-01 1.7643972e-01
3.5728146e-01 1.4440311e-01 3.4600235e-01 2.1238600e-01 5.1701724e-01 2.2403534e-01 1.6155108e-01 3.2281312e-01 2.9797980e-01 2.3694187e-01 7.0432736e-02 7.9804632e-02 6.5306507e-02 3.5297106e-02 1.5025325e-01 7.7042089e-02 4.0782828e-02 2.1519227e-01 1.9963978e-01 9.2181087e-02 2.7997154e-01 1.3086354e-01 2.6241347e-01 1.3878785e-01 4.1953378e-01 1.1691941e-01 1.0966454e-01 3.6735395e-01 2.0520402e-01 1.5125279e-01
2.6688438e-01 2.5160636e-01 2.5450902e-01 1.4820785e-01 2.9972014e-01 1.0710999e-01 6.9493908e-02 1.1292247e-01 3.7323232e-01 1.7481045e-01 2.0894441e-02 6.7892504e-02 1.6915610e-02 1.2174121e-02 7.3936839e-02 4.7218133e-02 3.1717172e-02 1.3047926e-01 1.1535431e-01 2.5676105e-02 2.2803273e-01 2.6998934e-01 2.0523930e-01 1.1017991e-01 3.3896850e-01 1.2070320e-01 1.5071885e-01 3.3852234e-01 3.3609304e-01 1.1976912e-01
3.0285390e-01 7.1051742e-01 2.9403635e-01 1.7548250e-01 3.5948361e-01 1.6833323e-01 6.6049672e-02 1.6222664e-01 1.5909091e-01 2.1482730e-01 8.3034583e-02 3.4560644e-01 7.2091599e-02 4.1330001e-02 1.4032702e-01 7.6666567e-02 2.0040404e-02 1.7291154e-01 1.0916306e-01 7.2212318e-02 2.5329064e-01 7.8864606e-01 2.3048957e-01 1.2790012e-01 3.0396883e-01 1.1138924e-01 5.5934505e-02 2.6676976e-01 1.2438399e-01 1.4239801e-01
2.2002934e-01 6.6215759e-01 2.1477438e-01 1.1520679e-01 3.6959466e-01 2.0354579e-01 1.6776007e-01 1.0024851e-01 3.7323232e-01 2.4641955e-01 7.3148651e-02 4.5655057e-01 6.5636338e-02 3.0496939e-02 2.7698270e-01 1.6468892e-01 1.0795455e-01 1.7455958e-01 2.3735014e-01 4.2604646e-02 1.8463180e-01 7.1401919e-01 1.7744908e-01 8.4201730e-02 4.5849567e-01 1.7057174e-01 2.3346645e-01 2.3487973e-01 2.6000394e-01 1.1255411e-01
2.9480808e-01 5.2553263e-01 2.7855711e-01 1.6729586e-01 3.1849779e-01 1.0020858e-01 6.4948454e-02 1.0278330e-01 2.8232323e-01 1.2384162e-01 3.5089625e-02 2.1875000e-01 2.6245111e-02 2.0130819e-02 1.3784546e-01 4.3785862e-02 3.8131313e-02 1.2220117e-01 7.8628919e-02 3.2240233e-02 2.2838847e-01 5.9195096e-01 2.0359580e-01 1.1003244e-01 3.8123225e-01 7.6655897e-02 1.1102236e-01 2.0635739e-01 1.7327025e-01 8.4218811e-02
2.8486914e-01 5.2147447e-01 2.6826066e-01 1.5978791e-01 2.8040083e-01 9.6159745e-02 2.8256795e-02 8.7574553e-02 3.0656566e-01 9.5408593e-02 5.4535578e-02 1.9267150e-01 4.2406823e-02 2.6873466e-02 1.4756773e-01 5.0485174e-02 1.4345960e-02 1.2002273e-01 6.0055158e-02 2.1392148e-02 2.2803273e-01 5.2931770e-01 2.0245032e-01 1.0895104e-01 3.3434590e-01 7.9566512e-02 3.5638978e-02 2.0347079e-01 1.4606742e-01 5.1620097e-02
1.3128875e-01 6.2529591e-01 1.2362656e-01 6.2523860e-02 2.4564413e-01 8.2448930e-02 3.6105904e-02 5.1838966e-02 2.8333333e-01 2.0134794e-01 2.4117328e-02 2.9322843e-01 2.2899684e-02 8.3638714e-03 1.6572050e-01 7.8469072e-02 3.6616162e-02 1.1562796e-01 1.1057016e-01 4.7441372e-02 9.7474208e-02 6.6364606e-01 8.7753374e-02 4.0478765e-02 2.6302582e-01 8.1118840e-02 5.7428115e-02 1.6721649e-01 1.4902425e-01 1.1196379e-01
3.5112878e-01 5.8437606e-01 3.3487665e-01 2.1319194e-01 1.5636003e-01 1.0076069e-01 8.1443299e-02 8.6332008e-02 3.2676768e-01 9.2038753e-02 4.3454644e-02 1.2177334e-01 4.5705131e-02 2.5622061e-02 1.2383996e-01 1.0918677e-01 4.9772727e-02 1.2066679e-01 8.8056509e-02 3.4451308e-02 2.6574173e-01 5.3198294e-01 2.4896658e-01 1.3502753e-01 2.0161131e-01 1.1517304e-01 1.1757188e-01 1.9116838e-01 1.5375517e-01 6.2967336e-02
2.1860949e-01 2.9252621e-01 2.0793311e-01 1.1418876e-01 2.9294935e-01 1.2014600e-01 7.8889410e-02 8.8320080e-02 2.3030303e-01 1.8176074e-01 2.5384755e-02 8.9595120e-02 2.5726806e-02 1.1370980e-02 1.6983377e-01 1.1083907e-01 5.2525253e-02 1.4201553e-01 1.8796083e-01 6.4715393e-02 1.7218072e-01 3.1982942e-01 1.6071518e-01 7.6164963e-02 4.1623192e-01 1.4893617e-01 1.4856230e-01 2.8481100e-01 3.2426572e-01 1.5472911e-01
2.9291495e-01 2.8779168e-01 2.7980098e-01 1.6704136e-01 1.9888056e-01 1.2440955e-01 1.1384724e-01 1.4264414e-01 1.9898990e-01 1.1647009e-01 3.2880681e-02 7.1782178e-02 2.2569853e-02 1.8842058e-02 1.4467825e-01 9.5217352e-02 3.9494949e-02 1.6031445e-01 4.2888501e-02 2.6850739e-02 2.4795446e-01 3.1636461e-01 2.2257085e-01 1.2347621e-01 3.7660965e-01 1.6416839e-01 1.4984026e-01 3.5910653e-01 1.3207175e-01 9.3204775e-02
2.9622793e-01 3.5238417e-01 2.9769885e-01 1.6941676e-01 2.7272727e-01 3.1568615e-01 2.3664480e-01 1.4080517e-01 2.7323232e-01 3.0244313e-01 6.1379685e-02 1.0018122e-01 1.2307402e-01 3.1767022e-02 1.0932454e-01 4.8305645e-01 1.9401515e-01 2.5913999e-01 1.0381606e-01 2.5006564e-01 2.6716471e-01 3.5927505e-01 3.2167937e-01 1.3475718e-01 3.2311959e-01 5.2130085e-01 5.2364217e-01 4.6632302e-01 2.5231618e-01 4.5821855e-01
2.9149510e-01 3.7301319e-01 2.9154861e-01 1.6687169e-01 3.0802564e-01 2.7458438e-01 2.5421743e-01 1.7445328e-01 2.5353535e-01 2.1566976e-01 7.3764259e-02 9.4634017e-02 7.3269566e-02 3.8472314e-02 1.8975422e-01 2.2184336e-01 1.1654040e-01 2.3754499e-01 1.0874092e-01 8.0676589e-02 2.4439701e-01 3.5820896e-01 2.5145675e-01 1.2384487e-01 4.2217526e-01 3.1784886e-01 3.5974441e-01 4.0584192e-01 1.9672777e-01 1.7512790e-01
1.2717119e-01 2.8373351e-01 1.1934213e-01 6.0572641e-02 2.7516476e-01 1.0704865e-01 3.4653233e-02 2.8672962e-02 3.1313131e-01 2.9823083e-01 8.3324280e-02 2.1035184e-01 7.1526174e-02 2.6481235e-02 3.1502193e-01 7.7492715e-02 2.6035354e-02 7.4521690e-02 2.6802499e-01 7.2005030e-02 1.1454998e-01 3.3582090e-01 1.0309278e-01 4.7925678e-02 4.4660899e-01 9.5283833e-02 5.1190096e-02 8.5910653e-02 2.9410605e-01 1.5551620e-01
2.1955606e-01 2.8643896e-01 2.2520904e-01 1.1253446e-01 5.8562788e-01 3.9543586e-01 2.3898782e-01 2.7654076e-01 4.5303030e-01 4.7577928e-01 1.0812964e-01 3.0494165e-01 1.0695943e-01 3.9312810e-02 4.3774008e-01 2.2387118e-01 1.2527778e-01 3.4874029e-01 1.4335566e-01 1.4932355e-01 1.9316969e-01 3.5660981e-01 1.8790776e-01 8.4275462e-02 7.0547448e-01 2.5274811e-01 2.5447284e-01 4.8659794e-01 2.1584861e-01 2.4701561e-01
1.2712386e-01 2.9692256e-01 1.2231359e-01 6.1760339e-02 3.3249075e-01 1.3250721e-01 6.9072165e-02 7.5248509e-02 5.9494949e-01 2.9844145e-01 9.6360674e-02 2.1875000e-01 8.5379070e-02 2.9749831e-02 1.9675698e-01 1.3246913e-01 6.8535354e-02 1.8721349e-01 1.6488434e-01 1.0427290e-01 1.1419424e-01 3.6247335e-01 1.0194731e-01 4.9154542e-02 3.4491184e-01 1.2312872e-01 1.0199681e-01 2.2542955e-01 3.1716933e-01 1.9808474e-01
2.3943395e-01 6.2326682e-01 2.2845691e-01 1.2996819e-01 3.1497698e-01 1.2459358e-01 5.5459231e-02 1.1814115e-01 4.0101010e-01 1.4785173e-01 1.7910556e-01 5.0450849e-01 1.5747067e-01 7.1270345e-02 1.9730088e-01 9.9873825e-02 3.6994949e-02 2.2409547e-01 1.7712613e-01 1.0323646e-01 2.0170758e-01 5.6796375e-01 1.8342547e-01 9.3983484e-02 2.1746021e-01 6.7885244e-02 4.4121406e-02 1.9061856e-01 1.6538537e-01 7.4445756e-02
3.7573950e-01 1.7653027e-01 3.6390021e-01 2.3049841e-01 2.5593572e-01 2.0277897e-01 1.2977976e-01 1.6008946e-01 3.1666667e-01 1.4174389e-01 4.8198443e-02 1.6177511e-02 5.0369882e-02 3.0833137e-02 5.2962573e-02 1.1602127e-01 5.8333333e-02 1.5910210e-01 5.0627568e-02 5.1276205e-02 3.2906439e-01 1.6524520e-01 3.0673838e-01 1.7730043e-01 2.3330912e-01 2.4430732e-01 2.5167732e-01 3.9415808e-01 2.2136803e-01 1.8162141e-01
2.5031947e-01 6.8515387e-01 2.3239583e-01 1.3654295e-01 2.1991514e-01 4.4782529e-02 0.0000000e+00 0.0000000e+00 3.2373737e-01 2.0303286e-01 1.2094876e-01 7.2639675e-01 1.0022146e-01 5.2910171e-02 1.9124996e-01 4.4995043e-02 0.0000000e+00 0.0000000e+00 3.3106321e-01 7.7429073e-02 1.9637140e-01 6.9376333e-01 1.7266796e-01 9.1845262e-02 1.5221555e-01 2.4099892e-02 0.0000000e+00 0.0000000e+00 1.6637098e-01 8.1267218e-02
1.8453311e-01 1.9986473e-01 1.8395412e-01 9.1367975e-02 4.3396226e-01 2.6844979e-01 1.1984536e-01 7.8081511e-02 4.0454545e-01 3.8774221e-01 1.3289879e-02 3.9294554e-02 2.5632568e-02 5.2204155e-03 9.3857293e-02 2.1538438e-01 6.9621212e-02 1.2674749e-01 5.9633028e-02 1.3049487e-01 1.4265386e-01 1.9536247e-01 1.5125255e-01 6.0927055e-02 4.0962821e-01 3.5170902e-01 2.6876997e-01 2.7374570e-01 2.0027597e-01 3.4736980e-01
2.7682332e-01 2.0358471e-01 2.7019556e-01 1.5414634e-01 3.4097680e-01 1.9419054e-01 1.3671509e-01 1.5298211e-01 3.2575758e-01 1.9313395e-01 1.3905486e-02 2.8133840e-02 2.0637987e-02 9.0362683e-03 1.0742088e-01 1.1797398e-01 8.3787879e-02 1.5836333e-01 1.1436934e-01 4.8166881e-02 2.1913910e-01 1.9536247e-01 2.1320783e-01 1.0337200e-01 4.0566598e-01 2.2674661e-01 2.7763578e-01 3.3618557e-01 2.8405283e-01 1.5072806e-01
3.4166312e-01 3.6591140e-01 3.3598231e-01 2.0144221e-01 3.3113659e-01 2.8041224e-01 1.1862699e-01 1.5198807e-01 2.2525253e-01 2.1335299e-01 8.5569437e-02 1.4537659e-01 9.3860434e-02 4.5214962e-02 8.1381514e-02 2.3002974e-01 7.1237374e-02 2.5573025e-01 1.1563573e-01 6.3886240e-02 3.0309498e-01 4.0618337e-01 3.0723642e-01 1.5810558e-01 2.9142178e-01 3.0620640e-01 2.0063898e-01 4.6013746e-01 1.9101124e-01 1.5440115e-01
3.2746462e-01 2.3368279e-01 3.1221063e-01 1.9338282e-01 1.4128374e-01 1.0370529e-01 5.2108716e-02 6.6550696e-02 3.8030303e-01 1.1373210e-01 1.5933370e-02 4.7736917e-02 2.9920369e-02 1.3500237e-02 5.4220349e-02 8.1848770e-02 2.5010101e-02 9.1532487e-02 7.4266899e-02 4.1464561e-02 2.5649235e-01 2.6066098e-01 2.5295084e-01 1.3116890e-01 1.4970613e-01 1.6814623e-01 1.1054313e-01 2.1381443e-01 2.1959393e-01 1.4390660e-01
2.1340338e-01 1.6503213e-01 2.0869325e-01 1.1088017e-01 4.6917035e-01 1.9293295e-01 1.2436739e-01 9.7862823e-02 3.6313131e-01 3.3235046e-01 3.3279015e-02 1.7808522e-01 3.8166141e-02 1.4079246e-02 1.1027637e-01 1.4185718e-01 1.0494949e-01 1.5226369e-01 1.4842123e-01 9.3943037e-02 1.5901814e-01 2.6332623e-01 1.5752777e-01 6.9406213e-02 4.2283563e-01 1.6853431e-01 2.0734824e-01 2.5536082e-01 2.7123990e-01 2.4111242e-01
2.4511335e-01 2.8136625e-01 2.3840785e-01 1.3225875e-01 3.4521982e-01 1.8097049e-01 6.8322399e-02 7.5894632e-02 2.0404040e-01 2.7127211e-01 3.9072968e-02 1.8338932e-01 4.3396315e-02 1.7665363e-02 1.0871265e-01 1.0821041e-01 3.5277778e-02 9.7764728e-02 9.3684921e-02 3.3276675e-02 1.9245820e-01 4.2244136e-01 1.9134419e-01 8.9018875e-02 3.2774219e-01 1.9463283e-01 1.2939297e-01 1.9553265e-01 1.6577962e-01 1.4593992e-01
3.2746462e-01 3.2228610e-01 3.1055214e-01 1.9486744e-01 2.4627607e-01 1.0392000e-01 7.0173383e-02 1.0288270e-01 2.6212121e-01 1.2594777e-01 7.9703060e-02 1.2513260e-01 6.1207181e-02 4.0358761e-02 6.7681953e-02 6.4349446e-02 3.8636364e-02 1.1886721e-01 3.8526482e-02 4.5679422e-02 3.0167200e-01 3.8379531e-01 2.6888789e-01 1.5859713e-01 2.3264875e-01 1.1080711e-01 1.3362620e-01 2.8006873e-01 1.5592352e-01 1.3767546e-01
3.0711345e-01 1.4710856e-01 3.0080851e-01 1.7085896e-01 4.9173964e-01 2.9482854e-01 1.3556701e-01 2.6172962e-01 3.6313131e-01 3.4604044e-01 1.7128372e-02 4.7096004e-02 1.6255949e-02 1.1277592e-02 9.3041439e-02 9.2138072e-02 3.3686869e-02 1.6652775e-01 1.2801824e-01 6.5371806e-02 2.4546425e-01 1.6791045e-01 2.2177399e-01 1.1674204e-01 4.4991085e-01 2.1597734e-01 1.4760383e-01 4.5876289e-01 3.2761679e-01 2.5068871e-01
3.1799896e-01 2.6817721e-01 3.0384908e-01 1.8137858e-01 4.2312901e-01 1.8462058e-01 1.0656045e-01 1.5705765e-01 3.3939394e-01 2.2999158e-01 4.7655260e-02 1.2950849e-01 3.8024784e-02 2.5846193e-02 5.2078730e-02 4.4566948e-02 4.2878788e-02 1.7490055e-01 6.9904880e-02 2.1737628e-02 2.5008894e-01 3.0676972e-01 2.2595747e-01 1.2320586e-01 3.2179885e-01 1.0411270e-01 1.3913738e-01 3.1192440e-01 1.8785728e-01 9.5500459e-02
4.1407544e-01 5.3094352e-02 4.0778108e-01 2.5607635e-01 4.6646204e-01 3.3899761e-01 2.7905342e-01 3.0869781e-01 3.6565657e-01 2.6600674e-01 1.8649285e-02 5.9450141e-03 1.8187815e-02 1.3201394e-02 1.4688785e-01 1.1977649e-01 8.4242424e-02 2.0212161e-01 5.4426746e-02 4.7026795e-02 3.2301672e-01 5.8102345e-02 3.0922855e-01 1.6444652e-01 5.4764578e-01 2.6254718e-01 3.1980831e-01 4.9896907e-01 1.9554504e-01 1.7558704e-01
2.5883856e-01 2.2658099e-01 2.6991915e-01 1.4133616e-01 3.8376817e-01 4.0402429e-01 3.6176195e-01 2.4085487e-01 5.1616162e-01 4.9052233e-01 1.0161144e-01 1.8714639e-01 2.0011308e-01 4.3683391e-02 1.8768059e-01 5.4419143e-01 2.8131313e-01 5.1543853e-01 3.4386784e-01 3.0168042e-01 2.0811099e-01 2.4013859e-01 2.3611734e-01 9.7178529e-02 3.0594994e-01 3.6752336e-01 3.9105431e-01 4.6116838e-01 3.2840528e-01 3.1719795e-01
3.6248758e-01 2.4146094e-01 3.4842098e-01 2.2163309e-01 3.0495622e-01 1.4600331e-01 1.2164948e-01 1.3871769e-01 1.7626263e-01 7.5610783e-02 3.9435090e-02 1.4272454e-01 3.3642746e-02 2.4613465e-02 6.1936975e-02 8.7706913e-02 4.5454545e-02 1.1638568e-01 6.5542860e-02 1.1200475e-02 3.0345073e-01 3.5767591e-01 2.7685642e-01 1.5872002e-01 2.8415770e-01 1.7435554e-01 1.9464856e-01 2.6900344e-01 1.7543860e-01 7.1625344e-02
2.2239576e-01 2.1846466e-01 2.1905881e-01 1.1749735e-01 5.4319762e-01 2.2467947e-01 1.0025773e-01 1.5566600e-01 4.0050505e-01 2.9591407e-01 9.4079305e-02 1.7543317e-01 8.4672289e-02 3.8789835e-02 2.4764592e-01 8.0121369e-02 4.6742424e-02 2.2106460e-01 1.9190071e-01 8.0089272e-02 1.9174671e-01 2.5506397e-01 1.8008865e-01 8.9608730e-02 5.3774021e-01 1.1682238e-01 1.1900958e-01 3.3728522e-01 2.4423418e-01 1.6528926e-01
2.4937290e-01 4.3050389e-01 2.3764771e-01 1.3700954e-01 2.6442177e-01 1.0005521e-01 4.0159325e-02 6.2673956e-02 2.4444444e-01 2.0640270e-01 4.0702517e-02 1.7211810e-01 3.8637327e-02 2.0989992e-02 1.1500153e-01 7.3587286e-02 2.3762626e-02 8.6209509e-02 1.1535431e-01 5.1967166e-02 2.2198506e-01 5.3224947e-01 2.1081727e-01 1.0757471e-01 3.5944001e-01 1.4854809e-01 9.8242812e-02 2.1769759e-01 3.0258230e-01 1.7703004e-01
5.1441147e-01 1.1903957e-01 4.8932347e-01 3.5995758e-01 2.3246366e-01 1.3124962e-01 1.0414714e-01 2.0765408e-01 8.0808081e-02 5.2021904e-02 1.3467318e-01 1.5156471e-01 1.1336757e-01 8.2458283e-02 9.0287929e-02 4.5227867e-02 2.9116162e-02 1.4087895e-01 7.2296955e-02 1.4309799e-02 4.2298115e-01 1.7057569e-01 3.8194133e-01 2.5186787e-01 1.8127187e-01 7.0310757e-02 8.3706070e-02 2.8663230e-01 4.2972600e-02 2.4071888e-02
2.5931185e-01 1.0551234e-01 2.4213945e-01 1.4159067e-01 1.9039451e-01 6.4566591e-02 1.6806467e-02 5.7107356e-02 2.7929293e-01 2.1419545e-01 7.8254572e-02 2.4880658e-01 6.3657353e-02 3.3242560e-02 2.9496550e-01 5.8416199e-02 1.6202020e-02 1.4955484e-01 2.9279000e-01 1.3564252e-01 1.8712202e-01 1.1567164e-01 1.6350416e-01 8.5725521e-02 1.5333818e-01 3.6363284e-02 1.3370607e-02 9.2096220e-02 1.4094224e-01 9.9960645e-02
2.9244167e-01 3.6624958e-01 2.7828070e-01 1.6763521e-01 1.8705426e-01 1.0235568e-01 4.2174321e-02 6.2425447e-02 3.2979798e-01 1.8786858e-01 7.6842296e-02 2.4593352e-01 7.3929228e-02 3.5988181e-02 2.0698916e-01 1.3720071e-01 3.3863636e-02 1.0539875e-01 1.8261383e-01 6.2400674e-02 2.3372465e-01 4.3816631e-01 2.2351711e-01 1.1381734e-01 2.6830879e-01 1.3321885e-01 6.1485623e-02 1.4415808e-01 2.2117090e-01 1.2626263e-01
3.7337309e-01 3.5508962e-01 3.6161979e-01 2.2795334e-01 3.9035840e-01 1.9652169e-01 1.5988754e-01 2.4607356e-01 2.1565657e-01 1.5838248e-01 4.3744342e-02 2.8195721e-01 3.9532583e-02 2.8087516e-02 1.2584560e-01 8.6054616e-02 5.4368687e-02 2.2409547e-01 1.6474363e-01 3.1687465e-02 2.8744219e-01 4.3869936e-01 2.6639773e-01 1.4707039e-01 3.3302516e-01 1.0818756e-01 1.3578275e-01 3.4948454e-01 1.5848610e-01 7.1822117e-02
2.6830423e-01 2.8610078e-01 2.6881349e-01 1.4511135e-01 4.9625350e-01 3.4973315e-01 1.8783974e-01 2.5218688e-01 2.9343434e-01 3.9132266e-01 4.3780554e-02 6.0334158e-02 4.4244452e-02 2.1662389e-02 1.3566985e-01 1.7099769e-01 6.6565657e-02 1.9549157e-01 1.3660156e-01 9.2181087e-02 2.2945571e-01 2.6998934e-01 2.2351711e-01 1.1022906e-01 5.4236281e-01 3.4627587e-01 2.8610224e-01 4.8350515e-01 3.2820816e-01 3.1654204e-01
2.5978513e-01 2.5701725e-01 2.5333425e-01 1.4277837e-01 3.3086576e-01 1.7459052e-01 8.4559513e-02 1.1774354e-01 2.3535354e-01 2.2114575e-01 1.5100489e-02 9.2998586e-02 2.3370871e-02 9.5405661e-03 7.0809396e-02 8.6054616e-02 3.3989899e-02 1.3441940e-01 1.0522317e-01 2.2324945e-02 2.1807186e-01 3.2835821e-01 2.1121570e-01 1.0374066e-01 3.7264743e-01 2.1665648e-01 1.6198083e-01 3.6185567e-01 2.8976937e-01 1.4147973e-01
3.8141890e-01 2.3774095e-01 3.7965586e-01 2.3155885e-01 4.1708044e-01 3.5893503e-01 1.8090440e-01 3.0526839e-01 3.0707071e-01 3.9448189e-01 9.4332790e-02 1.0654615e-01 7.2892617e-02 5.2368518e-02 8.1925417e-02 1.1970138e-01 5.0404040e-02 1.9018754e-01 3.7541510e-02 8.0918425e-02 3.1412309e-01 2.2414712e-01 2.9528363e-01 1.6508553e-01 2.7953510e-01 1.8463971e-01 1.4824281e-01 3.4982818e-01 1.2063868e-01 1.9972452e-01
2.6309811e-01 2.2353737e-01 2.5886255e-01 1.4116649e-01 5.7028076e-01 2.7335746e-01 1.3889410e-01 1.6297217e-01 4.4595960e-01 3.4035383e-01 5.2942242e-02 1.6239392e-01 3.8119022e-02 2.1830489e-02 2.7157766e-01 1.0077508e-01 6.5025253e-02 2.1992802e-01 2.8322170e-01 5.4765557e-02 2.0064034e-01 2.5000000e-01 1.8058668e-01 9.0149430e-02 5.7340025e-01 1.4340600e-01 1.5087859e-01 2.8903780e-01 3.1342401e-01 1.3341204e-01
1.0823986e-01 1.0686507e-01 1.2231359e-01 4.4623542e-02 1.0000000e+00 6.2732348e-01 2.2797563e-01 2.6103380e-01 6.6565657e-01 9.4903117e-01 1.0722433e-01 1.6195191e-01 1.0634689e-01 2.4725531e-02 2.7433117e-01 3.2421065e-01 8.7954545e-02 4.1447244e-01 2.4677773e-01 3.3011346e-01 8.3600142e-02 1.1620469e-01 9.2833308e-02 2.8263862e-02 7.8603975e-01 3.0737065e-01 1.6765176e-01 3.5223368e-01 2.9036073e-01 4.6018628e-01
1.2754981e-01 1.1599594e-01 1.4048787e-01 5.4718982e-02 6.5784960e-01 6.1658794e-01 2.7835052e-01 3.4980119e-01 5.0353535e-01 9.6440607e-01 5.8989680e-02 2.2759017e-01 4.8532253e-02 2.0298918e-02 6.8181664e-01 3.5019677e-01 1.3103535e-01 2.7467323e-01 2.5944166e-01 3.6569794e-01 9.4983991e-02 1.6044776e-01 9.4925046e-02 3.5120920e-02 8.5471835e-01 3.2890920e-01 2.3266773e-01 3.6941581e-01 2.5290755e-01 5.3364817e-01
2.4795305e-01 3.4934055e-01 2.4656209e-01 1.3132556e-01 5.1430893e-01 2.9390835e-01 1.9154171e-01 1.0765408e-01 5.3737374e-01 3.9974726e-01 2.5203694e-02 9.6291549e-02 1.0776045e-02 1.0791972e-02 1.5497841e-01 1.4816595e-01 1.0015152e-01 1.8742186e-01 7.4829741e-02 1.0081810e-01 1.8605478e-01 3.2382729e-01 1.7291698e-01 8.1129571e-02 4.5585419e-01 1.9812556e-01 2.8234824e-01 2.7793814e-01 2.2550759e-01 2.1874590e-01
1.9305220e-01 2.5059182e-01 1.8975883e-01 9.4591729e-02 6.0278054e-01 2.6906325e-01 9.5196813e-02 2.1212724e-01 4.5151515e-01 6.2763269e-01 2.4044903e-02 1.4802864e-01 2.6433586e-02 1.0268996e-02 3.7077200e-01 1.5943161e-01 4.5454545e-02 2.4341731e-01 2.0146902e-01 2.5628429e-01 1.3376023e-01 2.3240938e-01 1.2784501e-01 5.5520055e-02 6.2755068e-01 1.7057174e-01 1.0031949e-01 3.2694158e-01 2.3950325e-01 4.0508986e-01
4.4105258e-01 2.0257017e-01 4.2091079e-01 2.8687169e-01 3.7591406e-01 1.4643273e-01 1.2947516e-01 2.2678926e-01 3.2878788e-01 1.3921651e-01 3.4474018e-02 2.4398868e-02 1.8329171e-02 2.5902226e-02 1.9311962e-01 7.3437078e-02 6.2373737e-02 2.7107407e-01 7.8206788e-02 5.7840333e-02 3.3404482e-01 1.5298507e-01 2.9578166e-01 1.8260912e-01 4.2415638e-01 1.0556801e-01 1.5551118e-01 4.6632302e-01 1.4488468e-01 1.1321002e-01
2.2523546e-01 1.6841393e-01 2.2472531e-01 1.1983033e-01 2.5602600e-01 2.3688731e-01 1.5759138e-01 1.3116302e-01 2.2171717e-01 3.7110362e-01 2.9295673e-02 6.2212694e-02 2.7705791e-02 1.1651146e-02 1.7911412e-01 2.7719530e-01 1.0143939e-01 2.8944876e-01 2.0709743e-01 2.0477316e-01 1.6079687e-01 1.4872068e-01 1.5359331e-01 7.0930004e-02 2.3859209e-01 2.4450136e-01 2.1485623e-01 3.6288660e-01 2.0480978e-01 2.8696051e-01
3.7053339e-01 1.6875211e-01 3.5153065e-01 2.2786850e-01 2.8969938e-01 9.4411386e-02 8.0037488e-02 1.2629225e-01 3.0252525e-01 7.4136479e-02 3.8638421e-02 5.8124116e-02 4.3349197e-02 2.5995614e-02 1.6979978e-01 7.2986451e-02 3.7424242e-02 2.0003789e-01 1.1141442e-01 3.0547379e-02 2.7321238e-01 1.4818763e-01 2.5544101e-01 1.4131931e-01 2.8217658e-01 7.1610831e-02 8.7939297e-02 2.7336770e-01 1.5158683e-01 4.1847042e-02
3.5964788e-01 1.3358133e-01 3.4897381e-01 2.1857900e-01 4.1247630e-01 2.1409729e-01 1.9264292e-01 2.1615308e-01 3.4292929e-01 1.3563606e-01 1.1044722e-01 5.8234618e-02 8.5002120e-02 5.6608355e-02 1.1014040e-01 1.1917565e-01 7.6641414e-02 1.6381891e-01 1.0564530e-01 4.7890497e-02 3.1412309e-01 1.3912580e-01 2.8930724e-01 1.6633897e-01 3.3764776e-01 1.6057863e-01 1.9904153e-01 3.1567010e-01 2.0914646e-01 1.0127246e-01
2.0630413e-01 3.0098072e-01 2.0019349e-01 1.0506893e-01 4.7187867e-01 2.0124532e-01 1.0079663e-01 1.2892644e-01 4.3787879e-01 2.5589722e-01 4.7619048e-02 1.4360856e-01 3.4585120e-02 2.1270158e-02 2.3333447e-01 1.0633280e-01 5.3005051e-02 2.0969881e-01 2.3158102e-01 1.1131379e-02 1.6150836e-01 2.9344350e-01 1.4313462e-01 7.2109713e-02 5.0934425e-01 1.2623337e-01 1.2971246e-01 2.9353952e-01 2.9469742e-01 8.3890857e-02
2.7918974e-01 2.8779168e-01 2.8097574e-01 1.4829268e-01 6.2444705e-01 4.5003374e-01 1.1305061e-01 2.6356859e-01 3.2777778e-01 4.7535805e-01 1.1989861e-01 1.7874823e-01 1.1398012e-01 5.1490667e-02 1.2101846e-01 1.5800463e-01 3.5479798e-02 2.3565069e-01 1.4462205e-01 8.3060404e-02 2.5329064e-01 3.2915778e-01 2.4353802e-01 1.2030574e-01 4.9151423e-01 2.6080081e-01 9.9520767e-02 3.7663230e-01 2.0047309e-01 2.2228781e-01
2.7303706e-01 2.3638823e-01 2.6756962e-01 1.4858961e-01 5.4048930e-01 2.8317281e-01 9.0909091e-02 1.4885686e-01 5.3535354e-01 3.4267060e-01 9.8460981e-02 1.4206153e-01 8.1892287e-02 4.0750993e-02 1.9702893e-01 1.0032445e-01 4.9924242e-02 1.7425649e-01 1.4307424e-01 9.4461258e-02 2.3194593e-01 2.5906183e-01 2.1524976e-01 1.0786964e-01 5.0406128e-01 1.6552668e-01 1.1365815e-01 2.7646048e-01 2.9686576e-01 2.0024925e-01
1.0951772e-01 1.4169767e-01 1.1174072e-01 4.8483563e-02 7.6257109e-01 3.1629961e-01 7.8069353e-02 1.2032803e-01 5.7424242e-01 5.6866049e-01 8.7742169e-02 1.7012907e-01 7.6850587e-02 2.3959746e-02 4.6731482e-01 1.7385165e-01 5.5479798e-02 2.9929911e-01 4.5151123e-01 1.0385833e-01 9.3916756e-02 1.5511727e-01 8.6807112e-02 3.4752261e-02 7.5170046e-01 1.7697509e-01 7.9840256e-02 2.4955326e-01 4.1711019e-01 2.2812541e-01
2.0251787e-01 3.4223876e-01 1.9010435e-01 1.0375398e-01 2.9322019e-01 7.5915588e-02 1.1872071e-02 2.8151093e-02 2.9141414e-01 2.8369840e-01 8.2925946e-03 1.5974187e-01 1.0564011e-02 4.7254566e-03 8.4542951e-02 2.7398083e-02 9.7121212e-03 7.7003220e-02 9.8328362e-02 4.8374169e-02 1.4229811e-01 3.8406183e-01 1.2933911e-01 6.1615218e-02 2.6170508e-01 4.8452038e-02 2.0231629e-02 9.7319588e-02 1.9554504e-01 1.3833137e-01
3.1847224e-01 3.0334799e-01 3.1055214e-01 1.8133616e-01 4.2005958e-01 2.6875652e-01 1.2617151e-01 1.8802187e-01 3.3030303e-01 3.8900590e-01 7.5176534e-02 1.9642857e-01 7.1950243e-02 3.6697933e-02 1.7085359e-01 1.5214648e-01 5.2676768e-02 2.5610911e-01 1.5222041e-01 9.8537927e-02 2.5542512e-01 3.6273987e-01 2.4413566e-01 1.2699076e-01 4.7104273e-01 2.2247771e-01 1.5455272e-01 4.4123711e-01 2.5310467e-01 2.3133937e-01
1.3564296e-01 2.0189381e-01 1.3274826e-01 6.3499470e-02 3.8178207e-01 1.9879149e-01 5.4592315e-02 1.2007952e-01 1.6515152e-01 3.9911542e-01 5.0081477e-02 1.8913543e-01 5.7437686e-02 1.5760238e-02 2.3860353e-01 1.3644967e-01 2.6818182e-02 1.2883122e-01 1.4574773e-01 8.9797272e-02 1.1775169e-01 2.9237740e-01 1.1907964e-01 4.7016319e-02 4.6708050e-01 1.9114009e-01 6.7364217e-02 2.2432990e-01 1.8470333e-01 2.4301456e-01
7.5252023e-02 1.1464322e-01 7.4217400e-02 3.3001060e-02 4.6014264e-01 1.7465186e-01 6.0098407e-02 7.5049702e-02 3.1212121e-01 4.4860994e-01 5.5042549e-03 7.0522454e-02 1.4701032e-02 8.4423177e-04 2.1021858e-01 1.1542043e-01 4.5479798e-02 1.3866263e-01 1.1310294e-01 1.0468748e-01 5.4891498e-02 1.7137527e-01 6.4196424e-02 2.2217853e-02 6.1368289e-01 1.9036392e-01 1.4009585e-01 2.9250859e-01 2.7951902e-01 3.2703660e-01
3.0664016e-01 3.0571525e-01 3.0163776e-01 1.7289502e-01 4.9535073e-01 2.8961413e-01 9.8430178e-02 1.5666004e-01 3.3484848e-01 2.7822241e-01 3.1975376e-02 5.4499646e-02 3.2323423e-02 1.7310487e-02 9.1783663e-02 9.1462132e-02 3.8106061e-02 1.3959083e-01 7.9613891e-02 3.0823764e-02 2.6396300e-01 3.5021322e-01 2.5643707e-01 1.3139009e-01 6.0245658e-01 2.7661515e-01 2.1198083e-01 4.9037801e-01 3.8497930e-01 2.0733307e-01
2.5363245e-01 8.6574231e-02 2.4289959e-01 1.3785790e-01 3.3763654e-01 1.3401018e-01 6.9306467e-02 1.3156064e-01 3.1767677e-01 1.7101938e-01 1.8468224e-03 2.9946075e-02 6.7850916e-04 4.0213075e-03 6.6900092e-02 5.1949710e-02 2.2050505e-02 1.0873271e-01 4.7954072e-02 1.6279038e-02 2.0206332e-01 1.9323028e-01 1.8332586e-01 9.3319898e-02 3.8321337e-01 1.7474362e-01 1.4305112e-01 3.6769759e-01 3.0455352e-01 1.3695396e-01
3.2935775e-01 1.1701048e-01 3.2147053e-01 1.9117709e-01 6.5153020e-01 2.3977057e-01 2.3664480e-01 3.2877734e-01 4.6262626e-01 3.0770851e-01 1.5737824e-01 5.0274045e-01 1.5709372e-01 7.0859435e-02 2.8306761e-01 2.2695046e-01 1.2027778e-01 5.4044327e-01 1.3041031e-01 1.6006799e-01 2.3799360e-01 8.9552239e-02 2.1968226e-01 1.1504621e-01 4.5057122e-01 1.0585907e-01 1.2452077e-01 3.4879725e-01 1.1728760e-01 1.1471861e-01
2.4085380e-01 1.2614136e-01 2.3522908e-01 1.2797455e-01 5.1792001e-01 2.1688853e-01 8.8589503e-02 1.3906561e-01 3.0151515e-01 3.3951137e-01 5.0624661e-02 3.1780410e-02 4.5092588e-02 2.1923877e-02 1.9084203e-01 6.9681858e-02 4.5404040e-02 1.5127865e-01 1.6516576e-01 4.6266739e-02 1.9637140e-01 9.9946695e-02 1.8183176e-01 8.9633307e-02 5.3443835e-01 1.3186056e-01 1.2955272e-01 2.5405498e-01 2.3970037e-01 1.6712580e-01
2.2570874e-01 2.6547176e-01 2.2182296e-01 1.1851538e-01 4.9354518e-01 2.3848230e-01 1.2375820e-01 2.2067594e-01 2.7171717e-01 3.5404381e-01 1.1837769e-01 3.4184936e-01 1.1270791e-01 4.4561242e-02 1.6568651e-01 1.1940097e-01 4.3863636e-02 2.4928964e-01 1.4729555e-01 4.9168774e-02 1.9815012e-01 4.2537313e-01 1.8980029e-01 9.0223162e-02 4.2085452e-01 1.5339911e-01 1.0910543e-01 3.4707904e-01 1.7997240e-01 1.4777647e-01
2.2192248e-01 3.4866419e-01 2.1712390e-01 1.1567338e-01 4.4208721e-01 2.3050733e-01 9.8406748e-02 1.0720676e-01 4.0353535e-01 3.0855097e-01 3.4474018e-02 1.1366248e-01 2.9967488e-02 1.5947015e-02 1.2027059e-01 1.1279178e-01 4.6464646e-02 1.0035992e-01 9.2981370e-02 6.1364233e-02 1.9281395e-01 4.4749467e-01 1.8223019e-01 8.9805348e-02 5.5358912e-01 2.6109187e-01 2.2028754e-01 2.7903780e-01 3.2347723e-01 2.2602650e-01
3.1705239e-01 2.2387555e-01 3.0384908e-01 1.8324496e-01 3.6237248e-01 1.6308815e-01 4.1049672e-02 9.3439364e-02 2.8838384e-01 2.4410278e-01 3.3749774e-02 2.6498409e-02 2.9025114e-02 1.9514455e-02 7.1897202e-02 3.7371947e-02 1.7873737e-02 9.6173518e-02 3.7400799e-02 2.7714440e-02 2.8175027e-01 2.1801706e-01 2.5494298e-01 1.4456351e-01 3.6472297e-01 1.2526317e-01 9.6325879e-02 2.9910653e-01 2.4462842e-01 1.4941624e-01
1.8831937e-01 2.6750085e-01 1.8658006e-01 9.4209968e-02 3.9938612e-01 2.3967855e-01 1.2331303e-01 1.3856859e-01 2.8232323e-01 2.9738837e-01 1.4195184e-02 2.7024399e-01 1.9224426e-02 6.1412258e-03 2.6474488e-01 2.3678914e-01 1.1113636e-01 2.5497253e-01 7.5111161e-02 9.1179194e-02 1.3127001e-01 3.8619403e-01 1.2958813e-01 5.4635273e-02 4.7302384e-01 2.1704456e-01 1.6956869e-01 3.3886598e-01 1.4271634e-01 1.8194936e-01
2.2286904e-01 4.9814001e-01 2.2513994e-01 1.1151644e-01 6.4069694e-01 4.1660021e-01 1.0578725e-01 2.2519881e-01 5.4090909e-01 5.0737152e-01 6.6702879e-02 3.5754066e-01 6.6013287e-02 2.6425201e-02 3.7961043e-01 2.4557635e-01 4.7095960e-02 3.3453306e-01 1.0860021e-01 1.7029421e-01 1.7965137e-01 5.3757996e-01 1.7784750e-01 7.4346245e-02 6.9755002e-01 2.8893675e-01 1.1142173e-01 4.4948454e-01 2.4403706e-01 2.9292929e-01
3.5401581e-02 5.3364897e-01 2.8954461e-02 1.4973489e-02 2.5593572e-01 9.0178517e-02 0.0000000e+00 0.0000000e+00 4.0909091e-01 4.8209773e-01 9.6396886e-02 2.4350248e-01 8.1750931e-02 2.3044539e-02 3.7213176e-01 5.5877670e-02 0.0000000e+00 0.0000000e+00 2.9461924e-01 2.0650056e-01 4.0803984e-02 5.0373134e-01 3.3667015e-02 1.5434526e-02 3.5944001e-01 5.4438203e-02 0.0000000e+00 0.0000000e+00 2.9430317e-01 2.9083038e-01
3.3603105e-02 5.3195807e-01 3.1442195e-02 1.1410392e-02 3.0739370e-01 3.0832464e-01 2.1677601e-01 6.7793241e-02 4.9343434e-01 5.8024431e-01 3.9145392e-02 2.4725955e-01 3.2417660e-02 9.2043676e-03 4.6765476e-01 4.6803557e-01 2.3363636e-01 2.5838227e-01 1.8528733e-01 2.2995868e-01 2.6609747e-02 5.2958422e-01 2.0319737e-02 9.4376720e-03 5.8396619e-01 2.7079392e-01 2.7100639e-01 1.7182131e-01 2.4147447e-01 3.3818707e-01
2.1576980e-01 1.5995942e-01 2.1325409e-01 1.1003181e-01 4.2619843e-01 2.8409300e-01 1.5784911e-01 1.2892644e-01 3.8282828e-01 3.7615838e-01 6.0438168e-02 3.1112977e-01 4.1040381e-02 2.6257102e-02 3.5479485e-01 2.9191576e-01 1.4022727e-01 2.8300815e-01 1.4799910e-01 1.5951522e-01 1.5403771e-01 2.0415778e-01 1.4129190e-01 6.6997641e-02 4.1821304e-01 1.7901253e-01 1.4353035e-01 2.3773196e-01 1.5060122e-01 1.7250426e-01
3.5444176e-01 5.1673994e-01 3.5947758e-01 2.1756098e-01 3.2265054e-01 3.1783326e-01 2.3641050e-01 1.9333996e-01 4.1010101e-01 2.8327717e-01 5.1674814e-02 1.5885785e-01 8.7546530e-02 3.0459583e-02 1.8441717e-01 3.3254724e-01 9.6691919e-02 2.2011745e-01 1.8008105e-01 1.8020950e-01 2.9491284e-01 5.2531983e-01 3.1420887e-01 1.5328844e-01 4.1491118e-01 3.8120325e-01 3.2268371e-01 4.1408935e-01 3.1973191e-01 3.0998295e-01
3.6722041e-01 5.3128170e-01 3.5180706e-01 2.2273595e-01 2.7191478e-01 1.6183056e-01 9.6180881e-02 1.5044732e-01 3.9393939e-01 1.4406066e-01 6.9382582e-02 2.2648515e-01 6.6908543e-02 3.8490992e-02 1.0408947e-01 7.1108841e-02 4.9166667e-02 2.4038644e-01 1.5222041e-01 5.9809571e-02 3.0522946e-01 5.4024520e-01 2.8382888e-01 1.5758946e-01 2.3000726e-01 1.0702331e-01 1.2867412e-01 3.7628866e-01 2.2807018e-01 9.5238095e-02
2.9480808e-01 6.2056138e-01 2.8394720e-01 1.6750795e-01 3.0766453e-01 1.5149377e-01 6.9985942e-02 1.6277336e-01 2.8686869e-01 1.6533277e-01 4.4758284e-02 2.7333805e-01 3.6846817e-02 2.0635116e-02 1.1082027e-01 8.6129720e-02 3.7828283e-02 1.7270316e-01 1.3167670e-01 1.5484433e-02 2.2909996e-01 6.7030917e-01 2.0952239e-01 1.0922139e-01 2.3793172e-01 1.0750842e-01 8.4824281e-02 2.7347079e-01 1.7898679e-01 6.1589925e-02
3.2604477e-01 3.7166047e-01 3.1773893e-01 1.8718982e-01 3.8954591e-01 2.5280658e-01 8.6410497e-02 1.1774354e-01 2.8282828e-01 3.5636057e-01 5.8120587e-02 1.5178571e-01 6.2149555e-02 3.0478261e-02 1.5586226e-01 1.4621324e-01 6.6035354e-02 1.7164236e-01 9.8750492e-02 9.3424817e-02 2.5329064e-01 3.3928571e-01 2.4284078e-01 1.2372198e-01 3.6472297e-01 1.7115386e-01 1.0998403e-01 2.3522337e-01 1.3483146e-01 1.9598583e-01
3.1421269e-01 4.5722016e-01 2.9991017e-01 1.8226935e-01 3.5957389e-01 1.4750629e-01 6.9681350e-02 1.2142147e-01 3.0505051e-01 1.6954507e-01 8.4917617e-02 2.1565594e-01 6.1678368e-02 4.5644549e-02 1.4124486e-01 1.4073062e-01 5.1035354e-02 1.7169919e-01 1.8275454e-01 5.8324005e-02 2.6396300e-01 4.5495736e-01 2.3492206e-01 1.3384782e-01 3.3302516e-01 1.2070320e-01 8.3785942e-02 2.4652921e-01 2.1230041e-01 9.5041322e-02
1.5802925e-01 2.2455191e-01 1.4871122e-01 7.6945917e-02 3.7654600e-01 9.3736581e-02 2.3711340e-02 2.7311133e-02 4.1666667e-01 2.5379107e-01 3.5813869e-02 1.3410537e-01 2.8224096e-02 1.1520402e-02 1.8264949e-01 3.7514645e-02 2.5555556e-02 1.0409168e-01 1.0860021e-01 5.9118610e-02 1.1810744e-01 2.5986141e-01 1.0314259e-01 4.9080810e-02 3.7859077e-01 5.9308632e-02 3.5015974e-02 8.1821306e-02 2.1998817e-01 1.2429490e-01
1.5518955e-01 2.3233006e-01 1.5244282e-01 7.5206787e-02 3.2626162e-01 1.8796393e-01 1.0210872e-01 1.2117296e-01 3.0757576e-01 3.6183656e-01 1.0501539e-03 1.4648161e-01 1.0917401e-02 9.7871116e-04 2.9088622e-01 2.1470844e-01 6.5984848e-02 2.0780451e-01 2.0948950e-01 1.7257438e-01 1.0316613e-01 2.6705757e-01 1.0294337e-01 4.2322061e-02 4.9481609e-01 1.9143115e-01 1.4241214e-01 2.8635739e-01 2.2195939e-01 2.6072412e-01
1.2788111e-01 3.2566791e-01 1.1927303e-01 6.0318134e-02 2.9141464e-01 9.4840807e-02 5.4756326e-02 4.7788270e-02 2.6262626e-01 2.6095198e-01 6.6702879e-02 2.2162306e-01 6.1112944e-02 2.1363546e-02 1.9468335e-01 6.7428726e-02 5.9015152e-02 1.8213677e-01 1.9907694e-01 1.1259898e-01 1.0672359e-01 3.6167377e-01 9.3082325e-02 4.3993315e-02 3.2179885e-01 6.6138875e-02 7.4680511e-02 1.3216495e-01 1.9455943e-01 1.5846779e-01
1.8169341e-01 4.9036185e-01 1.7345035e-01 9.2513256e-02 2.6442177e-01 1.4305871e-01 3.6269916e-02 4.0556660e-02 4.6262626e-01 2.8053917e-01 1.4778200e-01 3.4428041e-01 1.3226217e-01 4.8931823e-02 2.2266037e-01 1.2353171e-01 3.2247475e-02 1.1208562e-01 2.3608375e-01 7.1935934e-02 1.8143010e-01 5.1785714e-01 1.6679117e-01 7.8745576e-02 3.2510071e-01 1.3195758e-01 4.9472843e-02 1.1216495e-01 2.9450030e-01 1.3918405e-01
1.8358654e-01 3.9803855e-01 1.7082441e-01 9.2046660e-02 1.9572086e-01 7.0210417e-02 0.0000000e+00 0.0000000e+00 3.0353535e-01 2.0050548e-01 7.4162593e-02 2.0858380e-01 6.3987184e-02 2.5902226e-02 2.6739640e-01 6.6001742e-02 0.0000000e+00 0.0000000e+00 3.1178590e-01 4.6059450e-02 1.3269299e-01 3.3981876e-01 1.1788436e-01 5.5814982e-02 1.9104537e-01 4.4813769e-02 0.0000000e+00 0.0000000e+00 1.7602996e-01 7.1362980e-02
1.9636519e-01 4.3050389e-01 1.9141732e-01 9.9639449e-02 3.8846258e-01 1.9189007e-01 1.1302718e-01 1.1217694e-01 4.8989899e-01 3.2771693e-01 6.1017563e-02 2.4460750e-01 5.8285822e-02 2.0635116e-02 6.0577217e-02 2.1223000e-01 8.6994949e-02 1.9397613e-01 2.9884055e-01 1.3225682e-01 1.4549982e-01 4.3283582e-01 1.3641118e-01 6.1787259e-02 2.4783728e-01 1.4641364e-01 1.2492013e-01 2.2037801e-01 3.1618372e-01 1.6581398e-01
2.7398362e-01 6.6689212e-01 2.5955359e-01 1.5457052e-01 2.7200506e-01 7.0425127e-02 4.6790066e-02 7.4502982e-02 2.4191919e-01 1.3500421e-01 4.6858591e-02 2.2250707e-01 3.3925458e-02 2.2334786e-02 2.4210491e-01 7.5690209e-02 3.3535354e-02 1.7626444e-01 1.5601959e-01 2.8716333e-02 2.1131270e-01 6.3912580e-01 1.8770855e-01 1.0064392e-01 3.4491184e-01 7.6752918e-02 6.9113419e-02 2.2329897e-01 1.6597674e-01 6.4279155e-02
1.1131620e-01 4.1359486e-01 1.0517587e-01 5.1113468e-02 3.5903223e-01 1.1247776e-01 9.3626992e-02 6.3717694e-02 3.1919192e-01 3.3277169e-01 6.8730762e-02 3.3566124e-01 6.4269896e-02 2.0653794e-02 3.1366217e-01 1.2082795e-01 1.0090909e-01 2.4284902e-01 4.1802218e-01 1.2880201e-01 6.8125222e-02 3.4728145e-01 6.2005080e-02 2.7182462e-02 2.5840322e-01 5.4030717e-02 6.3841853e-02 8.8109966e-02 1.7149616e-01 1.2390135e-01
2.7918974e-01 6.4964491e-01 2.6750052e-01 1.5728526e-01 2.5819265e-01 1.1919514e-01 1.4514995e-01 1.1645129e-01 2.5555556e-01 1.4995788e-01 3.6248416e-02 2.2096004e-01 3.5103426e-02 1.8729992e-02 2.2772546e-01 1.4478625e-01 9.8434343e-02 1.4434552e-01 1.2759611e-01 6.5855479e-02 2.1202419e-01 6.3219616e-01 1.9139399e-01 1.0088970e-01 3.4028924e-01 1.3069632e-01 1.9480831e-01 2.2312715e-01 1.5907747e-01 1.1399711e-01
1.5660940e-01 6.0534325e-01 1.5119895e-01 7.5461294e-02 3.4007403e-01 1.7544936e-01 1.4055764e-01 1.3608350e-01 2.6919192e-01 2.3820556e-01 3.9254029e-02 4.1522277e-01 3.2040711e-02 1.4303378e-02 3.5139545e-01 1.8857212e-01 1.2131313e-01 3.2600871e-01 1.4842123e-01 1.3968465e-01 1.0352188e-01 6.1007463e-01 9.5423079e-02 4.2371215e-02 4.4396751e-01 1.3942816e-01 1.5974441e-01 3.1364261e-01 1.3029765e-01 1.8227732e-01
1.5045672e-01 3.3412242e-01 1.4470320e-01 7.1346766e-02 4.3035118e-01 1.7072572e-01 1.1773664e-02 5.5467197e-02 3.6919192e-01 2.8117102e-01 4.8017382e-02 3.8229314e-01 4.1982755e-02 1.8673958e-02 3.8063025e-01 1.4996846e-01 1.0540404e-02 1.3415420e-01 2.5099904e-01 4.7786852e-02 9.6762718e-02 2.8944563e-01 8.7006325e-02 3.9839756e-02 3.6538335e-01 8.9947706e-02 8.0271565e-03 7.6701031e-02 1.3739405e-01 8.1201627e-02
1.1557575e-01 6.1447413e-01 1.0690346e-01 5.4209968e-02 2.5819265e-01 9.3031102e-02 0.0000000e+00 0.0000000e+00 3.4444444e-01 2.2388374e-01 1.5426399e-01 5.6727369e-01 1.3480658e-01 4.1666200e-02 3.3575824e-01 6.7503830e-02 0.0000000e+00 0.0000000e+00 3.1178590e-01 8.3924105e-02 9.1070793e-02 5.9221748e-01 8.0133473e-02 3.5735352e-02 2.3859209e-01 4.2970380e-02 0.0000000e+00 0.0000000e+00 1.7938104e-01 9.6090778e-02
3.6012116e-01 4.3862022e-01 3.6348559e-01 2.1785790e-01 2.8978965e-01 3.4850623e-01 2.4109653e-01 1.8568588e-01 1.9898990e-01 2.4241786e-01 4.1245700e-02 1.6526697e-01 6.9123121e-02 2.3791647e-02 8.5970697e-02 3.3149578e-01 1.6611111e-01 3.0422428e-01 1.1957562e-01 1.2130509e-01 2.6858769e-01 4.0644989e-01 2.7635838e-01 1.3475718e-01 2.0755465e-01 2.8117511e-01 2.9249201e-01 3.7972509e-01 1.3660556e-01 1.6397744e-01
2.1434995e-01 4.8089280e-01 2.1235575e-01 1.1028632e-01 3.6092805e-01 2.5372677e-01 2.6054358e-01 2.0402584e-01 1.6565657e-01 3.3150800e-01 4.6098135e-02 5.6219059e-01 5.5552938e-02 1.8991479e-02 2.2051875e-01 2.0704780e-01 1.4489899e-01 2.4000758e-01 9.8469072e-02 1.3277504e-01 1.6186411e-01 6.7004264e-01 1.5872304e-01 7.1028313e-02 3.8717559e-01 2.1772371e-01 2.8993610e-01 3.3171821e-01 1.0782574e-01 2.1172767e-01
3.3456387e-01 5.8978695e-01 3.2886463e-01 1.9380700e-01 4.2123319e-01 2.8593338e-01 1.0454545e-01 2.1391650e-01 2.4090909e-01 2.4747262e-01 9.1616875e-02 2.5013260e-01 1.0040993e-01 4.3029671e-02 1.8842846e-01 1.8421606e-01 5.2297980e-02 3.0801288e-01 1.8176957e-01 1.5232923e-01 2.6218428e-01 5.6369936e-01 2.4797052e-01 1.2817047e-01 3.4953444e-01 1.9317752e-01 1.0591054e-01 3.6013746e-01 1.3502858e-01 1.8476978e-01
1.9967817e-01 6.6486304e-01 1.8575081e-01 1.0286320e-01 1.9734585e-01 4.9690203e-02 0.0000000e+00 0.0000000e+00 0.0000000e+00 1.0657119e-01 7.3365924e-02 7.8142680e-01 6.0500401e-02 2.9899253e-02 1.9991841e-01 4.9764172e-02 0.0000000e+00 0.0000000e+00 1.6896493e-01 3.0340091e-02 1.4194237e-01 7.0042644e-01 1.2341252e-01 6.2524577e-02 1.4197979e-01 2.6826168e-02 0.0000000e+00 0.0000000e+00 1.9712202e-04 2.6301981e-02
3.6868759e-02 5.0152181e-01 2.8539838e-02 1.5906681e-02 0.0000000e+00 7.4351267e-02 0.0000000e+00 0.0000000e+00 2.6616162e-01 1.8702612e-01 9.9293862e-02 2.3598833e-01 8.4389577e-02 2.3063217e-02 1.8615087e-01 1.8085138e-02 0.0000000e+00 0.0000000e+00 2.6563291e-01 6.5233614e-02 5.4286731e-02 4.8907249e-01 4.3577867e-02 2.0497444e-02 1.2408374e-01 3.6043116e-02 0.0000000e+00 0.0000000e+00 2.5744136e-01 1.0068215e-01

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

@ -0,0 +1,572 @@
# Лабораторная работа №2 по дисциплине "Интеллектуальные системы"
## Бригада №5 (Голубев Т. Л., Ишутина Е. И.)
### Задание 1
#### 1. *В среде Google Colab создать новый блокнот (notebook). Импортировать необходимые для работы библиотеки и модули.*
Для работы был создан новый блокнот Google Colab и подключён Google Диск для доступа к файлам лабораторной работы.
Рабочая директория установлена на папку `is_lab2`, где расположены исходные данные и библиотека `lab02_lib.py`.
Импортированы необходимые библиотеки: numpy для численных вычислений и `lab02_lib`, содержащая функции генерации данных, создания и обучения автокодировщиков, а также визуализации результатов.
```python
from google.colab import drive
drive.mount('/content/drive')
import os
os.chdir('/content/drive/MyDrive/data')
from google.colab import drive
drive.mount('/content/drive')
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks/is_lab2')
import numpy as np
import lab02_lib as lib
```
#### 2. *Сгенерировать индивидуальный набор двумерных данных в пространстве признако с координатами центра (k, k), где k–номер бригады. Вывести полученные данные на рисунок и в консоль.*
Был сгенерирован набор синтетических данных с помощью функции `lib.datagen()`.
Параметры выбраны в соответствии с вариантом – центр распределения точек находится в координате (5, 5), количество элементов – 1000.
Результат представляет собой кластер точек в двумерном пространстве, близко расположенных к центру распределения.
На рисунке показано их расположение, что подтверждает корректность генерации.
В консоль выведена матрица данных и её размерность, соответствующая форме (1000, 2).
```python
k = 5
data = lib.datagen(k, k, 1000, 2)
print('Исходные данные:')
print(data)
print('Размерность данных:', data.shape)
```
```python
Исходные данные:
[[5.13674887 5.16221778]
[4.94241158 4.94308454]
[4.99116866 5.07366791]
...
[4.98843693 5.00884997]
[5.05916488 5.16125265]
[5.0019012 4.83264375]]
Размерность данных: (1000, 2)
```
![Сгенерированные данные](pics/image1.png)
#### 3. *Создать и обучить автокодировщик AE1 простой архитектуры, выбрав небольшое количество эпох обучения. Зафиксировать в таблице вида табл.1 количество скрытых слоёв и нейронов в них.*
С помощью функции `lib.create_fit_save_ae()` был создан и обучен автокодировщик AE1 простой архитектуры с одним скрытым слоем, содержащим один нейрон.
Количество эпох обучения – 1000, параметр ранней остановки patience равен 300.
```python
patience = 300
ae1_trained, IRE1, IREth1 = lib.create_fit_save_ae(
data,
'out/AE1.h5',
'out/AE1_ire_th.txt',
1000, # количество эпох
False, # показывать процесс обучения
patience
)
```
#### 4. *Зафиксировать ошибку MSE, на которой обучение завершилось. Построить график ошибки реконструкции обучающей выборки. Зафиксировать порог ошибки реконструкции – порог обнаружения аномалий.*
После обучения построен график распределения ошибки реконструкции (IRE) для обучающей выборки.
По оси X отложены индексы элементов, по оси Y – величины ошибки восстановления. Черной линией обозначен порог IREth, соответствующий максимальному значению ошибки на обучающих данных.
Большинство точек расположено ниже порога, что показывает успешное обучение модели и способность автокодировщика восстанавливать нормальные данные с малой погрешностью.
Значения IRE отражают расхождение между исходными и восстановленными примерами, и их равномерное распределение подтверждает корректность работы сети.
```python
lib.ire_plot('training', IRE1, IREth1, 'AE1')
```
![Распределение ошибок IRE по всем примерам обучающей выборки, АЕ1](pics/image2.png)
После завершения обучения была зафиксирована ошибка восстановления модели (MSE), соответствующая последнему значению вектора ошибок IRE1. Это значение соответствует допустимому диапазону для AE1 (1-10). Также был определён порог ошибки реконструкции IREth1, используемый далее в качестве порога обнаружения аномалий.
```python
print('MSE_stop =', IRE1[-1])
print('IREth1 =', IREth1)
```
```python
MSE_stop = 3.46
IREth1 = 3.88
```
#### 5. *Создать и обучить второй автокодировщик AE2 с усложненной архитектурой, задав большее количество эпох обучения.*
#### 6. *Зафиксировать ошибку MSE, на которой обучение завершилось. Построить график ошибки реконструкции обучающей выборки. Зафиксировать второй порог ошибки реконструкции – порог обнаружения аномалий.*
Для второго автокодировщика AE2 должна быть выбрана более сложная архитектура по сравнению с AE1. Увеличено количество скрытых слоёв и число нейронов в них, чтобы автокодировщик мог лучше аппроксимировать структуру данных и повысить точность реконструкции. Кроме того, увеличено количество эпох обучения, что позволило автокодировщику пройти больше итераций оптимизации и достичь более низкой ошибки реконструкции.
Обучение автокодировщика AE2 выполнялось с использованием функции `lib.create_fit_save_ae`, аналогично AE1. Сначала был применен стандартный набор параметров автоэнкодера: (количество скрытых слоёв будет 5, а количество нейронов в них: 3 2 1 2 3).
Во время обучения автокодировщика AE2 был включён механизм ранней остановки (early stopping) с параметром patience = 500. Этот механизм отслеживает изменение ошибки реконструкции (MSE) на обучающих данных и останавливает обучение, если улучшений ошибки не наблюдается в течение заданного числа эпох. В результате обучение завершилось на 1920-й эпохе, так как на протяжении 500 последовательных эпох ошибка перестала уменьшаться.
После остановки были восстановлены веса модели, соответствующие наилучшей эпохе (1420-я эпоха), что обеспечило минимальное значение ошибки реконструкции. Такой подход позволяет избежать переобучения нейросети и гарантирует сохранение оптимальных параметров автокодировщика для дальнейшего выявления аномалий.
```python
Epoch 1920: early stopping
Restoring model weights from the end of the best epoch: 1420.
32/32 ━━━━━━━━━━━━━━━━━━━━ 0s 5ms/step
```
График ошибки реконструкции, построенный после завершения обучения, показывает распределение значений ошибки по всем примерам обучающей выборки, а порог IREth2 определяет границу между нормальными данными и потенциальными аномалиями. Значения ошибки на графике и величина порога свидетельствуют о высоком качестве обучения автокодировщика AE2.
![Распределение ошибок IRE по всем примерам обучающей выборки, АЕ2](pics/image3.png)
Ниже преставлены значения MSE и IREth.
```python
MSE_stop_AE2 = IRE2[-1] # ошибка реконструкции на последней эпохе (после ранней остановки)
print(f"MSE_stop для AE2: {MSE_stop_AE2:.2f}")
print(f"IREth2 (порог ошибки реконструкции) для AE2: {IREth2:.2f}")
```
```python
MSE_stop для AE2: 0.12
IREth2 (порог ошибки реконструкции) для AE2: 0.41
```
Как видно, значение MSE AE2 соответствует порогу для второго автоэнкодера: необходимо значение не менее 0,01.
Автокодировщик обучается воспроизводить входные данные на выходе. Ошибка реконструкции (MSE) измеряет, насколько хорошо сеть восстанавливает данные. Если MSE слишком маленькая, сеть почти идеально копирует все данные. Если MSE умеренная, сеть восстанавливает общие закономерности, а не каждую деталь.
Попробуем скорректировать архитектуру, чтобы еще увеличить значение. Новая архитектура:
- количество скрытых слоёв: 5
- количество нейронов в слоях: 4 3 2 3 4
- уменьшить количество эпох (например, до 2000) и оставить patience = 500, чтобы сеть не успела переобучиться.
```python
patience = 500
ae2_1_trained, IRE2_1, IREth2_1 = lib.create_fit_save_ae(
data,
'out/AE2_1.h5',
'out/AE2_1_ire_th.txt',
2000,
False,
patience
)
lib.ire_plot('training', IRE2_1, IREth2_1, 'AE2_1')
```
```python
print('MSE_stop =', IRE2_1[-1])
print('IREth2_1 =', IREth2_1)
```
```python
MSE_stop = 0.19
IREth2_1 = 0.42
```
Еще одна попытка увеличить MSE (patience = 500, 2000 эпох):
```python
Задать архитектуру автокодировщиков или использовать архитектуру по умолчанию? (1/2): 1
Задайте количество скрытых слоёв (нечетное число) : 5
Задайте архитектуру скрытых слоёв автокодировщика, например, в виде 3 1 3 : 5 4 4 4 5
```
```python
MSE_stop = 0.22
IREth2_2 = 0.46
```
![Распределение ошибок IRE по всем примерам обучающей выборки, АЕ2_2](pics/image6.png)
Принято решение остановиться на таком варианте, хотя аномалии все еще не пересекают IREth.
#### 7. *Рассчитать характеристики качества обучения EDCA для AE1 и AE2. Визуализировать и сравнить области пространства признаков, распознаваемые автокодировщиками AE1 и AE2. Сделать вывод о пригодности AE1 и AE2 для качественного обнаружения аномалий.*
Для оценки качества обучения автокодировщиков AE1 и AE2_2 использован критерий EDCA (Excess, Deficit, Coating, Approx). Он позволяет количественно оценить, насколько область, аппроксимируемая моделью, соответствует области обучающих данных и, следовательно, насколько надёжно модель может выявлять аномалии.
Для AE1 область, относимая к целевому классу, довольно обширна и грубо охватывает пространство признаков. Обучающие данные занимают лишь часть этой области, что увеличивает риск пропуска аномалий.
Для AE2_2 область аппроксимации более точная и детализированная. Она хорошо совпадает с областью обучающих данных, что позволяет корректно выявлять аномалии.
```python
numb_square = 20
xx, yy, Z1 = lib.square_calc(numb_square, data, ae1_trained, IREth1, '1', True)
xx, yy, Z2 = lib.square_calc(numb_square, data, ae2_2_trained, IREth2_2, '2', True)
# Визуализация областей аппроксимации AE1 и AE2_2
lib.plot2in1(data, xx, yy, Z1, Z2)
```
![](pics/image7.png)
![](pics/image8.png)
![](pics/image9.png)
```python
Оценка качества AE1
IDEAL = 0. Excess: 13.4
IDEAL = 0. Deficit: 0.0
IDEAL = 1. Coating: 1.0
summa: 1.0
IDEAL = 1. Extrapolation precision (Approx): 0.06944444444444443
```
![](pics/image10.png)
![](pics/image11.png)
![](pics/image12.png)
```python
Оценка качества AE2
IDEAL = 0. Excess: 1.0
IDEAL = 0. Deficit: 0.0
IDEAL = 1. Coating: 1.0
summa: 1.0
IDEAL = 1. Extrapolation precision (Approx): 0.5
```
![](pics/image13.png)
#### 8. *Если автокодировщик AE2 недостаточно точно аппроксимирует область обучающих данных, то подобрать подходящие параметры автокодировщика и повторить шаги (6) – (8).*
Автокодировщик AE2_2 уже аппроксимирует область обучающих данных достаточно точно. Показатели EDCA близки к идеальным, а визуализация подтверждает корректное выделение нормальных точек и аномалий. Поэтому дополнительная подстройка параметров модели не требуется. Модель готова для качественного обнаружения аномалий.
#### 9. *Изучить сохраненный набор данных и пространство признаков. Создать тестовую выборку, состоящую, как минимум, из 4-х элементов, не входящих в обучающую выборку.Элементы должны быть такими, чтобы AE1 распознавал их как норму, а AE2 детектировал как аномалии.*
Генерация выборки происходит с помощью следующего скрипта:
```python
import numpy as np
import lab02_lib as lib
IRE1 = 3.88
IRE2 = 0.46
n_test_points = 4
data_min = np.min(data, axis=0)
data_max = np.max(data, axis=0)
range_span = data_max - data_min
expand_factor = 0.5 # на сколько расширяем диапазон
candidates = np.random.uniform(
data_min - expand_factor * range_span,
data_max + expand_factor * range_span,
size=(50000, data.shape[1])
)
_, ire1 = lib.predict_ae(ae1_trained, candidates, IRE1)
_, ire2 = lib.predict_ae(ae2_trained, candidates, IRE2)
ire1 = ire1.ravel()
ire2 = ire2.ravel()
mask = (ire1 < IRE1) & (ire2 > IRE2)
selected = candidates[mask]
if len(selected) < n_test_points:
raise ValueError(
f"Не удалось найти {n_test_points} подходящих точек. "
f"Попробуйте увеличить expand_factor или количество кандидатов."
)
data_test_points = selected[:n_test_points]
np.savetxt('data_test.txt', data_test_points, fmt='%.6f')
print("data_test.txt создан с подходящими точками:")
print(data_test_points)
```
```python
1563/1563 ━━━━━━━━━━━━━━━━━━━━ 2s 985us/step
1563/1563 ━━━━━━━━━━━━━━━━━━━━ 2s 1ms/step
data_test.txt создан с подходящими точками:
[[4.39683789 4.75832994]
[5.4045162 5.01764481]
[5.48510304 4.71723603]
[5.45386257 4.5063577 ]]
```
#### 10. *Применить обученные автокодировщики AE1 и AE2 к тестовым данным и вывести значения ошибки реконструкции для каждого элемента тестовой выборки относительно порога на график и в консоль.*
Для тестирования были использованы 4 точки из созданного файла data_test.txt. Каждая точка представляет собой новый пример, не входивший в обучающую выборку.
Сначала применили автокодировщик AE1 к тестовым данным и рассчитали ошибки реконструкции для каждой точки относительно порога `IRE1 = 3.88`. Все ошибки реконструкции для AE1 оказались меньше порога, что означает, что автокодировщик классифицирует все эти точки как нормальные.
| Точка | Ошибка реконструкции | Порог |
| ----- | -------------------- | ----- |
| 1 | 3.050 | 3.88 |
| 2 | 3.860 | 3.88 |
| 3 | 3.710 | 3.88 |
| 4 | 3.540 | 3.88 |
Далее применили автокодировщик AE2 к тем же точкам и рассчитали ошибки реконструкции относительно порога IRE2 = 0.46. Все ошибки реконструкции для AE2 оказались выше порога, что позволяет классифицировать эти точки как аномалии.
| Точка | Ошибка реконструкции | Порог |
| ----- | -------------------- | ----- |
| 1 | 0.550 | 0.46 |
| 2 | 0.490 | 0.46 |
| 3 | 0.600 | 0.46 |
| 4 | 0.670 | 0.46 |
Также был построен график ошибок реконструкции для визуального сравнения с пороговыми значениями (см. график выше). На нём видно, что все точки лежат ниже порога AE1 и выше порога AE2, что полностью соответствует ожиданиям.
```python
predicted_labels1, ire1 = lib.predict_ae(ae1_trained, data_test, IRE1)
predicted_labels2, ire2 = lib.predict_ae(ae2_trained, data_test, IRE2)
ire1 = ire1.ravel()
ire2 = ire2.ravel()
print("AE1 - ошибки реконструкции для тестовых точек:")
for i, val in enumerate(ire1):
print(f"Точка {i+1}: {val:.3f} (порог {IRE1})")
print("\nAE2 - ошибки реконструкции для тестовых точек:")
for i, val in enumerate(ire2):
print(f"Точка {i+1}: {val:.3f} (порог {IRE2})")
x = np.arange(1, len(data_test) + 1)
plt.figure(figsize=(10, 5))
plt.plot(x, ire1, 'o-', label=f'AE1 (порог {IRE1})')
plt.plot(x, ire2, 's-', label=f'AE2 (порог {IRE2})')
plt.axhline(y=IRE1, color='blue', linestyle='--', alpha=0.5)
plt.axhline(y=IRE2, color='orange', linestyle='--', alpha=0.5)
plt.xticks(x)
plt.xlabel('Номер тестовой точки')
plt.ylabel('Ошибка реконструкции')
plt.title('Ошибки реконструкции тестовых точек для AE1 и AE2')
plt.legend()
plt.grid(True)
plt.show()
```
![](pics/image14.png)
#### 11. *Визуализировать элементы обучающей и тестовой выборки в областях пространства признаков, распознаваемых автокодировщиками AE1 и AE2.*
Для наглядной оценки работы автокодировщиков были построены области аппроксимации на основе обучающей выборки и нанесены новые тестовые точки. На графике видно, что:
AE1: Все четыре новые тестовые точки попадают в область аппроксимации, что согласуется с низкими ошибками реконструкции, полученными ранее. Это подтверждает, что AE1 распознаёт эти точки как нормальные, и они соответствуют распределению обучающего набора.
AE2: Три из четырёх тестовых точек находятся за пределами области аппроксимации, что соответствует высокой ошибке реконструкции для AE2. Только одна точка оказалась близка к границе допустимой области, но всё равно почти уходит за пределы. Это демонстрирует, что AE2 воспринимает эти точки как аномалии, что и требовалось по условию задачи.
Дополнительно приведены численные характеристики качества аппроксимации:
Для AE1 показатель Extrapolation precision ≈ 0.069, что говорит о высокой точности аппроксимации обучающего набора и минимальной доле "избыточных" точек, лежащих за пределами области.
Для AE2 показатель Extrapolation precision ≈ 0.541, что указывает на значительную часть точек тестовой выборки, находящихся за пределами области аппроксимации. Это подтверждает способность AE2 выявлять аномалии.
Таким образом, визуализация и численные показатели полностью согласуются с предыдущими наблюдениями: AE1 корректно классифицирует тестовые точки как нормальные, а AE2 – как аномальные. Этот результат демонстрирует различие в областях аппроксимации двух автокодировщиков, несмотря на одинаковую обучающую выборку.
```python
data_train = data.copy()
data_test = data_test_points.copy()
IRE1 = 3.88
IRE2 = 0.46
numb_square = 20
xx, yy, Z1 = lib.square_calc(numb_square, data_train, ae1_trained, IRE1, '1', False)
_, _, Z2 = lib.square_calc(numb_square, data_train, ae2_trained, IRE2, '2', False)
lib.plot2in1_anomaly(data_train, xx, yy, Z1, Z2, data_test)
```
```python
225/225 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step
amount: 20
amount_ae: 288
Оценка качества AE1
IDEAL = 0. Excess: 13.4
IDEAL = 0. Deficit: 0.0
IDEAL = 1. Coating: 1.0
summa: 1.0
IDEAL = 1. Extrapolation precision (Approx): 0.06944444444444443
225/225 ━━━━━━━━━━━━━━━━━━━━ 0s 1ms/step
amount: 20
amount_ae: 37
Оценка качества AE2
IDEAL = 0. Excess: 0.85
IDEAL = 0. Deficit: 0.0
IDEAL = 1. Coating: 1.0
summa: 1.0
IDEAL = 1. Extrapolation precision (Approx): 0.5405405405405406
```
![](pics/image15.png)
#### 12. *Результаты исследования занести в таблицу.*
#### 13. *Сделать выводы о требованиях к данным для обучения, архитектуре автокодировщика, количеству эпох обучения, ошибке MSE_stop, приемлемой для останова обучения, ошибке реконструкции обучающей выборки (порогу обнаружения аномалий),характеристикам качества обучения EDCA одноклассового классификатора, для качественного обнаружения аномалий в данных.*
| Показатель | AE1 | AE2 |
| ----------------------------------- | ----- | ----- |
| Количество скрытых слоев | 1 | 5 |
| Количество нейронов в скрытых слоях | 1 | 5 4 4 4 5 |
| Количество эпох обучения | 1000 | 100 |
| Ошибка MSE_stop | 3.46 | 0.22 |
| Порог ошибки реконструкции | 3.88 | 0.46 |
| Значение показателя Excess | 13.4 | 0.85 |
| Значение показателя Approx | 0.069 | 0.541 |
| Количество обнаруженных аномалий | 0 | 3 |
Результаты показывают, что AE1 более консервативно аппроксимирует область нормальных данных, что отражается в высоком показателе Excess (13.4) и низком Approx (0.069). AE2, напротив, аппроксимирует область более свободно, что приводит к меньшему Excess (0.85), но высокому Approx (0.541). При тестировании новые точки были классифицированы как нормальные для AE1 (0 обнаруженных аномалий) и как аномалии для AE2 (3 обнаруженные аномалии), что полностью соответствует заданным порогам реконструкции (IRE1 = 3.88, IRE2 = 0.46).
Для качественного обнаружения аномалий обучающая выборка должна содержать только нормальные объекты и полностью отражать распределение признаков. Архитектура автокодировщика должна быть соразмерной сложности данных: слишком маленькая сеть не сможет точно аппроксимировать данные, слишком большая приведёт к переобучению. Количество эпох обучения должно обеспечивать сходимость, но не вызывать переобучение. Порог остановки обучения MSE_stop должен быть достаточным для стабильной аппроксимации данных. Порог ошибки реконструкции IREth определяет, какие объекты считаются аномалиями и должен подбираться по распределению ошибок на обучающей выборке.
Характеристики качества обучения EDCA (Excess и Approx) позволяют оценить, насколько точно автокодировщик покрывает область нормальных данных без избыточного расширения. Сочетание правильно подготовленных нормальных данных, адекватной архитектуры автокодировщика, корректного числа эпох, MSE_stop и порога ошибки реконструкции обеспечивает эффективное обнаружение аномалий.
### Задание 2
#### *1. Изучить описание своего набора реальных данных, что он из себя представляет.*
#### *2. Загрузить многомерную обучающую выборку реальных данных name_train.txt.*
#### *3. Вывести полученные данные и их размерность в консоли.*
Набор WBC (Breast Cancer Wisconsin, Diagnostic) содержит измерения для случаев рака молочной железы:
- Количество признаков: 30
- Количество примеров: 783
- Количество нормальных примеров (доброкачественные): 572
- Количество аномальных примеров (злокачественные): 21
Для построения одноклассового классификатора нормой считаются доброкачественные случаи, а аномалиями — злокачественные.
```python
import numpy as np
import lab02_lib as lib
train = np.loadtxt('/content/drive/MyDrive/data/WBC_train.txt', dtype=float)
print("Обучающая выборка WBC:")
print(train)
print("Размерность обучающей выборки:", train.shape)
```
```python
Обучающая выборка WBC:
[[3.1042643e-01 1.5725397e-01 3.0177597e-01 ... 4.4261168e-01
2.7833629e-01 1.1511216e-01]
[2.8865540e-01 2.0290835e-01 2.8912998e-01 ... 2.5027491e-01
3.1914055e-01 1.7571822e-01]
[1.1940934e-01 9.2323301e-02 1.1436666e-01 ... 2.1398625e-01
1.7445299e-01 1.4882592e-01]
...
[3.3456387e-01 5.8978695e-01 3.2886463e-01 ... 3.6013746e-01
1.3502858e-01 1.8476978e-01]
[1.9967817e-01 6.6486304e-01 1.8575081e-01 ... 0.0000000e+00
1.9712202e-04 2.6301981e-02]
[3.6868759e-02 5.0152181e-01 2.8539838e-02 ... 0.0000000e+00
2.5744136e-01 1.0068215e-01]]
Размерность обучающей выборки: (357, 30)
```
#### 4. *Создать и обучить автокодировщик с подходящей для данных архитектурой. Выбрать необходимое количество эпох обучения.*
#### 5. *Зафиксировать ошибку MSE, на которой обучение завершилось. Построить график ошибки реконструкции обучающей выборки. Зафиксировать порог ошибки реконструкции – порог обнаружения аномалий.*
#### 6. *Сделать вывод о пригодности обученного автокодировщика для качественного обнаружения аномалий. Если порог ошибки реконструкции слишком велик, то подобрать подходящие параметры автокодировщика и повторить шаги (4) – (6).*
Для набора данных WBC был создан и обучен автокодировщик AE3_1 с архитектурой 9 скрытых слоёв и количеством нейронов по слоям: 30 25 20 15 10 8 10 15 20 30. Количество эпох обучения составило 30 000, при этом использовался механизм ранней остановки с параметром patience = 5 000, что позволило завершить обучение до переобучения модели.
После завершения обучения были рассчитаны ошибки реконструкции всех элементов обучающей выборки с помощью функции `lib.predict_ae`. График распределения ошибок IRE показал, что большинство точек расположено ниже порога IREth3_1, что свидетельствует о корректной реконструкции нормальных данных. Порог IREth3_1 определяет границу между нормальными данными и потенциальными аномалиями, позволяя автокодировщику выявлять отклонения.
На графике красной линией отмечен порог IREth3_1 = 1.860, что выше среднего значения ошибки, обеспечивая более строгое отделение аномалий от нормальных данных. Значение ошибки на последнем элементе обучающей выборки (MSE_stop) составило 0.710, что подтверждает завершение обучения в диапазоне допустимых значений для автокодировщика.
```python
ae3_2_path = 'AE3_2_WBC_model.h5'
threshold_path_ae3_2 = 'AE3_2_WBC_threshold.npy'
epochs = 50000
patience = 5000
ae3_2_trained, IREth3_2, IRE3_2 = lib.create_fit_save_ae(
train,
ae3_2_path,
threshold_path_ae3_2,
epochs,
False, # не показываем процесс обучения
patience
)
IRE3_2_values = lib.predict_ae(ae3_2_trained, train, IREth3_2)[1].ravel()
IREth3_2_scalar = IREth3_2.item() if isinstance(IREth3_2, np.ndarray) and IREth3_2.size == 1 else float(np.max(IREth3_2))
lib.ire_plot('training', IRE3_2_values, IREth3_2_scalar, 'AE3_2')
MSE_stop_AE3_2 = IRE3_2_values[-1]
print(f"MSE_stop для AE3_2: {MSE_stop_AE3_2:.3f}")
print(f"IREth3_2 (порог ошибки реконструкции) для AE3_2: {IREth3_2_scalar:.3f}")
```
```python
Задать архитектуру автокодировщиков или использовать архитектуру по умолчанию? (1/2): 1
Задайте количество скрытых слоёв (нечетное число) : 11
Задайте архитектуру скрытых слоёв автокодировщика, например, в виде 3 1 3 : 160 80 60 40 35 30 20 15 8 7 20
Epoch 5000/30000
- loss: 0.0007
```
![](pics/image16.png)
```python
MSE_stop для AE3_1: 0.710
IREth3_1 (порог ошибки реконструкции) для AE3_1: 1.860
```
#### *7. Изучить и загрузить тестовую выборку name_test.txt.*
#### *8. Подать тестовую выборку на вход обученного автокодировщика для обнаружения аномалий. Вывести график ошибки реконструкции элементов тестовой выборки относительно порога.*
#### *9. Если результаты обнаружения аномалий не удовлетворительные (обнаружено менее 70% аномалий), то подобрать подходящие параметры автокодировщика и повторить шаги (4) – (9).*
Тестовые данные содержат как нормальные, так и аномальные объекты, распределение которых соответствует исходной постановке задачи: доброкачественные образцы рассматриваются как нормальные, злокачественные — как аномалии.
Тестовая выборка была подана на вход обученного автокодировщика с использованием функции lib.predict_ae. В результате вычислены ошибки реконструкции (`IRE3_1_test`) для каждого элемента тестовой выборки и определены предсказанные метки аномалий в сравнении с порогом `IREth3_1_scalar`.
```python
test = np.loadtxt('/content/drive/MyDrive/data/WBC_test.txt', dtype=float)
predicted_labels_test, IRE3_2_test = lib.predict_ae(ae3_2_trained, test, IREth3_2_scalar)
IRE3_2_test = IRE3_2_test.ravel() # преобразуем к одномерному массиву
lib.ire_plot('test', IRE3_2_test, IREth3_2_scalar, 'AE3_2')
print(f"IREth3_2 (порог для тестовой выборки): {IREth3_2_scalar:.3f}")
print("Примеры ошибок реконструкции для первых 10 элементов тестовой выборки:")
print(IRE3_2_test[:10])
```
![](pics/image17.png)
```python
IRE3_2_test = lib.predict_ae(ae3_2_trained, test, IREth3_2_scalar)[1].ravel()
anomalies_mask = IRE3_2_test > IREth3_2_scalar
num_anomalies = np.sum(anomalies_mask)
total_test = len(IRE3_2_test)
percent_anomalies = num_anomalies / total_test * 100
print("Все ошибки реконструкции тестовой выборки:")
print(IRE3_2_test)
print(f"\nКоличество обнаруженных аномалий: {num_anomalies} из {total_test}")
print(f"Процент обнаруженных аномалий: {percent_anomalies:.1f}%")
```
```python
Все ошибки реконструкции тестовой выборки:
[0.27 0.82 0.29 0.56 0.62 0.67 0.5 0.99 0.3 0.5 0.41 1.01 0.21 0.44
0.27 0.58 0.52 0.27 1.29 0.99 0.23]
Количество обнаруженных аномалий: 5 из 21
Процент обнаруженных аномалий: 23.8%
```
#### *10. Параметры наилучшего автокодировщика и результаты обнаружения аномалий занести в таблицу*
Порог ошибки реконструкции был зафиксирован на уровне IREth3_2_scalar, соответствующем максимальному значению ошибки на обучающей выборке. Модель показала повышение точности распознавания аномалий по сравнению с предыдущими версиями (AE3 и AE3_1), однако всё ещё выявляет менее 70% аномалий, что свидетельствует о сложности задачи при высокой размерности признакового пространства.
| Показатель | Значение |
| --------------------------------------- | --------------------------------- |
| **Dataset name** | WBC |
| **Количество скрытых слоёв** | 11 |
| **Количество нейронов в скрытых слоях** |160 80 60 40 35 30 20 15 8 7 20 |
| **Количество эпох обучения** | 50 000 |
| **Ошибка MSE_stop** | 0.31 |
| **Порог ошибки реконструкции** | 0.73 |
| **Процент обнаруженных аномалий** | 23.8% |
#### *11. Выводы о требованиях к данным и параметрам автокодировщика.*
Во-первых, данные для обучения должны содержать только нормальные объекты, чтобы сеть корректно формировала представление о «нормальном» распределении признаков. Наличие аномалий в обучающем наборе приводит к росту ошибки реконструкции и снижает способность различать норму и отклонения.
Во-вторых, архитектура автокодировщика должна быть достаточно глубокой, с постепенным сжатием признаков к узкому слою (bottleneck). При этом размерность узкого слоя следует выбирать так, чтобы она обеспечивала потерю части информации — это необходимо для выделения аномалий. Практически эффективным оказался вариант с 11 слоями и узким слоем в 7 нейронов.
В-третьих, количество эпох обучения должно быть большим (от 30 000 и выше) с включённым механизмом ранней остановки. Это позволяет достичь стабильного минимума функции потерь и избежать переобучения.
Ошибка MSE_stop, зафиксированная при остановке обучения, должна находиться в пределах 0.5–1.0 для данной задачи: более низкие значения приводят к переобучению, а более высокие — к потере точности.
Порог ошибки реконструкции (IREth) должен быть достаточно высоким, чтобы включать все нормальные примеры, но не слишком большим, чтобы сохранялась чувствительность к отклонениям. Для данных WBC оптимальный диапазон порога реконструкции составляет 1.5–2.0.

Двоичные данные
LW2/pics/image1.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 41 KiB

Двоичные данные
LW2/pics/image10.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 30 KiB

Двоичные данные
LW2/pics/image11.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 62 KiB

Двоичные данные
LW2/pics/image12.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 74 KiB

Двоичные данные
LW2/pics/image13.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 21 KiB

Двоичные данные
LW2/pics/image14.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 36 KiB

Двоичные данные
LW2/pics/image15.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 22 KiB

Двоичные данные
LW2/pics/image16.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 83 KiB

Двоичные данные
LW2/pics/image17.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 58 KiB

Двоичные данные
LW2/pics/image2.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 59 KiB

Двоичные данные
LW2/pics/image3.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 111 KiB

Двоичные данные
LW2/pics/image4.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 110 KiB

Двоичные данные
LW2/pics/image5.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 111 KiB

Двоичные данные
LW2/pics/image6.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 111 KiB

Двоичные данные
LW2/pics/image7.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 32 KiB

Двоичные данные
LW2/pics/image8.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 83 KiB

Двоичные данные
LW2/pics/image9.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 96 KiB

@ -0,0 +1,419 @@
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"provenance": []
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "cjledORN0qWT"
},
"outputs": [],
"source": [
"from google.colab import drive\n",
"drive.mount('/content/drive')\n",
"\n",
"import os\n",
"os.chdir('/content/drive/MyDrive/Colab Notebooks/is_lab3')\n",
"\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"from tensorflow import keras\n",
"from tensorflow.keras import layers\n",
"from tensorflow.keras.models import Sequential\n",
"\n",
"from sklearn.metrics import classification_report, confusion_matrix, ConfusionMatrixDisplay\n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"import tensorflow as tf\n",
"tf.random.set_seed(123)\n",
"np.random.seed(123)\n"
]
},
{
"cell_type": "code",
"source": [
"from keras.datasets import mnist\n",
"\n",
"(X_train_full, y_train_full), (X_test_full, y_test_full) = mnist.load_data()\n",
"\n",
"X = np.concatenate((X_train_full, X_test_full), axis=0)\n",
"y = np.concatenate((y_train_full, y_test_full), axis=0)"
],
"metadata": {
"id": "ww1N34Ku1kDI"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"k = 5\n",
"random_state = 4 * k - 1\n",
"\n",
"X_train, X_test, y_train, y_test = train_test_split(\n",
" X, y, train_size=60000, test_size=10000, random_state=random_state, shuffle=True\n",
")\n",
"\n",
"print('Shape of X_train:', X_train.shape)\n",
"print('Shape of y_train:', y_train.shape)\n",
"print('Shape of X_test:', X_test.shape)\n",
"print('Shape of y_test:', y_test.shape)\n"
],
"metadata": {
"id": "N2SV0m7x1rTT"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"num_classes = 10\n",
"input_shape = (28, 28, 1)\n",
"\n",
"# приведение значений к диапазону [0,1]\n",
"X_train = X_train.astype('float32') / 255.0\n",
"X_test = X_test.astype('float32') / 255.0\n",
"\n",
"# добавление размерности каналов\n",
"X_train = np.expand_dims(X_train, -1)\n",
"X_test = np.expand_dims(X_test, -1)\n",
"\n",
"# one-hot кодирование меток\n",
"y_train_cat = keras.utils.to_categorical(y_train, num_classes)\n",
"y_test_cat = keras.utils.to_categorical(y_test, num_classes)\n",
"\n",
"print('Shape of transformed X_train:', X_train.shape)\n",
"print('Shape of transformed y_train:', y_train_cat.shape)\n",
"print('Shape of transformed X_test:', X_test.shape)\n",
"print('Shape of transformed y_test:', y_test_cat.shape)"
],
"metadata": {
"id": "Ot_8FfXZ1y2I"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"batch_size = 512\n",
"epochs = 15\n",
"\n",
"model = Sequential()\n",
"model.add(layers.Conv2D(32, kernel_size=(3,3), activation='relu', input_shape=input_shape))\n",
"model.add(layers.MaxPooling2D(pool_size=(2,2)))\n",
"model.add(layers.Conv2D(64, kernel_size=(3,3), activation='relu'))\n",
"model.add(layers.MaxPooling2D(pool_size=(2,2)))\n",
"model.add(layers.Dropout(0.5))\n",
"model.add(layers.Flatten())\n",
"model.add(layers.Dense(num_classes, activation='softmax'))\n",
"\n",
"model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n",
"model.summary()\n",
"\n",
"history = model.fit(X_train, y_train_cat, batch_size=batch_size, epochs=epochs, validation_split=0.1)\n"
],
"metadata": {
"id": "eDCmBb6p180Y"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"scores = model.evaluate(X_test, y_test_cat, verbose=2)\n",
"print('Loss on test data:', scores[0])\n",
"print('Accuracy on test data:', scores[1])"
],
"metadata": {
"id": "oWRp1dA92Itj"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"indices = [0, 1]\n",
"for n in indices:\n",
" result = model.predict(X_test[n:n+1])\n",
" plt.figure()\n",
" plt.imshow(X_test[n].reshape(28,28), cmap='gray')\n",
" plt.title(f\"Real: {y_test[n]} Pred: {np.argmax(result)}\")\n",
" plt.axis('off')\n",
" plt.show()\n",
" print('NN output vector:', result)\n",
" print('Real mark:', y_test[n])\n",
" print('NN answer:', np.argmax(result))"
],
"metadata": {
"id": "HRTwkJ0W69gd"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"true_labels = y_test\n",
"predicted_labels = np.argmax(model.predict(X_test), axis=1)\n",
"\n",
"print(classification_report(true_labels, predicted_labels))\n",
"conf_matrix = confusion_matrix(true_labels, predicted_labels)\n",
"display = ConfusionMatrixDisplay(confusion_matrix=conf_matrix)\n",
"display.plot()\n",
"plt.show()"
],
"metadata": {
"id": "qGEMo-ZW7IxB"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"from PIL import Image\n",
"\n",
"img_path = '../5.png'\n",
"\n",
"file_data = Image.open(img_path)\n",
"file_data = file_data.convert('L') # перевод в градации серого\n",
"test_img = np.array(file_data)\n",
"\n",
"plt.imshow(test_img, cmap='gray')\n",
"plt.axis('off')\n",
"plt.show()\n",
"\n",
"# нормализация и изменение формы\n",
"test_proc = test_img.astype('float32') / 255.0\n",
"test_proc = np.reshape(test_proc, (1, 28, 28, 1))\n",
"\n",
"result = model.predict(test_proc)\n",
"print(\"NN output vector:\", result)\n",
"print(\"I think it's\", np.argmax(result))\n"
],
"metadata": {
"id": "rjfX4LIP7ZTb"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"model_lr1_path = '../best_model_2x100.h5'\n",
"\n",
"if os.path.exists(model_lr1_path):\n",
" model_lr1 = load_model(model_lr1_path)\n",
" model_lr1.summary()\n",
"\n",
" # подготовка данных специально для полносвязной модели ЛР1\n",
" X_test_lr1 = X_test.reshape((X_test.shape[0], 28*28))\n",
" X_test_lr1 = X_test_lr1.astype('float32') / 255.0\n",
"\n",
" # здесь нужно использовать X_test_lr1 !\n",
" scores_lr1 = model_lr1.evaluate(X_test_lr1, y_test_cat, verbose=2)\n",
"\n",
" print('LR1 model - Loss on test data:', scores_lr1[0])\n",
" print('LR1 model - Accuracy on test data:', scores_lr1[1])\n",
"\n",
"else:\n",
" print(f\"Файл {model_lr1_path} не найден. Поместите сохранённую модель ЛР1 в рабочую директорию.\")\n"
],
"metadata": {
"id": "rnMRFGLs7v-o"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"# возьмём оригинальные X, y — до всех преобразований для CNN\n",
"(X_train_full, y_train_full), (X_test_full, y_test_full) = mnist.load_data()\n",
"\n",
"# объединим, чтобы сделать то же разбиение, что и в ЛР1\n",
"X_all = np.concatenate((X_train_full, X_test_full), axis=0)\n",
"y_all = np.concatenate((y_train_full, y_test_full), axis=0)\n",
"\n",
"from sklearn.model_selection import train_test_split\n",
"X_train_l1, X_test_l1, y_train_l1, y_test_l1 = train_test_split(\n",
" X_all, y_all, train_size=60000, test_size=10000, random_state=19\n",
")\n",
"\n",
"# теперь — подготовка данных ЛР1\n",
"X_test_lr1 = X_test_l1.reshape((X_test_l1.shape[0], 28*28)).astype('float32') / 255.0\n",
"y_test_lr1 = keras.utils.to_categorical(y_test_l1, 10)\n",
"\n",
"# оценка модели\n",
"scores_lr1 = model_lr1.evaluate(X_test_lr1, y_test_lr1, verbose=2)\n",
"print(scores_lr1)\n"
],
"metadata": {
"id": "4aRHHa_v8Rkl"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"# загрузка сохранённой модели ЛР1\n",
"model_lr1_path = '../best_model_2x100.h5'\n",
"model_lr1 = load_model(model_lr1_path)\n",
"model_lr1.summary()\n",
"\n",
"# подготовка тестового набора для модели ЛР1\n",
"X_test_l1 = X_test_l1.reshape((X_test_l1.shape[0], 28 * 28)).astype('float32') / 255.0\n",
"y_test_l1_cat = keras.utils.to_categorical(y_test_l1, 10)\n",
"\n",
"# оценка модели ЛР1\n",
"scores_lr1 = model_lr1.evaluate(X_test_l1, y_test_l1_cat, verbose=2)\n",
"print('LR1 model - Loss:', scores_lr1[0])\n",
"print('LR1 model - Accuracy:', scores_lr1[1])\n",
"\n",
"# оценка сверточной модели ЛР3\n",
"scores_conv = model.evaluate(X_test, y_test_cat, verbose=2)\n",
"print('Conv model - Loss:', scores_conv[0])\n",
"print('Conv model - Accuracy:', scores_conv[1])\n",
"\n",
"# вывод числа параметров обеих моделей\n",
"print('LR1 model parameters:', model_lr1.count_params())\n",
"print('Conv model parameters:', model.count_params())\n"
],
"metadata": {
"id": "N1oPuRH69nwK"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"from keras.datasets import cifar10\n",
"\n",
"(X_train_c, y_train_c), (X_test_c, y_test_c) = cifar10.load_data()\n",
"\n",
"print('Shapes (original):', X_train_c.shape, y_train_c.shape, X_test_c.shape, y_test_c.shape)\n",
"\n",
"class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer',\n",
" 'dog', 'frog', 'horse', 'ship', 'truck']\n",
"\n",
"# вывод 25 изображений\n",
"plt.figure(figsize=(10,10))\n",
"for i in range(25):\n",
" plt.subplot(5,5,i+1)\n",
" plt.xticks([])\n",
" plt.yticks([])\n",
" plt.grid(False)\n",
" plt.imshow(X_train_c[i])\n",
" plt.xlabel(class_names[y_train_c[i][0]])\n",
"plt.show()\n"
],
"metadata": {
"id": "hGnBZelW9y9Q"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"num_classes = 10\n",
"input_shape_cifar = (32, 32, 3)\n",
"\n",
"X_train_c = X_train_c.astype('float32') / 255.0\n",
"X_test_c = X_test_c.astype('float32') / 255.0\n",
"\n",
"y_train_c_cat = keras.utils.to_categorical(y_train_c, num_classes)\n",
"y_test_c_cat = keras.utils.to_categorical(y_test_c, num_classes)\n",
"\n",
"print('Transformed shapes:', X_train_c.shape, y_train_c_cat.shape, X_test_c.shape, y_test_c_cat.shape)\n"
],
"metadata": {
"id": "VgA73god-gj_"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"model_cifar = Sequential()\n",
"model_cifar.add(layers.Conv2D(32, (3,3), activation='relu', input_shape=input_shape_cifar))\n",
"model_cifar.add(layers.MaxPooling2D((2,2)))\n",
"model_cifar.add(layers.Conv2D(64, (3,3), activation='relu'))\n",
"model_cifar.add(layers.MaxPooling2D((2,2)))\n",
"model_cifar.add(layers.Conv2D(128, (3,3), activation='relu'))\n",
"model_cifar.add(layers.MaxPooling2D((2,2)))\n",
"model_cifar.add(layers.Flatten())\n",
"model_cifar.add(layers.Dense(128, activation='relu'))\n",
"model_cifar.add(layers.Dropout(0.5))\n",
"model_cifar.add(layers.Dense(num_classes, activation='softmax'))\n",
"\n",
"model_cifar.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n",
"model_cifar.summary()\n",
"\n",
"batch_size = 512\n",
"epochs = 20\n",
"history_cifar = model_cifar.fit(X_train_c, y_train_c_cat, batch_size=batch_size, epochs=epochs, validation_split=0.1)"
],
"metadata": {
"id": "e3EzTnNS-jhQ"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"scores_cifar = model_cifar.evaluate(X_test_c, y_test_c_cat, verbose=2)\n",
"print('CIFAR - Loss on test data:', scores_cifar[0])\n",
"print('CIFAR - Accuracy on test data:', scores_cifar[1])"
],
"metadata": {
"id": "_1s1v6CUECcw"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"print(classification_report(true_cifar, preds_cifar, target_names=class_names))\n",
"\n",
"conf_matrix_cifar = confusion_matrix(true_cifar, preds_cifar)\n",
"display = ConfusionMatrixDisplay(confusion_matrix=conf_matrix_cifar,\n",
" display_labels=class_names)\n",
"\n",
"plt.figure(figsize=(10,10)) # figsize задаётся здесь\n",
"display.plot(cmap='Blues', colorbar=False) # без figsize\n",
"plt.xticks(rotation=45)\n",
"plt.show()\n"
],
"metadata": {
"id": "ElVAWuiyEPW-"
},
"execution_count": null,
"outputs": []
}
]
}

@ -0,0 +1,256 @@
# -*- coding: utf-8 -*-
"""lw3.ipynb
Automatically generated by Colab.
Original file is located at
https://colab.research.google.com/drive/1whkpae-DQ5QCfyJAnjIH0_Zff9zaT4po
"""
from google.colab import drive
drive.mount('/content/drive')
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks/is_lab3')
import numpy as np
import matplotlib.pyplot as plt
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.models import Sequential
from sklearn.metrics import classification_report, confusion_matrix, ConfusionMatrixDisplay
from sklearn.model_selection import train_test_split
import tensorflow as tf
tf.random.set_seed(123)
np.random.seed(123)
from keras.datasets import mnist
(X_train_full, y_train_full), (X_test_full, y_test_full) = mnist.load_data()
X = np.concatenate((X_train_full, X_test_full), axis=0)
y = np.concatenate((y_train_full, y_test_full), axis=0)
k = 5
random_state = 4 * k - 1
X_train, X_test, y_train, y_test = train_test_split(
X, y, train_size=60000, test_size=10000, random_state=random_state, shuffle=True
)
print('Shape of X_train:', X_train.shape)
print('Shape of y_train:', y_train.shape)
print('Shape of X_test:', X_test.shape)
print('Shape of y_test:', y_test.shape)
num_classes = 10
input_shape = (28, 28, 1)
# приведение значений к диапазону [0,1]
X_train = X_train.astype('float32') / 255.0
X_test = X_test.astype('float32') / 255.0
# добавление размерности каналов
X_train = np.expand_dims(X_train, -1)
X_test = np.expand_dims(X_test, -1)
# one-hot кодирование меток
y_train_cat = keras.utils.to_categorical(y_train, num_classes)
y_test_cat = keras.utils.to_categorical(y_test, num_classes)
print('Shape of transformed X_train:', X_train.shape)
print('Shape of transformed y_train:', y_train_cat.shape)
print('Shape of transformed X_test:', X_test.shape)
print('Shape of transformed y_test:', y_test_cat.shape)
batch_size = 512
epochs = 15
model = Sequential()
model.add(layers.Conv2D(32, kernel_size=(3,3), activation='relu', input_shape=input_shape))
model.add(layers.MaxPooling2D(pool_size=(2,2)))
model.add(layers.Conv2D(64, kernel_size=(3,3), activation='relu'))
model.add(layers.MaxPooling2D(pool_size=(2,2)))
model.add(layers.Dropout(0.5))
model.add(layers.Flatten())
model.add(layers.Dense(num_classes, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()
history = model.fit(X_train, y_train_cat, batch_size=batch_size, epochs=epochs, validation_split=0.1)
scores = model.evaluate(X_test, y_test_cat, verbose=2)
print('Loss on test data:', scores[0])
print('Accuracy on test data:', scores[1])
indices = [0, 1]
for n in indices:
result = model.predict(X_test[n:n+1])
plt.figure()
plt.imshow(X_test[n].reshape(28,28), cmap='gray')
plt.title(f"Real: {y_test[n]} Pred: {np.argmax(result)}")
plt.axis('off')
plt.show()
print('NN output vector:', result)
print('Real mark:', y_test[n])
print('NN answer:', np.argmax(result))
true_labels = y_test
predicted_labels = np.argmax(model.predict(X_test), axis=1)
print(classification_report(true_labels, predicted_labels))
conf_matrix = confusion_matrix(true_labels, predicted_labels)
display = ConfusionMatrixDisplay(confusion_matrix=conf_matrix)
display.plot()
plt.show()
from PIL import Image
img_path = '../5.png'
file_data = Image.open(img_path)
file_data = file_data.convert('L') # перевод в градации серого
test_img = np.array(file_data)
plt.imshow(test_img, cmap='gray')
plt.axis('off')
plt.show()
# нормализация и изменение формы
test_proc = test_img.astype('float32') / 255.0
test_proc = np.reshape(test_proc, (1, 28, 28, 1))
result = model.predict(test_proc)
print("NN output vector:", result)
print("I think it's", np.argmax(result))
model_lr1_path = '../best_model_2x100.h5'
if os.path.exists(model_lr1_path):
model_lr1 = load_model(model_lr1_path)
model_lr1.summary()
# подготовка данных специально для полносвязной модели ЛР1
X_test_lr1 = X_test.reshape((X_test.shape[0], 28*28))
X_test_lr1 = X_test_lr1.astype('float32') / 255.0
# здесь нужно использовать X_test_lr1 !
scores_lr1 = model_lr1.evaluate(X_test_lr1, y_test_cat, verbose=2)
print('LR1 model - Loss on test data:', scores_lr1[0])
print('LR1 model - Accuracy on test data:', scores_lr1[1])
else:
print(f"Файл {model_lr1_path} не найден. Поместите сохранённую модель ЛР1 в рабочую директорию.")
# возьмём оригинальные X, y — до всех преобразований для CNN
(X_train_full, y_train_full), (X_test_full, y_test_full) = mnist.load_data()
# объединим, чтобы сделать то же разбиение, что и в ЛР1
X_all = np.concatenate((X_train_full, X_test_full), axis=0)
y_all = np.concatenate((y_train_full, y_test_full), axis=0)
from sklearn.model_selection import train_test_split
X_train_l1, X_test_l1, y_train_l1, y_test_l1 = train_test_split(
X_all, y_all, train_size=60000, test_size=10000, random_state=19
)
# теперь — подготовка данных ЛР1
X_test_lr1 = X_test_l1.reshape((X_test_l1.shape[0], 28*28)).astype('float32') / 255.0
y_test_lr1 = keras.utils.to_categorical(y_test_l1, 10)
# оценка модели
scores_lr1 = model_lr1.evaluate(X_test_lr1, y_test_lr1, verbose=2)
print(scores_lr1)
# загрузка сохранённой модели ЛР1
model_lr1_path = '../best_model_2x100.h5'
model_lr1 = load_model(model_lr1_path)
model_lr1.summary()
# подготовка тестового набора для модели ЛР1
X_test_l1 = X_test_l1.reshape((X_test_l1.shape[0], 28 * 28)).astype('float32') / 255.0
y_test_l1_cat = keras.utils.to_categorical(y_test_l1, 10)
# оценка модели ЛР1
scores_lr1 = model_lr1.evaluate(X_test_l1, y_test_l1_cat, verbose=2)
print('LR1 model - Loss:', scores_lr1[0])
print('LR1 model - Accuracy:', scores_lr1[1])
# оценка сверточной модели ЛР3
scores_conv = model.evaluate(X_test, y_test_cat, verbose=2)
print('Conv model - Loss:', scores_conv[0])
print('Conv model - Accuracy:', scores_conv[1])
# вывод числа параметров обеих моделей
print('LR1 model parameters:', model_lr1.count_params())
print('Conv model parameters:', model.count_params())
from keras.datasets import cifar10
(X_train_c, y_train_c), (X_test_c, y_test_c) = cifar10.load_data()
print('Shapes (original):', X_train_c.shape, y_train_c.shape, X_test_c.shape, y_test_c.shape)
class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer',
'dog', 'frog', 'horse', 'ship', 'truck']
# вывод 25 изображений
plt.figure(figsize=(10,10))
for i in range(25):
plt.subplot(5,5,i+1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(X_train_c[i])
plt.xlabel(class_names[y_train_c[i][0]])
plt.show()
num_classes = 10
input_shape_cifar = (32, 32, 3)
X_train_c = X_train_c.astype('float32') / 255.0
X_test_c = X_test_c.astype('float32') / 255.0
y_train_c_cat = keras.utils.to_categorical(y_train_c, num_classes)
y_test_c_cat = keras.utils.to_categorical(y_test_c, num_classes)
print('Transformed shapes:', X_train_c.shape, y_train_c_cat.shape, X_test_c.shape, y_test_c_cat.shape)
model_cifar = Sequential()
model_cifar.add(layers.Conv2D(32, (3,3), activation='relu', input_shape=input_shape_cifar))
model_cifar.add(layers.MaxPooling2D((2,2)))
model_cifar.add(layers.Conv2D(64, (3,3), activation='relu'))
model_cifar.add(layers.MaxPooling2D((2,2)))
model_cifar.add(layers.Conv2D(128, (3,3), activation='relu'))
model_cifar.add(layers.MaxPooling2D((2,2)))
model_cifar.add(layers.Flatten())
model_cifar.add(layers.Dense(128, activation='relu'))
model_cifar.add(layers.Dropout(0.5))
model_cifar.add(layers.Dense(num_classes, activation='softmax'))
model_cifar.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model_cifar.summary()
batch_size = 512
epochs = 20
history_cifar = model_cifar.fit(X_train_c, y_train_c_cat, batch_size=batch_size, epochs=epochs, validation_split=0.1)
scores_cifar = model_cifar.evaluate(X_test_c, y_test_c_cat, verbose=2)
print('CIFAR - Loss on test data:', scores_cifar[0])
print('CIFAR - Accuracy on test data:', scores_cifar[1])
print(classification_report(true_cifar, preds_cifar, target_names=class_names))
conf_matrix_cifar = confusion_matrix(true_cifar, preds_cifar)
display = ConfusionMatrixDisplay(confusion_matrix=conf_matrix_cifar,
display_labels=class_names)
plt.figure(figsize=(10,10)) # figsize задаётся здесь
display.plot(cmap='Blues', colorbar=False) # без figsize
plt.xticks(rotation=45)
plt.show()

Двоичные данные
lw3 is/pics/i1.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 4.9 KiB

Двоичные данные
lw3 is/pics/i2.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 4.6 KiB

Двоичные данные
lw3 is/pics/i3.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 31 KiB

Двоичные данные
lw3 is/pics/i4.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 2.2 KiB

Двоичные данные
lw3 is/pics/i5.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 123 KiB

Двоичные данные
lw3 is/pics/i6.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 58 KiB

@ -0,0 +1,529 @@
## Лабораторная работа №3 ИС. Распознавание изображений
#### Выполнили: Ишутина Е. И., Голубев Т. Л.
В работе проводится исследование моделей глубокого обучения при классификации изображений. Рассматривались два набора данных: MNIST с черно-белыми изображениями цифр, и CIFAR-10 с цветными изображениями десяти классов (cat, deer, truck и т.д.) размерности 32×32 пикселя. Для обоих наборов была выполнена нормализация и приведение меток классов к формату one-hot.
One-hot - кодирование данных в виде вектора, содержащего столько элементов, сколько существует классов. Все элементы равны нулю (или близки) кроме значения на позиции, соответствующей истинному классу (там значение ближе к единице). Такой формат нужен в нейронных сетях, где выходной слой формирует распределение вероятностей по классам.
Для набора MNIST обучена сверточная нейронная сеть, а затем произведено её сравнение с лучшей полносвязной моделью из ЛР1. Для набора CIFAR-10 была реализована модель сверточной нейронной сети и оценена результативность ее работы.
## Задание 1
#### *1. В среде Google Colab создать новый блокнот (notebook). Импортировать необходимые для работы библиотеки и модули*
Подключены библиотеки. Создана рабочая директория на Google Диске и зафиксированы генераторы случайных чисел для обеспечения воспроизводимости результатов.
```python
from google.colab import drive
drive.mount('/content/drive')
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks/is_lab3')
import numpy as np
import matplotlib.pyplot as plt
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.models import Sequential
from sklearn.metrics import classification_report, confusion_matrix, ConfusionMatrixDisplay
from sklearn.model_selection import train_test_split
import tensorflow as tf
tf.random.set_seed(123)
np.random.seed(123)
```
```python
Mounted at /content/drive
```
#### *2. Загрузить набор данных MNIST, содержащий размеченные изображения рукописных цифр.*
Загружен набор данных MNIST, включающий 70 000 размеченных изображений рукописных цифр размерностью 28×28 пикселей. Набор состоял из 60 000 изображений обучающей выборки и 10 000 изображений тестовой выборки, при этом каждой матрице пикселей соответствовала метка класса от 0 до 9. После загрузки обе части набора были объединены в единые массивы данных, чтобы потом выполнить разбиение согласно варианту задания.
```python
from keras.datasets import mnist
(X_train_full, y_train_full), (X_test_full, y_test_full) = mnist.load_data()
X = np.concatenate((X_train_full, X_test_full), axis=0)
y = np.concatenate((y_train_full, y_test_full), axis=0)
```
```python
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz
11490434/11490434 ━━━━━━━━━━━━━━━━━━━━ 0s 0us/step
```
#### *3. Разбить набор данных на обучающие и тестовые данные в соотношении 60000:10000 элементов. При разбиении параметр random_state выбрать равным (4k–1), где k – номер бригады. Вывести размерности полученных обучающих и тестовых массивов данных.*
```python
k = 5
random_state = 4 * k - 1
X_train, X_test, y_train, y_test = train_test_split(
X, y, train_size=60000, test_size=10000, random_state=random_state, shuffle=True
)
print('Shape of X_train:', X_train.shape)
print('Shape of y_train:', y_train.shape)
print('Shape of X_test:', X_test.shape)
print('Shape of y_test:', y_test.shape)
```
Выведенные размерности подтвердили корректность проведённого разбиения и соответствие полученных массивов заданным параметрам.
```python
Shape of X_train: (60000, 28, 28)
Shape of y_train: (60000,)
Shape of X_test: (10000, 28, 28)
Shape of y_test: (10000,)
```
#### *4. Провести предобработку данных: привести обучающие и тестовые данные к формату, пригодному для обучения сверточной нейронной сети. Входные данные должны принимать значения от 0 до 1, метки цифр должны быть закодированы по принципу «one-hot encoding». Вывести размерности предобработанных обучающих и тестовых массивов данных.*
Значения пикселей приведены к диапазону [0, 1], метки классов были преобразованы в формат one-hot, где каждый класс представлен вектором длины десять.
```python
num_classes = 10
input_shape = (28, 28, 1)
# приведение значений к диапазону [0,1]
X_train = X_train.astype('float32') / 255.0
X_test = X_test.astype('float32') / 255.0
# добавление размерности каналов
X_train = np.expand_dims(X_train, -1)
X_test = np.expand_dims(X_test, -1)
# one-hot кодирование меток
y_train_cat = keras.utils.to_categorical(y_train, num_classes)
y_test_cat = keras.utils.to_categorical(y_test, num_classes)
print('Shape of transformed X_train:', X_train.shape)
print('Shape of transformed y_train:', y_train_cat.shape)
print('Shape of transformed X_test:', X_test.shape)
print('Shape of transformed y_test:', y_test_cat.shape)
```
Выведенные размерности подтвердили корректное преобразование изображений в тензоры формы 28×28×1 и меток в матрицы 60000×10 и 10000×10 для обучающей и тестовой выборок соответственно.
```python
Shape of transformed X_train: (60000, 28, 28, 1)
Shape of transformed y_train: (60000, 10)
Shape of transformed X_test: (10000, 28, 28, 1)
Shape of transformed y_test: (10000, 10)
```
#### *5. Реализовать модель сверточной нейронной сети и обучить ее на обучающих данных с выделением части обучающих данных в качестве валидационных. Вывести информацию об архитектуре нейронной сети.*
Пояснения по коду:
* batch_size – размер батча (количество изображений, обрабатываемых одновременно за один шаг градиентного спуска). Используется Sequential API, где слои добавляются один за другим. Это удобно для простых последовательных моделей CNN.
* Conv2D(32, (3,3)): 32 фильтра размером 3×3, которые будут сканировать изображение.
* input_shape=input_shape: форма входных данных (например, (28,28,1) для серых изображений MNIST).
* MaxPooling2D(2,2) уменьшает размерность признаков в 2 раза, выбирая максимум в каждом окне 2×2.
* Dropout(0.5) случайным образом отключает 50% нейронов во время обучения, чтобы уменьшить переобучение.
```python
batch_size = 512
epochs = 15
model = Sequential()
model.add(layers.Conv2D(32, kernel_size=(3,3), activation='relu', input_shape=input_shape))
model.add(layers.MaxPooling2D(pool_size=(2,2)))
model.add(layers.Conv2D(64, kernel_size=(3,3), activation='relu'))
model.add(layers.MaxPooling2D(pool_size=(2,2)))
model.add(layers.Dropout(0.5))
model.add(layers.Flatten())
model.add(layers.Dense(num_classes, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()
history = model.fit(X_train, y_train_cat, batch_size=batch_size, epochs=epochs, validation_split=0.1)
```
```python
/usr/local/lib/python3.12/dist-packages/keras/src/layers/convolutional/base_conv.py:113: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
super().__init__(activity_regularizer=activity_regularizer, **kwargs)
Model: "sequential"
| Layer (type) | Output shape | Param # |
|----------------------------|----------------------|---------|
| conv2d (Conv2D) | (None, 26, 26, 32) | 320 |
| max_pooling2d (MaxPooling) | (None, 13, 13, 32) | 0 |
| conv2d_1 (Conv2D) | (None, 11, 11, 64) | 18,496 |
| max_pooling2d_1 (MaxPooling) | (None, 5, 5, 64) | 0 |
| dropout (Dropout) | (None, 5, 5, 64) | 0 |
| flatten (Flatten) | (None, 1600) | 0 |
| dense (Dense) | (None, 10) | 16,010 |
Total params: 34,826 (136.04 KB)
Trainable params: 34,826 (136.04 KB)
Non-trainable params: 0 (0.00 B)
```
#### *6. Оценить качество обучения на тестовых данных. Вывести значение функции ошибки и значение метрики качества классификациина тестовых данных.*
```python
scores = model.evaluate(X_test, y_test_cat, verbose=2)
print('Loss on test data:', scores[0])
print('Accuracy on test data:', scores[1])
```
```python
313/313 - 3s - 8ms/step - accuracy: 0.9879 - loss: 0.0402
Loss on test data: 0.04024936258792877
Accuracy on test data: 0.9879000186920166
```
Vодель обучена хорошо и показывает высокое качество на тестовой выборке.
#### *7. Подать на вход обученной модели два тестовых изображения. Вывести изображения, истинные метки и результаты распознавания.*
Пояснения по коду:
* Берём два изображения из тестового набора (с индексами 0 и 1).
* X_test[n:n+1] — формируем батч из одного изображения.
* model.predict() возвращает вектор вероятностей для каждого класса (10 элементов для цифр 0–9).
* NN output vector показывает вероятности для всех 10 классов.
```python
indices = [0, 1]
for n in indices:
result = model.predict(X_test[n:n+1])
plt.figure()
plt.imshow(X_test[n].reshape(28,28), cmap='gray')
plt.title(f"Real: {y_test[n]} Pred: {np.argmax(result)}")
plt.axis('off')
plt.show()
print('NN output vector:', result)
print('Real mark:', y_test[n])
print('NN answer:', np.argmax(result))
```
![image](pics/i1.png)
```python
NN output vector: [[3.5711860e-08 3.5435047e-11 6.5117740e-07 7.4699518e-09 5.9110135e-08
1.4115658e-03 9.9851364e-01 2.6488631e-12 7.4022493e-05 2.6488609e-10]]
Real mark: 6
NN answer: 6
```
![image](pics/i2.png)
```python
NN output vector: [[9.2878885e-08 3.3229617e-06 4.1963812e-04 3.1485452e-04 1.7722991e-09
2.6501787e-09 5.7302459e-13 9.9888808e-01 1.0063148e-05 3.6401587e-04]]
Real mark: 7
NN answer: 7
```
Как видно, модель верно распознала случайно выбранные две цифры. В выходном векторе у всех значений, кроме позиции верного класса, были значения порядка 10^-4 - 10^-13. Значение для верного класса близко к единице.
#### *8. Вывести отчет о качестве классификации тестовой выборки и матрицу ошибок для тестовой выборки.*
* Precision = 0.99 для класса 0 означает, что почти все объекты, которые сеть предсказала как «0», действительно 0. Recall 1.00 для класса 0 означает, что сеть нашла все объекты «0» в тестовой выборке.
Accuracy (общая точность) = 0.99 дает понять, что модель правильно классифицирует 99% изображений.
* В матрице ошибок основная часть значений находится на диагонали, а значит, большинство предсказаний верные. С помощью небольших ошибок вне диагоналей можно понять, какие числа нейросеть «путает». Например, сеть может перепутать «4» и «9», или «3» и «5», если они визуально похожи.
```python
true_labels = y_test
predicted_labels = np.argmax(model.predict(X_test), axis=1)
print(classification_report(true_labels, predicted_labels))
conf_matrix = confusion_matrix(true_labels, predicted_labels)
display = ConfusionMatrixDisplay(confusion_matrix=conf_matrix)
display.plot()
plt.show()
```
```python
precision recall f1-score support
0 0.99 1.00 0.99 969
1 0.99 0.99 0.99 1155
2 0.99 0.98 0.98 969
3 0.99 0.99 0.99 1032
4 1.00 0.98 0.99 1016
5 0.98 0.99 0.98 898
6 0.99 0.99 0.99 990
7 0.98 0.99 0.99 1038
8 0.99 0.98 0.99 913
9 0.99 0.98 0.98 1020
accuracy 0.99 10000
macro avg 0.99 0.99 0.99 10000
weighted avg 0.99 0.99 0.99 10000
```
![image](pics/i3.png)
#### *9. Загрузить, предобработать и подать на вход обученной нейронной сети собственное изображение, созданное при выполнении лабораторной работы №1. Вывести изображение и результат распознавания.*
```python
from PIL import Image
img_path = '../5.png'
file_data = Image.open(img_path)
file_data = file_data.convert('L') # перевод в градации серого
test_img = np.array(file_data)
plt.imshow(test_img, cmap='gray')
plt.axis('off')
plt.show()
# нормализация и изменение формы
test_proc = test_img.astype('float32') / 255.0
test_proc = np.reshape(test_proc, (1, 28, 28, 1))
result = model.predict(test_proc)
print("NN output vector:", result)
print("I think it's", np.argmax(result))
```
![image](pics/i4.png)
```python
NN output vector: [[1.5756325e-12 5.2755486e-15 1.4891595e-10 7.3797599e-07 1.8559115e-12
9.9998915e-01 3.5407410e-08 5.2025315e-12 1.5018414e-06 8.6681475e-06]]
I think it's 5
```
### 10. Загрузить с диска модель, сохраненную при выполнении лабораторной работы №1. Вывести информацию об архитектуре модели.Повторить для этой модели п.6.
При работе с моделью из ЛР1 необходимо взять данные в исходном формате, иначе получится двойная нормализация. В CNN данные нормализовались на этапе подготовки к сети (X/255.0 и reshape к (28,28,1)), но модель из ЛР1 ожидала плоский вектор 784 элементов на изображение.
```python
# возьмём оригинальные X, y — до всех преобразований для CNN
(X_train_full, y_train_full), (X_test_full, y_test_full) = mnist.load_data()
# объединим, чтобы сделать то же разбиение, что и в ЛР1
X_all = np.concatenate((X_train_full, X_test_full), axis=0)
y_all = np.concatenate((y_train_full, y_test_full), axis=0)
from sklearn.model_selection import train_test_split
X_train_l1, X_test_l1, y_train_l1, y_test_l1 = train_test_split(
X_all, y_all, train_size=60000, test_size=10000, random_state=19
)
# теперь — подготовка данных ЛР1
X_test_lr1 = X_test_l1.reshape((X_test_l1.shape[0], 28*28)).astype('float32') / 255.0
y_test_lr1 = keras.utils.to_categorical(y_test_l1, 10)
# оценка модели
scores_lr1 = model_lr1.evaluate(X_test_lr1, y_test_lr1, verbose=2)
print(scores_lr1)
```
Точность уменьшилась, так как в ЛР1 использовалась полносвязная сеть, а не сверточная. Сверточные сети лучше извлекают признаки у изображений, а потому дают большую точность.
```python
313/313 - 2s - 6ms/step - accuracy: 0.9445 - loss: 0.1969
[0.1968761384487152, 0.9445000290870667]
```
### 11. Сравнить обученную модель сверточной сети и наилучшую модель полносвязной сети из лабораторной работы №1 по следующим показателям: количество настраиваемых параметров в сети, количество эпох обучения, качество классификации тестовой выборки. Сделать выводы по результатам применения сверточной нейронной сети для распознавания изображений.
```python
# загрузка сохранённой модели ЛР1
model_lr1_path = '../best_model_2x100.h5'
model_lr1 = load_model(model_lr1_path)
model_lr1.summary()
# подготовка тестового набора для модели ЛР1
X_test_l1 = X_test_l1.reshape((X_test_l1.shape[0], 28 * 28)).astype('float32') / 255.0
y_test_l1_cat = keras.utils.to_categorical(y_test_l1, 10)
# оценка модели ЛР1
scores_lr1 = model_lr1.evaluate(X_test_l1, y_test_l1_cat, verbose=2)
print('LR1 model - Loss:', scores_lr1[0])
print('LR1 model - Accuracy:', scores_lr1[1])
# оценка сверточной модели ЛР3
scores_conv = model.evaluate(X_test, y_test_cat, verbose=2)
print('Conv model - Loss:', scores_conv[0])
print('Conv model - Accuracy:', scores_conv[1])
# вывод числа параметров обеих моделей
print('LR1 model parameters:', model_lr1.count_params())
print('Conv model parameters:', model.count_params())
```
В MLP (ЛР1) количество параметров = 89610, а в CNN (ЛР3) оно равно 34826. CNN имеет значительно меньше параметров, примерно в 2,5 раза меньше, чем MLP. Это произошло потому, что в сверточных слоях параметры делятся по ядрам свертки и применяются к локальным областям изображения, что снижает избыточность. MLP полностью соединяет все нейроны между слоями, а значит, имеет больше весов. Меньшее число параметров влечет к меньшей вероятности переобучения и более экономное использование памяти.
Значение функции потерь у CNN почти в 5 раз меньше, что указывает на лучшее соответствие предсказаний истинным меткам.
```python
WARNING:absl:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model.
Model: "sequential_9"
| Layer (type) | Output shape | Param # |
|--------------|--------------|---------|
| dense_18 | (None, 100) | 78,500 |
| dense_19 | (None, 100) | 10,100 |
| dense_20 | (None, 10) | 1,010 |
Total params: 89,612 (350.05 KB)
Trainable params: 89,610 (350.04 KB)
Non-trainable params: 0 (0.00 B)
Optimizer params: 2 (12.00 B)
313/313 - 3s - 9ms/step - accuracy: 0.9445 - loss: 0.1969
LR1 model - Loss: 0.1968761384487152
LR1 model - Accuracy: 0.9445000290870667
313/313 - 6s - 20ms/step - accuracy: 0.9879 - loss: 0.0402
Conv model - Loss: 0.04024936258792877
Conv model - Accuracy: 0.9879000186920166
LR1 model parameters: 89610
Conv model parameters: 34826
```
## Задание 2.
#### *1–3. Загрузка CIFAR-10 и разбиение 50 000 : 10 000, вывод 25 изображений*
CIFAR-10 — это стандартный набор цветных изображений маленького размера (32×32 пикселя) с 10 классами объектов, включая транспорт, животных и птиц, предназначенный для задач классификации изображений.
Аналогично заданию №1, данные нормализуются и преобразовываются в формат one-hot.
```python
from keras.datasets import cifar10
(X_train_c, y_train_c), (X_test_c, y_test_c) = cifar10.load_data()
print('Shapes (original):', X_train_c.shape, y_train_c.shape, X_test_c.shape, y_test_c.shape)
class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer',
'dog', 'frog', 'horse', 'ship', 'truck']
# вывод 25 изображений
plt.figure(figsize=(10,10))
for i in range(25):
plt.subplot(5,5,i+1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(X_train_c[i])
plt.xlabel(class_names[y_train_c[i][0]])
plt.show()
```
```python
Downloading data from https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz
170498071/170498071 ━━━━━━━━━━━━━━━━━━━━ 4s 0us/step
Shapes (original): (50000, 32, 32, 3) (50000, 1) (10000, 32, 32, 3) (10000, 1)
```
![image](pics/i5.png)
#### *4. Предобработка CIFAR-10 (нормализация и one-hot)*
```python
num_classes = 10
input_shape_cifar = (32, 32, 3)
X_train_c = X_train_c.astype('float32') / 255.0
X_test_c = X_test_c.astype('float32') / 255.0
y_train_c_cat = keras.utils.to_categorical(y_train_c, num_classes)
y_test_c_cat = keras.utils.to_categorical(y_test_c, num_classes)
print('Transformed shapes:', X_train_c.shape, y_train_c_cat.shape, X_test_c.shape, y_test_c_cat.shape)
```
```python
Transformed shapes: (50000, 32, 32, 3) (50000, 10) (10000, 32, 32, 3) (10000, 10)
```
#### *5. Реализация и обучение сверточной сети для CIFAR-10*
Используются три слоя Conv2D с увеличивающимся числом фильтров (32 → 64 → 128) для извлечения признаков с изображений CIFAR-10. Между сверточными слоями используются MaxPooling2D для уменьшения размерности и концентрации на важных признаках.
```python
model_cifar = Sequential()
model_cifar.add(layers.Conv2D(32, (3,3), activation='relu', input_shape=input_shape_cifar))
model_cifar.add(layers.MaxPooling2D((2,2)))
model_cifar.add(layers.Conv2D(64, (3,3), activation='relu'))
model_cifar.add(layers.MaxPooling2D((2,2)))
model_cifar.add(layers.Conv2D(128, (3,3), activation='relu'))
model_cifar.add(layers.MaxPooling2D((2,2)))
model_cifar.add(layers.Flatten())
model_cifar.add(layers.Dense(128, activation='relu'))
model_cifar.add(layers.Dropout(0.5))
model_cifar.add(layers.Dense(num_classes, activation='softmax'))
model_cifar.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model_cifar.summary()
batch_size = 512
epochs = 20
history_cifar = model_cifar.fit(X_train_c, y_train_c_cat, batch_size=batch_size, epochs=epochs, validation_split=0.1)
```
```python
/usr/local/lib/python3.12/dist-packages/keras/src/layers/convolutional/base_conv.py:113: UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.
super().__init__(activity_regularizer=activity_regularizer, **kwargs)
Model: "sequential_1"
| Layer (type) | Output Shape | Param # |
| ------------------------------ | ------------------ | ------- |
| conv2d_2 (Conv2D) | (None, 30, 30, 32) | 896 |
| max_pooling2d_2 (MaxPooling2D) | (None, 15, 15, 32) | 0 |
| conv2d_3 (Conv2D) | (None, 13, 13, 64) | 18,496 |
| max_pooling2d_3 (MaxPooling2D) | (None, 6, 6, 64) | 0 |
| conv2d_4 (Conv2D) | (None, 4, 4, 128) | 73,856 |
| max_pooling2d_4 (MaxPooling2D) | (None, 2, 2, 128) | 0 |
| flatten_1 (Flatten) | (None, 512) | 0 |
| dense_1 (Dense) | (None, 128) | 65,664 |
| dropout_1 (Dropout) | (None, 128) | 0 |
| dense_2 (Dense) | (None, 10) | 1,290 |
Total params: 160,202 (625.79 KB)
Trainable params: 160,202 (625.79 KB)
Non-trainable params: 0 (0.00 B)
```
#### *6. Оценка качества на тестовой выборке CIFAR-10*
```python
scores_cifar = model_cifar.evaluate(X_test_c, y_test_c_cat, verbose=2)
print('CIFAR - Loss on test data:', scores_cifar[0])
print('CIFAR - Accuracy on test data:', scores_cifar[1])
```
```python
313/313 - 8s - 26ms/step - accuracy: 0.6855 - loss: 0.8885
CIFAR - Loss on test data: 0.8884508609771729
CIFAR - Accuracy on test data: 0.6855000257492065
```
#### *7-8. Подать два тестовых изображения: одно верно, другое ошибочно. Вывести отчет о качестве классификации тестовой выборки и матрицу ошибок для тестовой выборки*
```python
print(classification_report(true_cifar, preds_cifar, target_names=class_names))
conf_matrix_cifar = confusion_matrix(true_cifar, preds_cifar)
display = ConfusionMatrixDisplay(confusion_matrix=conf_matrix_cifar,
display_labels=class_names)
plt.figure(figsize=(10,10)) # figsize задаётся здесь
display.plot(cmap='Blues', colorbar=False) # без figsize
plt.xticks(rotation=45)
plt.show()
```
```python
precision recall f1-score support
airplane 0.78 0.66 0.71 1000
automobile 0.82 0.81 0.81 1000
bird 0.61 0.55 0.58 1000
cat 0.49 0.43 0.46 1000
deer 0.62 0.67 0.64 1000
dog 0.51 0.71 0.59 1000
frog 0.81 0.73 0.77 1000
horse 0.72 0.71 0.71 1000
ship 0.77 0.82 0.80 1000
truck 0.80 0.76 0.78 1000
accuracy 0.69 10000
macro avg 0.69 0.69 0.69 10000
weighted avg 0.69 0.69 0.69 10000
<Figure size 1000x1000 with 0 Axes>
```
![image](pics/i6.png)
Для CIFAR-10 точность составила ~68.55%, что ниже, чем для MNIST, из-за большей сложности изображений (цветные, более сложные объекты).
Видно, что классы cat и dog хуже распознаются (точность 0.49 и 0.51), а automobile, ship, truck распознаются лучше (~0.8).
Матрица ошибок (ConfusionMatrixDisplay) позволяет визуально увидеть, какие классы чаще путаются между собой (например, cat и dog).
## Вывод
Проведенное исследование показало, что сверточные нейронные сети превосходят полносвязные модели в задачах распознавания изображений. Для MNIST сверточная сеть достигла точности 98,79% при меньшем числе параметров (34826 против 89610 у MLP), что обеспечивает более экономное использование памяти и снижает риск переобучения.
На более сложном наборе CIFAR-10 сеть показала точность 68,55%, при этом объекты с визуально схожими признаками, например кошки и собаки, распознаются хуже, чем однозначные объекты, такие как автомобили и корабли. Результаты демонстрируют, что сверточные сети эффективно извлекают признаки из изображений и обеспечивают высокое качество классификации, особенно на структурированных данных, хотя для сложных цветных изображений требуется более глубокая архитектура или дополнительные методы улучшения обучения.

@ -0,0 +1,313 @@
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"provenance": [],
"gpuType": "T4"
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
},
"accelerator": "GPU"
},
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "4W5M3DBiisqY"
},
"outputs": [],
"source": [
"import tensorflow as tf\n",
"device_name = tf.test.gpu_device_name()\n",
"if device_name != '/device:GPU:0':\n",
" raise SystemError('GPU device not found')\n",
"print('Found GPU at: {}'.format(device_name))\n"
]
},
{
"cell_type": "code",
"source": [
"import os\n",
"import random\n",
"import numpy as np\n",
"import tensorflow as tf\n",
"from tensorflow import keras\n",
"from tensorflow.keras import layers\n",
"from tensorflow.keras.datasets import imdb\n",
"from tensorflow.keras.preprocessing.sequence import pad_sequences\n",
"from sklearn.metrics import classification_report, roc_curve, auc, roc_auc_score\n",
"\n",
"print(\"TensorFlow version:\", tf.__version__)"
],
"metadata": {
"id": "k7GXIRZQtYzM"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"k = 5\n",
"seed = 4 * k - 1\n",
"\n",
"vocabulary_size = 5000\n",
"index_from = 3\n",
"\n",
"(X_train, y_train), (X_test, y_test) = imdb.load_data(\n",
" path=\"imdb.npz\",\n",
" num_words=vocabulary_size,\n",
" skip_top=0,\n",
" maxlen=None,\n",
" seed=seed,\n",
" start_char=1,\n",
" oov_char=2,\n",
" index_from=index_from\n",
")\n",
"\n",
"print(\"Размеры: X_train={}, y_train={}, X_test={}, y_test={}\".format(\n",
" X_train.shape, y_train.shape, X_test.shape, y_test.shape))\n"
],
"metadata": {
"id": "pbNyjOJItin3"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"# 3) Отобразить один отзыв в виде индексов и в виде текста; вывести длину и метку\n",
"# Сначала подготовим словарь id->word\n",
"word_to_id = imdb.get_word_index()\n",
"word_to_id = {key: (value + index_from) for key, value in word_to_id.items()}\n",
"word_to_id[\"<PAD>\"] = 0\n",
"word_to_id[\"<START>\"] = 1\n",
"word_to_id[\"<UNK>\"] = 2\n",
"word_to_id[\"<UNUSED>\"] = 3\n",
"id_to_word = {value: key for key, value in word_to_id.items()}\n",
"\n",
"some_index = 0 # индекс примера в X_train; при необходимости изменить\n",
"review_indices = X_train[some_index]\n",
"print(\"Отзыв (список индексов):\", review_indices)\n",
"review_text = ' '.join(id_to_word.get(i, \"<UNK>\") for i in review_indices)\n",
"print(\"\\nОтзыв (текст):\\n\", review_text)\n",
"print(\"\\nДлина отзыва (число индексов):\", len(review_indices))\n",
"print(\"Меткa класса (y):\", y_train[some_index],\n",
" \"- название класса:\", (\"Positive\" if y_train[some_index] == 1 else \"Negative\"))\n"
],
"metadata": {
"id": "SVmnorZgt6Bv"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"# 4) Максимальная и минимальная длина отзыва в обучающем множестве\n",
"max_len = len(max(X_train, key=len))\n",
"min_len = len(min(X_train, key=len))\n",
"print(\"Максимальная длина отзыва (в индексах):\", max_len)\n",
"print(\"Минимальная длина отзыва (в индексах):\", min_len)"
],
"metadata": {
"id": "qIRCcZdNuG3f"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"# 5) Предобработка — приведение к единой длине\n",
"max_words = 500\n",
"X_train_prep = pad_sequences(X_train, maxlen=max_words, value=0, padding='pre', truncating='post')\n",
"X_test_prep = pad_sequences(X_test, maxlen=max_words, value=0, padding='pre', truncating='post')\n",
"print(\"Форма X_train_prep:\", X_train_prep.shape)\n",
"print(\"Форма X_test_prep:\", X_test_prep.shape)"
],
"metadata": {
"id": "nxrBn8g2uKFY"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"# 6) Проверка: максимальная и минимальная длина после предобработки\n",
"print(\"После предобработки: длина\", X_train_prep.shape[1])"
],
"metadata": {
"id": "Uvac7sCEuRPS"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"# 7) Показать тот же отзыв после предобработки и сравнить\n",
"prep_review_indices = X_train_prep[some_index]\n",
"print(\"Предобработанный отзыв (индексы):\", prep_review_indices)\n",
"prep_review_text = ' '.join(id_to_word.get(i, \"<PAD>\") for i in prep_review_indices if i != 0)\n",
"print(\"\\nПредобработанный отзыв (текст, без <PAD>):\\n\", prep_review_text)\n",
"print(\"\\nДлина предобработанного отзыва:\", len(prep_review_indices))"
],
"metadata": {
"id": "0TM-1v-DuWtH"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"# 8) Вывести массивы и размерности\n",
"print(\"X_train_prep shape:\", X_train_prep.shape)\n",
"print(\"X_test_prep shape: \", X_test_prep.shape)\n",
"print(\"y_train shape:\", y_train.shape)\n",
"print(\"y_test shape: \", y_test.shape)\n",
"# Показать первые 3 примера предобработанных входов и меток\n",
"for i in range(3):\n",
" print(f\"\\nПример {i} (индексы):\", X_train_prep[i][:300], \"...\")\n",
" print(f\"Метка:\", y_train[i])"
],
"metadata": {
"id": "XxQ_xW3oubMs"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"# 9) Создание и обучение модели\n",
"vocab_size = vocabulary_size\n",
"embedding_dim = 32\n",
"input_length = max_words\n",
"\n",
"model = keras.Sequential([\n",
" layers.Embedding(input_dim=vocab_size, output_dim=embedding_dim, input_length=input_length),\n",
" layers.LSTM(64),\n",
" layers.Dropout(0.3),\n",
" layers.Dense(1, activation='sigmoid')\n",
"])\n",
"\n",
"model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])\n",
"model.summary()\n",
"\n",
"# Обучение с выделением валидации\n",
"history = model.fit(\n",
" X_train_prep, y_train,\n",
" epochs=4,\n",
" batch_size=64,\n",
" validation_split=0.2,\n",
" verbose=1\n",
")"
],
"metadata": {
"id": "uM62eg4duyBd"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"# 10) Оценка качества на тестовой выборке\n",
"# Оценка метрик\n",
"eval_results = model.evaluate(X_test_prep, y_test, verbose=1)\n",
"print(\"Результаты оценки на тесте (loss, accuracy):\", eval_results)\n",
"\n",
"# Получение \"сырых\" предсказаний и бинарных меток\n",
"y_score = model.predict(X_test_prep)\n",
"y_pred = [1 if y_score[i,0] >= 0.5 else 0 for i in range(len(y_score))]\n",
"\n",
"# Отчёт о качестве классификации\n",
"print(\"\\nClassification report:\\n\")\n",
"print(classification_report(y_test, y_pred, labels=[0,1], target_names=['Negative','Positive']))\n",
"\n",
"# ROC-кривая и AUC\n",
"fpr, tpr, thresholds = roc_curve(y_test, y_score)\n",
"roc_auc = auc(fpr, tpr)\n",
"print(\"\\nAUC ROC (ручной вычисление):\", roc_auc)\n",
"print(\"AUC ROC (sklearn):\", roc_auc_score(y_test, y_score))\n",
"\n",
"# Построение ROC-кривой (в Colab отобразится график)\n",
"import matplotlib.pyplot as plt\n",
"plt.figure()\n",
"plt.plot(fpr, tpr)\n",
"plt.grid()\n",
"plt.xlabel('False Positive Rate')\n",
"plt.ylabel('True Positive Rate')\n",
"plt.title('ROC')\n",
"plt.show()"
],
"metadata": {
"id": "332eGXS9vJNm"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"# ищем индекс отзыва, длина которого > 500\n",
"long_index = None\n",
"for i, review in enumerate(X_train):\n",
" if len(review) > 500:\n",
" long_index = i\n",
" break\n",
"\n",
"print(\"Найден индекс длинного отзыва:\", long_index)\n",
"print(\"Исходная длина:\", len(X_train[long_index]))\n",
"\n",
"# исходные индексы\n",
"orig = X_train[long_index]\n",
"\n",
"# преобразование индексов в текст\n",
"def to_text(indices):\n",
" return ' '.join(id_to_word.get(i, \"<UNK>\") for i in indices)\n",
"\n",
"print(\"\\nИсходный отзыв (первые 50 индексов):\")\n",
"print(orig[:50])\n",
"print(\"\\nТекст (первые 50 токенов):\")\n",
"print(to_text(orig[:50]))\n",
"\n",
"print(\"\\nИсходный отзыв (последние 50 индексов):\")\n",
"print(orig[-50:])\n",
"print(\"\\nТекст (последние 50 токенов):\")\n",
"print(to_text(orig[-50:]))\n",
"\n",
"# предобработанный вариант\n",
"prep = X_train_prep[long_index]\n",
"\n",
"print(\"\\nПредобработанный отзыв (длина):\", len(prep))\n",
"\n",
"print(\"\\nПосле предобработки (первые 50 индексов):\")\n",
"print(prep[:50])\n",
"print(\"\\nТекст (первые 50 токенов после обрезания):\")\n",
"print(to_text(prep[:50]))\n",
"\n",
"print(\"\\nПосле предобработки (последние 50 индексов):\")\n",
"print(prep[-50:])\n",
"print(\"\\nТекст (последние 50 токенов после обрезания):\")\n",
"print(to_text(prep[-50:]))\n"
],
"metadata": {
"id": "XHUmdTXl_vKb"
},
"execution_count": null,
"outputs": []
}
]
}

@ -0,0 +1,193 @@
# -*- coding: utf-8 -*-
"""lw4.ipynb
Automatically generated by Colab.
Original file is located at
https://colab.research.google.com/drive/10ShUhpE59sy5SmF1R--Qv5yyzRzMz1ic
"""
import tensorflow as tf
device_name = tf.test.gpu_device_name()
if device_name != '/device:GPU:0':
raise SystemError('GPU device not found')
print('Found GPU at: {}'.format(device_name))
import os
import random
import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.datasets import imdb
from tensorflow.keras.preprocessing.sequence import pad_sequences
from sklearn.metrics import classification_report, roc_curve, auc, roc_auc_score
print("TensorFlow version:", tf.__version__)
k = 5
seed = 4 * k - 1
vocabulary_size = 5000
index_from = 3
(X_train, y_train), (X_test, y_test) = imdb.load_data(
path="imdb.npz",
num_words=vocabulary_size,
skip_top=0,
maxlen=None,
seed=seed,
start_char=1,
oov_char=2,
index_from=index_from
)
print("Размеры: X_train={}, y_train={}, X_test={}, y_test={}".format(
X_train.shape, y_train.shape, X_test.shape, y_test.shape))
# 3) Отобразить один отзыв в виде индексов и в виде текста; вывести длину и метку
# Сначала подготовим словарь id->word
word_to_id = imdb.get_word_index()
word_to_id = {key: (value + index_from) for key, value in word_to_id.items()}
word_to_id["<PAD>"] = 0
word_to_id["<START>"] = 1
word_to_id["<UNK>"] = 2
word_to_id["<UNUSED>"] = 3
id_to_word = {value: key for key, value in word_to_id.items()}
some_index = 0 # индекс примера в X_train; при необходимости изменить
review_indices = X_train[some_index]
print("Отзыв (список индексов):", review_indices)
review_text = ' '.join(id_to_word.get(i, "<UNK>") for i in review_indices)
print("\nОтзыв (текст):\n", review_text)
print("\nДлина отзыва (число индексов):", len(review_indices))
print("Меткa класса (y):", y_train[some_index],
"- название класса:", ("Positive" if y_train[some_index] == 1 else "Negative"))
# 4) Максимальная и минимальная длина отзыва в обучающем множестве
max_len = len(max(X_train, key=len))
min_len = len(min(X_train, key=len))
print("Максимальная длина отзыва (в индексах):", max_len)
print("Минимальная длина отзыва (в индексах):", min_len)
# 5) Предобработка — приведение к единой длине
max_words = 500
X_train_prep = pad_sequences(X_train, maxlen=max_words, value=0, padding='pre', truncating='post')
X_test_prep = pad_sequences(X_test, maxlen=max_words, value=0, padding='pre', truncating='post')
print("Форма X_train_prep:", X_train_prep.shape)
print("Форма X_test_prep:", X_test_prep.shape)
# 6) Проверка: максимальная и минимальная длина после предобработки
print("После предобработки: длина", X_train_prep.shape[1])
# 7) Показать тот же отзыв после предобработки и сравнить
prep_review_indices = X_train_prep[some_index]
print("Предобработанный отзыв (индексы):", prep_review_indices)
prep_review_text = ' '.join(id_to_word.get(i, "<PAD>") for i in prep_review_indices if i != 0)
print("\nПредобработанный отзыв (текст, без <PAD>):\n", prep_review_text)
print("\nДлина предобработанного отзыва:", len(prep_review_indices))
# 8) Вывести массивы и размерности
print("X_train_prep shape:", X_train_prep.shape)
print("X_test_prep shape: ", X_test_prep.shape)
print("y_train shape:", y_train.shape)
print("y_test shape: ", y_test.shape)
# Показать первые 3 примера предобработанных входов и меток
for i in range(3):
print(f"\nПример {i} (индексы):", X_train_prep[i][:300], "...")
print(f"Метка:", y_train[i])
# 9) Создание и обучение модели
vocab_size = vocabulary_size
embedding_dim = 32
input_length = max_words
model = keras.Sequential([
layers.Embedding(input_dim=vocab_size, output_dim=embedding_dim, input_length=input_length),
layers.LSTM(64),
layers.Dropout(0.3),
layers.Dense(1, activation='sigmoid')
])
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()
# Обучение с выделением валидации
history = model.fit(
X_train_prep, y_train,
epochs=4,
batch_size=64,
validation_split=0.2,
verbose=1
)
# 10) Оценка качества на тестовой выборке
# Оценка метрик
eval_results = model.evaluate(X_test_prep, y_test, verbose=1)
print("Результаты оценки на тесте (loss, accuracy):", eval_results)
# Получение "сырых" предсказаний и бинарных меток
y_score = model.predict(X_test_prep)
y_pred = [1 if y_score[i,0] >= 0.5 else 0 for i in range(len(y_score))]
# Отчёт о качестве классификации
print("\nClassification report:\n")
print(classification_report(y_test, y_pred, labels=[0,1], target_names=['Negative','Positive']))
# ROC-кривая и AUC
fpr, tpr, thresholds = roc_curve(y_test, y_score)
roc_auc = auc(fpr, tpr)
print("\nAUC ROC (ручной вычисление):", roc_auc)
print("AUC ROC (sklearn):", roc_auc_score(y_test, y_score))
# Построение ROC-кривой (в Colab отобразится график)
import matplotlib.pyplot as plt
plt.figure()
plt.plot(fpr, tpr)
plt.grid()
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC')
plt.show()
# ищем индекс отзыва, длина которого > 500
long_index = None
for i, review in enumerate(X_train):
if len(review) > 500:
long_index = i
break
print("Найден индекс длинного отзыва:", long_index)
print("Исходная длина:", len(X_train[long_index]))
# исходные индексы
orig = X_train[long_index]
# преобразование индексов в текст
def to_text(indices):
return ' '.join(id_to_word.get(i, "<UNK>") for i in indices)
print("\nИсходный отзыв (первые 50 индексов):")
print(orig[:50])
print("\nТекст (первые 50 токенов):")
print(to_text(orig[:50]))
print("\nИсходный отзыв (последние 50 индексов):")
print(orig[-50:])
print("\nТекст (последние 50 токенов):")
print(to_text(orig[-50:]))
# предобработанный вариант
prep = X_train_prep[long_index]
print("\nПредобработанный отзыв (длина):", len(prep))
print("\nПосле предобработки (первые 50 индексов):")
print(prep[:50])
print("\nТекст (первые 50 токенов после обрезания):")
print(to_text(prep[:50]))
print("\nПосле предобработки (последние 50 индексов):")
print(prep[-50:])
print("\nТекст (последние 50 токенов после обрезания):")
print(to_text(prep[-50:]))

Двоичные данные
lw4 is/pics/i1.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 21 KiB

@ -0,0 +1,328 @@
## Лабораторная работа №4 ИС. Распознавание последовательностей.
#### Выполнили: Ишутина Е. И., Голубев Т. Л.
Проведена работа с отзывами с IMDb в виде последовательностей индексов и в человекочитаемом виде. Выполнена предобработка: все тексты приведены к единой длине путём дополнения / усечения, в результате чего получены матрицы одинаковой размерности, пригодные для подачи в нейронную сеть.
На основании предобработанных данных была построена рекуррентная модель, включавшая слои Embedding, LSTM, Dropout и полносвязный классификатор, и проведено её обучение с использованием доли обучающей выборки в качестве валидационной и проверка точности работы модели.
Перед началом работы импортированы все нужные модули:
```python
# Блок импортов и общих настроек
import os
import random
import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.datasets import imdb
from tensorflow.keras.preprocessing.sequence import pad_sequences
from sklearn.metrics import classification_report, roc_curve, auc, roc_auc_score
print("TensorFlow version:", tf.__version__)
```
* `layers` предоставляет готовые типы слоёв (Embedding, LSTM, Dense и др.).
* `imdb` загружает предобработанный набор IMDb в виде последовательностей индексов.
* `pad_sequences` приводит последовательности к фиксированной длине путём дополнения или усечения.
* `sklearn.metrics` функции для оценки качества классификации (отчёт, ROC, AUC).
#### *1. В среде Google Colab создать новый блокнот (notebook). Настроить блокнот для работы с аппаратным ускорителем GPU.*
```python
# 1) Проверка наличия GPU (в Colab после выбора Runtime -> Change runtime type -> GPU)
device_name = tf.test.gpu_device_name()
if device_name != '/device:GPU:0':
raise SystemError('GPU device not found')
print('Found GPU at: {}'.format(device_name))
```
Вывод дает понять, что подключен аппаратный ускоритель на основе графического процессора (GPU):
```python
Found GPU at: /device:GPU:0
```
#### *2. Загрузить набор данных IMDb, содержащий оцифрованные отзывы на фильмы, размеченные на два класса: позитивные и негативные. При загрузке набора данных параметр seed выбрать равным (4k–1), где k – номер бригады. Вывести размеры полученных обучающих и тестовых массивов данных.*
```python
k = 5
seed = 4 * k - 1
vocabulary_size = 5000
index_from = 3
(X_train, y_train), (X_test, y_test) = imdb.load_data(
path="imdb.npz",
num_words=vocabulary_size,
skip_top=0,
maxlen=None,
seed=seed,
start_char=1,
oov_char=2,
index_from=index_from
)
print("Размеры: X_train={}, y_train={}, X_test={}, y_test={}".format(
X_train.shape, y_train.shape, X_test.shape, y_test.shape))
```
Функция загрузила по 25 000 примеров в обучающую и тестовую выборки, что и было выведено как формы массивов, потому что набор IMDb в keras был заранее организован в таких размерах. В выводе отображались одномерные массивы, поэтому после запятой не было указано никакой второй размерности.
```python
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/imdb.npz
17464789/17464789 ━━━━━━━━━━━━━━━━━━━━ 0s 0us/step
Размеры: X_train=(25000,), y_train=(25000,), X_test=(25000,), y_test=(25000,)
```
#### *3. Вывести один отзыв из обучающего множества в виде списка индексов слов. Преобразовать список индексов в текст и вывести отзыв в виде текста. Вывести длину отзыва. Вывести метку класса данного отзыва и название класса (1 – Positive, 0 – Negative).*
```python
# словарь id->word
word_to_id = imdb.get_word_index()
word_to_id = {key: (value + index_from) for key, value in word_to_id.items()}
word_to_id["<PAD>"] = 0
word_to_id["<START>"] = 1
word_to_id["<UNK>"] = 2
word_to_id["<UNUSED>"] = 3
id_to_word = {value: key for key, value in word_to_id.items()}
some_index = 0
review_indices = X_train[some_index]
print("Отзыв (список индексов):", review_indices)
review_text = ' '.join(id_to_word.get(i, "<UNK>") for i in review_indices)
print("\nОтзыв (текст):\n", review_text)
print("\nДлина отзыва (число индексов):", len(review_indices))
print("Меткa класса (y):", y_train[some_index],
"- название класса:", ("Positive" if y_train[some_index] == 1 else "Negative"))
```
Преобразование индексов в текст выполнялось через обратный словарь `id_to_word`, сформированный из `word_to_id` с учётом сдвига `index_from` и добавления служебных токенов. Для каждого индекса находилось соответствующее слово, а при отсутствии — подставлялся <UNK>. Полученные токены объединялись в строку, что давало текстовое отображение отзыва.
Токен — это минимальная единица текста, с которой работает модель: слово, символ, подслово или специальный маркер. В датасете IMDb токеном является слово, которому присвоен числовой индекс.
Числа в тензоре — это индексы токенов, то есть номера слов в словаре IMDb.
Каждое число соответствует одному слову или служебному токену:
* 1 — START
* 2 — UNK
* 0 — PAD
остальные числа — реальные слова корпуса, закодированные целыми числами.
```python
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/imdb_word_index.json
1641221/1641221 ━━━━━━━━━━━━━━━━━━━━ 0s 0us/step
Отзыв (список индексов): [1, 48, 25, 181, 8, 106, 6, 147, 2, 20, 79, 1070, 7, 4, 2, 2063, 14, 2, ... 989, 143, 8, 4, 2, 15, 1838, 2, 10, 10, 13, 447, 175, 786, 7, 12]
```
```
Отзыв (текст):
<START> if you want to watch a real <UNK> movie get hold of the <UNK> formula this <UNK> film must have cost all of 50 to make it features a <UNK> thin script <UNK> bad sets lighting and camera work and a stop motion paper <UNK> monster that is utterly laughable it looks like they sometimes used a guy in a rubber suit and or a <UNK> <UNK> for the monster but all were equally dreadful br br the actors all speak their lines as though theyve never seen them before and are reading off a <UNK> the special effects are way beyond lousy and the only sad thing is that they dropped the really <UNK> original title <UNK> <UNK> which <UNK> up exactly what you get for the full 90 minutes br br this is what happens when you <UNK> the bottom of the <UNK> so hard you break through to the <UNK> that lies <UNK> br br i loved every minute of it
Длина отзыва (число индексов): 165
Меткa класса (y): 0 - название класса: Negative
```
#### *4. Вывести максимальную и минимальную длину отзыва в обучающем множестве*
```python
max_len = len(max(X_train, key=len))
min_len = len(min(X_train, key=len))
print("Максимальная длина отзыва (в индексах):", max_len)
print("Минимальная длина отзыва (в индексах):", min_len)
```
Видно,что отзывы сильно различаются по объёму, и работать с ними в исходном виде невозможно. Нейронная сеть принимает тензоры фиксированной формы. Без выравнивания обучение невозможно, т.к. батч не может содержать последовательности разной длины.
```python
Максимальная длина отзыва (в индексах): 2494
Минимальная длина отзыва (в индексах): 11
```
#### *5. Провести предобработку данных. Выбрать единую длину, к которой будут приведены все отзывы. Короткие отзывы дополнить спецсимволами, а длинные обрезать до выбранной длины.*
```python
max_words = 500
X_train_prep = pad_sequences(X_train, maxlen=max_words, value=0, padding='pre', truncating='post')
X_test_prep = pad_sequences(X_test, maxlen=max_words, value=0, padding='pre', truncating='post')
print("Форма X_train_prep:", X_train_prep.shape)
print("Форма X_test_prep:", X_test_prep.shape)
```
Все отзывы приведены к фиксированной длине 500. Это значение было выбрано как компромисс: оно достаточно большое, чтобы сохранить основное содержание средних и длинных отзывов, и достаточно маленькое, чтобы не перегружать память и ускорить обучение. При приведении длины короткие отзывы были дополнены токеном <PAD>, а слишком длинные — обрезаны справа.
```python
Форма X_train_prep: (25000, 500)
Форма X_test_prep: (25000, 500)
```
#### *6. Повторить п. 4.*
```python
print("После предобработки: длина", X_train_prep.shape[1])
```
```python
После предобработки: длина 500
```
#### *7. Повторить п. 3. Сделать вывод о том, как отзыв преобразовался после предобработки.*
```python
prep_review_indices = X_train_prep[some_index]
print("Предобработанный отзыв (индексы):", prep_review_indices)
prep_review_text = ' '.join(id_to_word.get(i, "<PAD>") for i in prep_review_indices if i != 0)
print("\nПредобработанный отзыв (текст, без <PAD>):\n", prep_review_text)
print("\nДлина предобработанного отзыва:", len(prep_review_indices))
```
В исходном отзыве оказалось 165 токенов, что меньше выбранной фиксированной длины 500, поэтому при предобработке произошло только дополнение слева токеном PAD, а обрезания не было.
```
Предобработанный отзыв (индексы): [ 0 0 ... 175 786 7 12]
Предобработанный отзыв (текст, без <PAD>):
<START> if you want to watch a real <UNK> movie get hold of the <UNK> formula this <UNK> film must have cost all of 50 to make it features a <UNK> thin script <UNK> bad sets lighting and camera work and a stop motion paper <UNK> monster that is utterly laughable it looks like they sometimes used a guy in a rubber suit and or a <UNK> <UNK> for the monster but all were equally dreadful br br the actors all speak their lines as though they've never seen them before and are reading off a <UNK> the special effects are way beyond lousy and the only sad thing is that they dropped the really <UNK> original title <UNK> <UNK> which <UNK> up exactly what you get for the full 90 minutes br br this is what happens when you <UNK> the bottom of the <UNK> so hard you break through to the <UNK> that lies <UNK> br br i loved every minute of it
Длина предобработанного отзыва: 500
```
Чтобы убедиться в корректности преобразования, найден и выведен отзыв с длиной больше 500, к которому применено обрезание (код для поиска опущен, длинные тензоры укорочены).
```
Исходный отзыв (первые 50 индексов):
[1, 2, 34, 1308, ... 532, 2, 18]
Исходный отзыв (последние 50 индексов):
[4, 323, 198, 89, ... 495]
После предобработки (первые 50 индексов):
[ 1 2 34 1308 ... 532 2 18]
После предобработки (последние 50 индексов):
[ 2 501 ... 10 32]
```
Как видно, последние индексы теперь выглядят по-другому, то есть произошло обрезание. При выводе появляются пробелы, связанные с тем, что Python пытается выровнять столбцы у `tf.Tensor`.
#### *8. Вывести предобработанные массивы обучающих и тестовых данных и их размерности.*
```python
print("X_train_prep shape:", X_train_prep.shape)
print("X_test_prep shape: ", X_test_prep.shape)
print("y_train shape:", y_train.shape)
print("y_test shape: ", y_test.shape)
for i in range(3):
print(f"\nПример {i} (индексы):", X_train_prep[i][:300], "...")
print(f"Метка:", y_train[i])
```
Слишком длинные последовательности индексов были укорочены.
```python
X_train_prep shape: (25000, 500)
X_test_prep shape: (25000, 500)
y_train shape: (25000,)
y_test shape: (25000,)
Пример 0 (индексы): [0 0 0 ... 0 0 0 0]
Метка: 0
Пример 1 (индексы): [ 0 0 0 ... 11 585 2 11 940 11 4 2 720 11 4 4691]
Метка: 1
Пример 2 (индексы): [ 0 0 ... 406 1522 29 186 8 412 27 113]
Метка: 1
```
#### *9. Реализовать модель рекуррентной нейронной сети, состоящей из слоев Embedding, LSTM, Dropout, Dense, и обучить ее на обучающих данных с выделением части обучающих данных в качестве валидационных. Вывести информацию об архитектуре нейронной сети. Добиться качества обучения по метрике accuracy не менее 0.8.*
В этом пункте была реализована рекуррентная нейронная сеть для задачи бинарной классификации.
* Embedding преобразовал числовые индексы слов в плотные векторные представления размерности embedding_dim=32. Благодаря этому слова, имеющие близкий контекст, получали похожие векторы, что облегчало обучение модели.
* LSTM (Long Short-Term Memory) — рекуррентный слой с 64 единицами, он учитывал последовательный порядок слов, позволял модели «помнить» информацию из начала текста при обработке его конца.
* Dropout — слой регуляризации с вероятностью 0.3, случайным образом отключавший часть нейронов во время обучения.
* Dense — полносвязный слой с одним нейроном и сигмоидной активацией, который выдавал вероятность положительного класса (1 — Positive, 0 — Negative).
Обучение проводилось с использованием 80% данных для тренировки и 20% для валидации (validation_split=0.2).
```python
vocab_size = vocabulary_size
embedding_dim = 32
input_length = max_words
model = keras.Sequential([
layers.Embedding(input_dim=vocab_size, output_dim=embedding_dim, input_length=input_length),
layers.LSTM(64),
layers.Dropout(0.3),
layers.Dense(1, activation='sigmoid')
])
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()
# Обучение с выделением валидации
history = model.fit(
X_train_prep, y_train,
epochs=4,
batch_size=64,
validation_split=0.2,
verbose=1
)
```
#### *10. Оценить качество обучения на тестовых данных: вывести значение метрики качества классификации на тестовых данных, вывести отчет о качестве классификации тестовой выборки, построить ROC-кривую по результату обработки тестовой выборки и вычислить площадь под ROC-кривой (AUC ROC).*
```python
eval_results = model.evaluate(X_test_prep, y_test, verbose=1)
print("Результаты оценки на тесте (loss, accuracy):", eval_results)
# Получение "сырых" предсказаний и бинарных меток
y_score = model.predict(X_test_prep)
y_pred = [1 if y_score[i,0] >= 0.5 else 0 for i in range(len(y_score))]
print("\nClassification report:\n")
print(classification_report(y_test, y_pred, labels=[0,1], target_names=['Negative','Positive']))
# ROC-кривая и AUC
fpr, tpr, thresholds = roc_curve(y_test, y_score)
roc_auc = auc(fpr, tpr)
print("\nAUC ROC (ручной вычисление):", roc_auc)
print("AUC ROC (sklearn):", roc_auc_score(y_test, y_score))
import matplotlib.pyplot as plt
plt.figure()
plt.plot(fpr, tpr)
plt.grid()
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC')
plt.show()
```
```python
782/782 ━━━━━━━━━━━━━━━━━━━━ 8s 10ms/step - accuracy: 0.8603 - loss: 0.3458
Результаты оценки на тесте (loss, accuracy): [0.34332218766212463, 0.8626000285148621]
782/782 ━━━━━━━━━━━━━━━━━━━━ 6s 8ms/step
Classification report:
precision recall f1-score support
Negative 0.83 0.92 0.87 12500
Positive 0.91 0.81 0.85 12500
accuracy 0.86 25000
macro avg 0.87 0.86 0.86 25000
weighted avg 0.87 0.86 0.86 25000
AUC ROC (ручной вычисление): 0.9381251584
AUC ROC (sklearn): 0.9381251584
```
![image](pics/i1.png)
Идеальное значение площади под графиком — единица (100% угадывание положительных классов), а худший случай — 0,5 («вслепую»). Значение 0,93 показывает хорошую точность предсказаний.
#### *11. Сделать выводы по результатам применения рекуррентной нейронной сети для решения задачи определения тональности текста.*
В ходе лабораторной работы была построена рекуррентная нейронная сеть с LSTM для задачи бинарной классификации отзывов IMDb. Модель показала высокие показатели качества: точность на тестовой выборке достигла ≈86%, а площадь под ROC-кривой (AUC ROC ≈0.93) подтверждает способность модели надёжно различать положительные и отрицательные отзывы.
Загрузка…
Отмена
Сохранить