Перекрестная проверка (статистика) - Cross-validation (statistics)

Сравнение точности перекрестной проверки и процента ложноотрицательных результатов (переоценки) пяти моделей классификации. Размер пузырьков представляет собой стандартное отклонение точности перекрестной проверки (десятикратное).
Схема k-кратной перекрестной проверки.

Перекрестная проверка , иногда называемая оценкой ротации или тестированием вне выборки , представляет собой любой из различных методов проверки аналогичных моделей для оценки того, как результаты статистического анализа будут обобщены на независимый набор данных. Перекрестная проверка - это метод повторной выборки . Он используется в основном в тех местах , где целью является предсказанием, и один хочет оценить , насколько точно прогнозная модель будет работать на практике. В задаче прогнозирования модели обычно дается набор данных известных данных, на которых выполняется обучение ( набор обучающих данных ), и набор данных из неизвестных данных (или данных, впервые увиденных ), по которым тестируется модель (называемый набором данных проверки или тестированием). набор ). Целью перекрестной проверки является проверка способности модели прогнозировать новые данные, которые не использовались при ее оценке, чтобы отметить проблемы, такие как переоснащение или смещение выбора, и дать представление о том, как модель будет обобщаться на независимый набор данных ( т.е. неизвестный набор данных, например, из реальной проблемы).

Один раунд перекрестной проверки включает в себя разбиение на выборку из данных во дополнительных подмножеств, выполняя анализ на одной подгруппе ( так называемый обучающий набор ), и проверки достоверности анализ на другой подгруппе ( так называемый набор проверки или тестирования набора ). Чтобы уменьшить вариабельность , в большинстве методов выполняется несколько раундов перекрестной проверки с использованием разных разделов, а результаты валидации объединяются (например, усредняются) по циклам, чтобы дать оценку прогностической эффективности модели.

Таким образом, перекрестная проверка объединяет (усредняет) показатели пригодности в прогнозировании для получения более точной оценки эффективности прогнозирования модели.

Мотивация

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

В линейной регрессии у нас есть реальные значения отклика y 1 , ..., y n и n p -мерные векторные ковариаты x 1 , ..., x n . Компоненты вектора x i обозначаются x i 1 , ..., x ip . Если мы используем метод наименьших квадратов для подгонки функции в форме гиперплоскости ŷ = a + β T x к данным ( x i , y i )  1 ≤  i  ≤  n , мы могли бы затем оценить соответствие, используя среднеквадратичную ошибку ( МСЭ). СКО для заданных оценочных значений параметров a и β на обучающем наборе ( x i , y i )  1 ≤  i  ≤  n определяется как

Если модель задана правильно, при умеренных предположениях можно показать, что ожидаемое значение MSE для обучающего набора составляет ( n  -  p  - 1) / ( n  +  p  + 1) <1 раз больше ожидаемого значения MSE. для набора проверки (ожидаемое значение берется из распределения наборов обучения). Таким образом, если мы подгоним модель и вычислим MSE на обучающем наборе, мы получим оптимистически предвзятую оценку того, насколько хорошо модель будет соответствовать независимому набору данных. Эта смещенная оценка называется оценкой соответствия внутри выборки , тогда как оценка перекрестной проверки является оценкой вне выборки .

Поскольку в линейной регрессии можно напрямую вычислить коэффициент ( n  -  p  - 1) / ( n  +  p  + 1), с помощью которого обучающая MSE недооценивает проверочную MSE в предположении, что спецификация модели действительна, перекрестная проверка может использоваться для проверки того, была ли модель переоборудована , и в этом случае MSE в проверочном наборе существенно превысит свое ожидаемое значение. (Перекрестная проверка в контексте линейной регрессии также полезна тем, что ее можно использовать для выбора оптимально регуляризованной функции затрат .) В большинстве других процедур регрессии (например, логистической регрессии ) не существует простой формулы для вычисления ожидаемого результата. соответствие образца. Таким образом, перекрестная проверка является общепринятым способом прогнозирования производительности модели на недоступных данных с использованием числовых вычислений вместо теоретического анализа.

Типы

Можно выделить два типа перекрестной проверки: исчерпывающая и неполная перекрестная проверка.

Исчерпывающая перекрестная проверка

Методы исчерпывающей перекрестной проверки - это методы перекрестной проверки, которые изучают и тестируют все возможные способы разделения исходной выборки на набор для обучения и проверки.

Перекрестная проверка без исключения

Перекрестная проверка с исключением p - out ( LpO CV ) включает использование p наблюдений в качестве набора для проверки и оставшихся наблюдений в качестве обучающего набора. Это повторяется для всех способов вырезания исходной выборки на проверочном наборе из p наблюдений и на обучающем наборе.

Перекрестная проверка LpO требует обучения и проверки времени модели , где n - количество наблюдений в исходной выборке, а где - биномиальный коэффициент . Для p > 1 и даже для умеренно большого n LpO CV может стать вычислительно невыполнимым. Например, при n = 100 и p = 30,

Вариант перекрестной проверки LpO с p = 2, известный как перекрестная проверка исключения-пары, был рекомендован как почти беспристрастный метод для оценки площади под кривой ROC бинарных классификаторов.

Перекрестная проверка без исключения

Иллюстрация перекрестной проверки с исключением по одному (LOOCV) при n = 8 наблюдениях. Всего будет обучено и протестировано 8 моделей.

Перекрестная проверка с исключением одного исключения ( LOOCV ) является частным случаем перекрестной проверки с исключением p- out с p  = 1. Этот процесс похож на складной нож ; однако при перекрестной проверке статистику вычисляют по оставшимся образцам, а при складывании складных ножей вычисляют статистику только по сохраненным образцам.

Перекрестная проверка LOO требует меньше времени вычислений, чем перекрестная проверка LpO, потому что существуют только проходы, а не . Однако проходы могут потребовать довольно большого времени вычислений, и в этом случае другие подходы, такие как k-кратная перекрестная проверка, могут быть более подходящими.

Псевдокод-алгоритм:

Вход:

x, {вектор длины N со значениями x входящих точек}

y, {вектор длины N со значениями y ожидаемого результата}

interpolate (x_in, y_in, x_out), {возвращает оценку для точки x_out после обучения модели парами x_in-y_in}

Выход:

err, {оценка ошибки предсказания}

Шаги:

 err ← 0
 for i ← 1, ..., N do
   // define the cross-validation subsets
   x_in ← (x[1], ..., x[i − 1], x[i + 1], ..., x[N])
   y_in ← (y[1], ..., y[i − 1], y[i + 1], ..., y[N])
   x_out ← x[i]
   y_out ← interpolate(x_in, y_in, x_out)
   err ← err + (y[i] − y_out)^2
 end for
 err ← err/N

Неполная перекрестная проверка

Неисчерпывающие методы перекрестной проверки не вычисляют все способы разделения исходной выборки. Эти методы аппроксимации leave- р отъезда перекрестной проверки.

k- кратная перекрестная проверка

Иллюстрация k-кратной перекрестной проверки, когда n = 12 наблюдений и k = 3. После перетасовки данных всего 3 модели будут обучены и протестированы.

При k- кратной перекрестной проверке исходная выборка случайным образом разбивается на k подвыборок равного размера. Из k подвыборок одна подвыборка сохраняется в качестве данных проверки для тестирования модели, а оставшиеся k  - 1 подвыборки используются в качестве обучающих данных. Затем процесс перекрестной проверки повторяется k раз, причем каждая из k подвыборок используется ровно один раз в качестве данных проверки. Затем k результатов можно усреднить для получения единственной оценки. Преимущество этого метода перед повторной случайной подвыборкой (см. Ниже) заключается в том, что все наблюдения используются как для обучения, так и для проверки, и каждое наблюдение используется для проверки только один раз. Обычно используется 10-кратная перекрестная проверка, но в целом k остается нефиксированным параметром.

Например, установка k  =  2 приводит к двукратной перекрестной проверке. При двукратной перекрестной проверке мы случайным образом перетасовываем набор данных на два набора d 0 и d 1 , так что оба набора имеют одинаковый размер (обычно это реализуется путем перетасовки массива данных с последующим разделением его на два). Затем мы тренируемся на d 0 и проверяем на d 1 , затем тренируемся на d 1 и проверяем на  d 0 .

Когда k  =  n (количество наблюдений), k- кратная перекрестная проверка эквивалентна перекрестной проверке с исключением одного.

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

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

Метод удержания

В методе удержания мы случайным образом назначаем точки данных двум наборам d 0 и d 1 , обычно называемым обучающим набором и тестовым набором, соответственно. Размер каждого из наборов является произвольным, хотя обычно набор тестов меньше, чем обучающий набор. Затем мы обучаем (строим модель) на d 0 и тестируем (оцениваем ее производительность) на d 1 .

При типичной перекрестной проверке результаты нескольких прогонов тестирования модели усредняются вместе; Напротив, метод удержания изолированно включает в себя один проход. Его следует использовать с осторожностью, потому что без такого усреднения нескольких прогонов можно получить очень вводящие в заблуждение результаты. Индикатор точности прогноза ( F * ) будет иметь тенденцию быть нестабильным, так как он не будет сглажен несколькими итерациями (см. Ниже). Точно так же индикаторы конкретной роли, которую играют различные переменные-предикторы (например, значения коэффициентов регрессии), будут иметь тенденцию быть нестабильными.

Хотя метод удержания можно сформулировать как «простейший вид перекрестной проверки», многие источники вместо этого классифицируют задержку как тип простой проверки, а не как простую или вырожденную форму перекрестной проверки.

Повторная проверка случайной подвыборки

Этот метод, также известный как перекрестная проверка Монте-Карло , создает несколько случайных разделений набора данных на данные обучения и проверки. Для каждого такого разделения модель соответствует обучающим данным, и точность прогнозов оценивается с использованием данных проверки. Затем результаты усредняются по разбиениям. Преимущество этого метода (по сравнению с k- кратной перекрестной проверкой) состоит в том, что пропорция разделения обучения / проверки не зависит от количества итераций (т. Е. Количества разделов). Недостатком этого метода является то, что некоторые наблюдения могут никогда не быть выбраны в подвыборке проверки, тогда как другие могут быть выбраны более одного раза. Другими словами, подмножества проверки могут перекрываться. Этот метод также демонстрирует вариацию Монте-Карло , а это означает, что результаты будут отличаться, если анализ повторяется с разными случайными разбиениями.

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

В стратифицированном варианте этого подхода случайные выборки генерируются таким образом, чтобы среднее значение ответа (т.е. зависимая переменная в регрессии) было равным в обучающей и тестовой выборках. Это особенно полезно, если ответы дихотомичны с несбалансированным представлением двух значений ответа в данных.

Метод, который применяет повторную случайную подвыборку, - это RANSAC .

Вложенная перекрестная проверка

Когда перекрестная проверка используется одновременно для выбора наилучшего набора гиперпараметров и для оценки ошибок (и оценки способности обобщения), требуется вложенная перекрестная проверка. Есть много вариантов. Можно выделить как минимум два варианта:

k * l-кратная перекрестная проверка

Это действительно вложенный вариант (например, используемый cross_val_scoreв scikit-learn ), который содержит внешний цикл из k наборов и внутренний цикл из l наборов. Общий набор данных разделен на k наборов. Один за другим набор выбирается в качестве (внешнего) тестового набора, а k  - 1 других наборов объединяются в соответствующий внешний обучающий набор. Это повторяется для каждого из k наборов. Каждый внешний обучающий набор далее подразделяется на l наборов. Один за другим набор выбирается как набор внутренних тестов (валидации), и l  - 1 других наборов объединяются в соответствующий внутренний обучающий набор. Это повторяется для каждого из l наборов. Внутренние обучающие наборы используются для соответствия параметрам модели, в то время как внешний набор тестов используется в качестве набора для проверки, чтобы обеспечить беспристрастную оценку соответствия модели. Обычно это повторяется для многих разных гиперпараметров (или даже для разных типов моделей), и набор проверки используется для определения наилучшего набора гиперпараметров (и типа модели) для этого внутреннего обучающего набора. После этого новая модель подходит для всего внешнего обучающего набора, используя лучший набор гиперпараметров из внутренней перекрестной проверки. Затем производительность этой модели оценивается с помощью внешнего набора для испытаний.

k-кратная перекрестная проверка с проверкой и набором тестов

Это тип k * l-кратной перекрестной проверки, когда l  =  k  - 1. Однократная k-кратная перекрестная проверка используется как с проверкой, так и с набором тестов . Общий набор данных разделен на k наборов. Один за другим набор выбирается в качестве тестового набора. Затем один за другим один из оставшихся наборов используется в качестве набора для проверки, а другие k  - 2 набора используются в качестве обучающих наборов до тех пор, пока не будут оценены все возможные комбинации. Подобно k * l-кратной перекрестной проверке, обучающий набор используется для подгонки модели, а набор проверки используется для оценки модели для каждого из наборов гиперпараметров. Наконец, для выбранного набора параметров тестовый набор используется для оценки модели с наилучшим набором параметров. Здесь возможны два варианта: либо оценка модели, которая была обучена на обучающем наборе, либо оценка новой модели, которая соответствовала комбинации поезда и проверочного набора.

Меры подгонки

Цель перекрестной проверки - оценить ожидаемый уровень соответствия модели набору данных, который не зависит от данных, которые использовались для обучения модели. Его можно использовать для оценки любой количественной меры соответствия, которая подходит для данных и модели. Например, для задач двоичной классификации каждый случай в наборе проверки либо предсказывается правильно, либо неправильно. В этой ситуации коэффициент ошибочной классификации можно использовать для резюмирования соответствия, хотя также могут использоваться другие меры, такие как положительная прогностическая ценность . Когда прогнозируемое значение непрерывно распределяется, среднеквадратическая ошибка , среднеквадратичная ошибка или медианное абсолютное отклонение могут использоваться для суммирования ошибок.

Использование предыдущей информации

Когда пользователи применяют перекрестную проверку для выбора хорошей конфигурации , они могут захотеть сбалансировать выбор с перекрестной проверкой со своей собственной оценкой конфигурации. Таким образом, они могут попытаться противостоять волатильности перекрестной проверки при небольшом размере выборки и включить соответствующую информацию из предыдущих исследований. Например, при комбинированном прогнозировании перекрестная проверка может применяться для оценки весов, которые присваиваются каждому прогнозу. Поскольку простой равновзвешенный прогноз трудно превзойти, может быть добавлен штраф за отклонение от равных весов. Или, если для присвоения индивидуальных весов наблюдениям применяется перекрестная проверка, то можно штрафовать отклонения от равных весов, чтобы избежать потери потенциально релевантной информации. Hoornweg (2018) показывает, как можно определить параметр настройки, чтобы пользователь мог интуитивно балансировать между точностью перекрестной проверки и простотой использования эталонного параметра , определяемого пользователем.

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

Относительная точность может быть определена количественно как , так что среднеквадратическая ошибка кандидата делается относительно ошибки, указанной пользователем . Термин относительной простоты измеряет величину отклонения по отношению к максимальной величине отклонения от . Соответственно, относительную простоту можно указать как , где соответствует значению с наибольшим допустимым отклонением от . С помощью пользователь определяет, насколько велико влияние эталонного параметра относительно перекрестной проверки.

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

Хорнвег (2018) показывает, что функция потерь с таким компромиссом между точностью и простотой также может использоваться для интуитивно понятного определения оценок усадки, таких как (адаптивное) лассо и байесовская / гребневая регрессия . Щелкните на лассо, чтобы увидеть пример.

Статистические свойства

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

Оценщик перекрестной проверки F * почти несмещен для EF . Причина, по которой он немного смещен, заключается в том, что обучающий набор при перекрестной проверке немного меньше, чем фактический набор данных (например, для LOOCV размер обучающего набора равен n  - 1, когда имеется n наблюдаемых случаев). Практически во всех ситуациях влияние этого смещения будет консервативным, поскольку предполагаемое соответствие будет немного смещено в направлении, предполагающем более плохое соответствие. На практике эта предвзятость редко вызывает беспокойство.

Разброс F * может быть большим. По этой причине, если две статистические процедуры сравниваются на основе результатов перекрестной проверки, процедура с лучшей оцененной производительностью может фактически не быть лучшей из двух процедур (т. Е. Она может не иметь лучшего значения EF ). Некоторый прогресс был достигнут в построении доверительных интервалов вокруг оценок перекрестной проверки, но это считается сложной проблемой.

Вычислительные проблемы

Большинство форм перекрестной проверки легко реализовать, пока доступна реализация изучаемого метода прогнозирования. В частности, метод прогнозирования может быть «черным ящиком» - нет необходимости иметь доступ к внутренностям его реализации. Если обучение методу прогнозирования является дорогостоящим, перекрестная проверка может быть очень медленной, поскольку обучение необходимо проводить повторно. В некоторых случаях, таких как метод наименьших квадратов и регрессия ядра , перекрестную проверку можно значительно ускорить, предварительно вычислив определенные значения, которые неоднократно требуются в процессе обучения, или с помощью быстрых «правил обновления», таких как формула Шермана – Моррисона . Однако нужно быть осторожным, чтобы сохранить «полное ослепление» набора проверки из процедуры обучения, иначе может возникнуть смещение. Ярким примером ускорения перекрестной проверки является линейная регрессия , где результаты перекрестной проверки имеют выражение в закрытой форме, известное как сумма квадратов остаточных ошибок прогнозирования ( PRESS ).

Ограничения и неправильное использование

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

Во многих приложениях прогнозного моделирования структура изучаемой системы со временем меняется (т. Е. Является «нестационарной»). Оба они могут привести к систематическим различиям между наборами для обучения и проверки. Например, если модель для прогнозирования стоимости запасов обучается на данных за определенный пятилетний период, нереально рассматривать последующий пятилетний период как выборку из той же самой популяции. В качестве другого примера предположим, что разработана модель для прогнозирования индивидуального риска того, что у человека будет диагностировано конкретное заболевание в течение следующего года. Если модель обучается с использованием данных из исследования с участием только определенной группы населения (например, молодых людей или мужчин), но затем применяется к общей популяции, результаты перекрестной проверки из обучающего набора могут сильно отличаться от фактических прогностических характеристик. .

Во многих приложениях модели также могут быть указаны неправильно и изменяться в зависимости от предубеждений моделиста и / или произвольного выбора. Когда это происходит, может возникнуть иллюзия, что система изменяется во внешних выборках, тогда как причина в том, что модель пропустила критический предсказатель и / или включила неверный предсказатель. Новое свидетельство состоит в том, что перекрестная проверка сама по себе не очень хорошо предсказывает внешнюю валидность, тогда как форма экспериментальной валидации, известная как выборка подкачки, которая контролирует человеческую предвзятость, может гораздо лучше предсказывать внешнюю валидность. Как определено в этом большом исследовании MAQC-II с участием 30 000 моделей, выборка подкачки включает перекрестную проверку в том смысле, что прогнозы проверяются на независимых обучающих и проверочных выборках. Тем не менее, модели также разрабатываются на основе этих независимых выборок и моделистами, которые не знают друг друга. Когда есть несоответствие в этих моделях, разработанных для этих переставленных обучающих и проверочных выборок, что случается довольно часто, MAQC-II показывает, что это будет гораздо более предсказуемо для плохой внешней прогнозирующей валидности, чем традиционная перекрестная проверка.

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

  • Выполняя первоначальный анализ для определения наиболее информативных функций с использованием всего набора данных - если для процедуры моделирования требуется выбор функций или настройка модели, это необходимо повторить для каждого обучающего набора. В противном случае прогнозы наверняка будут смещены в сторону повышения. Если для определения того, какие функции использовать, используется перекрестная проверка, необходимо выполнить внутреннюю перекрестную проверку для выбора функций на каждом обучающем наборе.
  • Если разрешить включение некоторых обучающих данных в набор тестов - это может произойти из-за «двойникования» в наборе данных, в результате чего в наборе данных присутствуют некоторые точно идентичные или почти идентичные образцы. В некоторой степени твиннинг всегда имеет место даже в совершенно независимых выборках для обучения и проверки. Это связано с тем, что некоторые из наблюдений обучающей выборки будут иметь почти те же значения предикторов, что и наблюдения проверочной выборки. И некоторые из них будут коррелировать с целью на уровнях выше вероятности в одном и том же направлении как при обучении, так и при проверке, когда они фактически управляются ошибочными предикторами с плохой внешней достоверностью. Если такая модель с перекрестной проверкой будет выбрана из k- кратного набора, будет действовать систематическая ошибка подтверждения человеком, которая определит, что такая модель была проверена. Вот почему традиционная перекрестная проверка должна быть дополнена средствами контроля человеческой предвзятости и искаженной спецификации модели, такой как выборка подстановки и проспективные исследования.

Перекрестная проверка для моделей временных рядов

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

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

Приложения

Перекрестная проверка может использоваться для сравнения производительности различных процедур прогнозного моделирования. Например, предположим, что нас интересует оптическое распознавание символов и мы рассматриваем возможность использования либо анализа главных компонентов (PCA), либо k- ближайших соседей (KNN) для предсказания истинного символа по изображению рукописного символа. Используя перекрестную проверку, мы могли бы объективно сравнить эти два метода с точки зрения их соответствующих долей ошибочно классифицированных символов. Если бы мы просто сравнили методы на основе их частоты ошибок в выборке, один метод, вероятно, оказался бы более эффективным, поскольку он более гибкий и, следовательно, более подвержен переобучению по сравнению с другим методом.

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

Недавним достижением в медицинской статистике стало ее использование в метаанализе. Он формирует основу валидационной статистики Vn, которая используется для проверки статистической достоверности сводных оценок метаанализа. Он также использовался в более традиционном смысле в метаанализе для оценки вероятной ошибки предсказания результатов метаанализа.

Смотрите также

Примечания и ссылки