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

ЛИЧНЫЙ КАБИНЕТ 

 

Здравствуйте гость!

 

Логин:

Пароль:

 

Запомнить

 

 

Забыли пароль? Регистрация

Повышение уникальности

Предлагаем нашим посетителям воспользоваться бесплатным программным обеспечением «StudentHelp», которое позволит вам всего за несколько минут, выполнить повышение уникальности любого файла в формате MS Word. После такого повышения уникальности, ваша работа легко пройдете проверку в системах антиплагиат вуз, antiplagiat.ru, etxt.ru или advego.ru. Программа «StudentHelp» работает по уникальной технологии и при повышении уникальности не вставляет в текст скрытых символов, и даже если препод скопирует текст в блокнот – не увидит ни каких отличий от текста в Word файле.

Результат поиска


Наименование:


курсовая работа Нейронные сети Кохонена

Информация:

Тип работы: курсовая работа. Добавлен: 11.09.2012. Сдан: 2011. Страниц: 5. Уникальность по antiplagiat.ru: < 30%

Описание (план):


    ВВЕДЕНИЕ
    Идентификация соединений при контроле качества пищевых  продуктов, объектов окружающей среды, лекарственных препаратов, установлении структуры нового вещества и решении  других задач с применением инструментальных методов анализа является актуальной областью качественного химического  анализа. Среди экспериментальных  методов, привлекаемых для идентификации аналитов, особое значение имеют спектроскопические и хроматографические, а также методы, основанные на использовании сенсорных систем ("электронный нос", "электронный язык") [1-3]. Под "идентификацией" понимают установление тождественности анализируемого объекта известному (эталону) или вывод о принадлежности аналита некоторому классу объектов на основе сопоставления их свойств [4]. Одна из основных проблем идентификации заключается в том, что существующие алгоритмы требуют априорной информации о характеристиках исходных данных в качестве начального приближения для расчетов (например, сведений о функции распределения экспериментальных погрешностей, числе классов и др.). Альтернативой известным параметрическим подходам служат методы, воплощающие идеи робастного оценивания и свободные от априорных предположений. Переход от обычных алгоритмов дискриминантного или кластерного анализа (например, метода k-средних) к адаптивным методам способствует повышению достоверности идентификации. Искусственные нейронные сети нашли свое приложение в химических исследованиях. С их  помощью предсказывают химические и физические свойства, проводят дизайн новых химических соединений и материалов с требуемыми характеристиками, подбирают методы синтеза, моделируют кинетику химических процессов и др. [5-8].
    Иску?сственные нейро?нные се?ти (ИНС) — математические модели, а также их программные или аппаратные реализации, построенные по принципу организации и функционирования биологических нейронных сетей — сетей нервных клеток живого организма. Это понятие возникло при изучении процессов, протекающих в мозге при мышлении, и при попытке смоделировать эти процессы. Первой такой моделью мозга был перцептрон. Впоследствии эти модели стали использовать в практических целях, как правило в задачах прогнозирования.
    ИНС представляют собой систему соединённых  и взаимодействующих между собой  простых процессоров (искусственных  нейронов). Такие процессоры обычно довольно просты, особенно в сравнении  с процессорами, используемыми в  персональных компьютерах. Каждый процессор  подобной сети имеет дело только с  сигналами, которые он периодически получает, и сигналами, которые он периодически посылает другим процессорам. И тем не менее, будучи соединёнными в достаточно большую сеть с управляемым взаимодействием, такие локально простые процессоры вместе способны выполнять довольно сложные задачи.
    С точки зрения машинного обучения, нейронная сеть представляет собой  частный случай методов распознавания  образов, дискриминантного анализа, методов кластеризации и т. п. С математической точки зрения обучение нейронных сетей, это многопараметрическая задача нелинейной оптимизации. С точки зрения кибернетики, нейронная сеть используется в задачах адаптивного управления и как алгоритмы для робототехники. С точки зрения развития вычислительной техники и программирования, нейронная сеть — способ решения проблемы эффективного параллелизма. А с точки зрения искусственного интеллекта, ИНС является основой философского течения коннективизма и основным направлением в структурном подходе по изучению возможности построения (моделирования) естественного интеллекта с помощью компьютерных алгоритмов.
    Нейронные сети не программируются в привычном  смысле этого слова, они обучаются. Возможность обучения — одно из главных преимуществ нейронных  сетей перед традиционными алгоритмами. Технически обучение заключается в  нахождении коэффициентов связей между  нейронами. В процессе обучения нейронная  сеть способна выявлять сложные зависимости  между входными данными и выходными, а также выполнять обобщение. Это значит, что, в случае успешного  обучения, сеть сможет вернуть верный результат на основании данных, которые  отсутствовали в обучающей выборке.
      
    Схема простой нейросети.
    Зелёным обозначены входные элементы,
    жёлтым — выходной элемент 

    Сеть  Кохонена
    Нейронные сети Кохонена (Kohonen neural network) — класс нейронных сетей, основным элементом которых является слой Кохонена. Слой Кохонена состоит из адаптивных линейных сумматоров («линейных формальных нейронов»). Как правило, выходные сигналы слоя Кохонена обрабатываются по правилу «победитель забирает всё»: наибольший сигнал превращается в единичный, остальные обращаются в ноль.
    По  способам настройки входных весов  сумматоров и по решаемым задачам  различают много разновидностей сетей Кохонена.[1] Наиболее известные  из них:
    Сети  векторного квантования сигналов[1], тесно связанные с простейшим базовым алгоритмом кластеризации (метод динамических ядер или K-средних, то есть K-means)
    Самоорганизующиеся  карты Кохонена (Self-Organising Maps, SOM)[1]
    Сети  векторного квантования, обучаемые  с учителем (Learning Vector Quantization)[1] 

    Слой  Кохонена  

    Базовая версия  

    Слой  Кохонена состоит из некоторого количества параллельно действующих линейных элементов. Все они имеют одинаковое число входов и получают на свои входы один и тот же вектор входных сигналов . На выходе го линейного элемента получаем сигнал
    
    где  — весовой коэффициент го входа го нейрона, — пороговой коэффициент.  

    После прохождения слоя линейных элементов  сигналы посылаются на обработку  по правилу «победитель забирает всё»: среди выходных сигналов ищется максимальный; его номер . Окончательно, на выходе сигнал с номером равен единице, остальные — нулю. Если максимум одновременно достигается для нескольких , то либо принимают все соответствующие сигналы равными единице, либо только первый в списке (по соглашению). «Нейроны Кохонена можно воспринимать как набор электрических лампочек, так что для любого входного вектора загорается одна из них.»[1] 

    Геометрическая  интерпретация 
     
    Разбиение плоскости на многоугольники Вороного-Дирихле  для случайно выбранных точек (каждая точка указана в своём многоугольнике).
    Большое распространение получили слои Кохонена, построенные следующим образом: каждому ( му) нейрону сопоставляется точка в -мерном пространстве (пространстве сигналов). Для входного вектора вычисляется его расстояния до точек и «ближайший получает всё» — тот нейрон, для которого это расстояние минимально, выдаёт единицу, остальные — нули. Следует заметить, что для сравнения расстояний достаточно вычислять линейную функцию сигнала:
     
    Последнее слагаемое  одинаково для всех нейронов, поэтому для нахождения ближайшей точки оно не нужно. Задача сводится к поиску номера наибольшего из значений линейных функций:
     
    Таким образом, координаты точки  совпадают с весами линейного нейрона слоя Кохонена (при этом значение порогового коэффициента ).
    Если  заданы точки , то -мерное пространство разбивается на соответствующие многогранники Вороного-Дирихле : многогранник  состоит из точек, которые ближе к , чем к другим ( ).[1]  

    Сети  векторного квантования  

    Задача  векторного квантования с  кодовыми векторами для заданной совокупности входных векторов ставится как задача минимизации искажения при кодировании, то есть при замещении каждого вектора из  соответствующим кодовым вектором. В базовом варианте сетей Кохонена используется метод наименьших квадратов и искажение вычисляется по формуле
      
    где состоит из тех точек , которые ближе к , чем к другим  ( ). Другими словами, состоит из тех точек , которые кодируются кодовым вектором .
    Если  совокупность задана и хранится в памяти, то стандартным выбором в обучении соответствующей сети Кохонена является метод K-средних. Это метод расщепления:
    при данном выборе кодовых векторов (они  же весовые векторы сети) минимизацией находим множества — они состоит из тех точек , которые ближе к , чем к другим ;
    при данном разбиении  на множества минимизацией находим оптимальные позиции кодовых векторов — для оценки по методу наименьших квадратов это просто средние арифметические:
     
    где — число элементов в .
    Далее итегрируем. Этот метод расщепления сходится за конечное число шагов и даёт локальный минимум искажения.
    Если  же, например, совокупность заранее не задана, или по каким-либо причинам не хранится в памяти, то широко используется онлайн метод. Векторы входных сигналов обрабатываются по одному, для каждого из них находится ближайший кодовый вектор («победитель», который «забирает всё») . После этого данный кодовый вектор пересчитывается по формуле
     
    где — шаг обучения. Остальные кодовые векторы на этом шаге не изменяются.
    Для обеспечения стабильности используется онлайн метод с затухающей скоростью обучения: если — количество шагов обучения, то полагают . Функцию выбирают таким образом, чтобы монотонно при и чтобы ряд расходился, например, .
    Векторное квантование является намного более  общей операцией, чем кластеризация, поскольку кластеры должны быть разделены  между собой, тогда как совокупности для разных кодовых векторов не обязательно представляют собой раздельные кластеры. С другой стороны, при наличии разделяющихся кластеров векторное квантование может находить их и по-разному кодировать.  

    Самоорганизующиеся  карты Кохонена
    Идея  и алгоритм обучения  

    Задача  векторного квантования состоит, по своему существу, в наилучшей аппроксимации  всей совокупности векторов данных кодовыми векторами . Самоорганизующиеся карты Кохонена (англ. Self-Organising Maps, SOM) также аппроксимируют данные, однако при наличии дополнительной структуры в совокупности кодовых векторов (англ. codebook). Предполагается, что априори задана некоторая симметричная таблица «мер соседства» (или «мер близости») узлов: для каждой пары  ( ) определено число ( ) при этом диагональные элементы таблицы близости равны единице ( ).
    Векторы входных сигналов обрабатываются по одному, для каждого из них находится ближайший кодовый вектор («победитель», который «забирает всё») . После этого все кодовые векторы , для которых , пересчитываются по формуле
     
    где — шаг обучения. Соседи кодового вектора — победителя (по априорно заданной таблице близости) сдвигаются в ту же сторону, что и этот вектор, пропорционально мере близости.
    Чаще  всего, таблица кодовых векторов представляется в виде фрагмента  квадратной решётки на плоскости, а  мера близости определяется, исходя из евклидового расстояния на плоскости.
    Самоорганизующиеся  карты Кохонена служат, в первую очередь, для визуализации и первоначального («разведывательного») анализа данных.[1] Каждая точка данных отображается соответствующим  кодовым вектором из решётки. Так  получают представление данных на плоскости («карту данных»). На этой карте возможно отображение многих слоёв: количество данных, попадающих в узлы (то есть «плотность данных»), различные функции данных и так далее. При отображении  этих слоёв полезен аппарат географических информационных систем (ГИС). В ГИС  подложкой для изображения информационных слоев служит географическая карта. Карта данных является подложкой  для произвольного по своей природе  набора данных. Она служит заменой  географической карте там, где ее просто не существует. Принципиальное отличие в следующем: на географической карте соседние объекты обладают близкими географическими координатами, на карте данных близкие объекты  обладают близкими свойствами. С помощью  карты данных можно визуализировать  данные, одновременно нанося на подложку сопровождающую информацию (подписи, аннотации, атрибуты, информационные раскраски).[1] Карта служит также информационной моделью данных. С её помощью можно заполнять пробелы в данных. Эта способность используется, например, для решения задач прогнозирования.  

    Самоорганизующиеся  карты и главные многообразия  

    Идея  самоорганизующихся карт очень привлекательна и породила массу обобщений, однако, строго говоря, мы не знаем, что мы строим: карта — это результат работы алгоритма и не имеет отдельного («объектного») определения. Есть, однако, близкая теоретическая идея —  главные многообразия (principal manifolds).[1] Эти многообразия обобщают линейные главные компоненты. Они были введены как линии или поверхности, проходящие через «середину» распределения данных, с помощью условия самосогласованности: каждая точка на главном многообразии является условным математическим ожиданием тех векторов , которые проектируются на (при условии , где — оператор проектирования окрестности на ),
     
    Самоорганизующиеся  карты могут рассматриваться как аппроксимации главных многообразий и популярны в этом качестве[1].
    Упругие карты 
     
    Визуализация  набора данных по экспрессии генов  в раке молочной железы с использованием упругих карт (b) и метода главных компонент (c). Классы точек показаны с использованием размера (ER - статуc эстроген-рецептора), формы (GROUP - риск развития метастаз) и цвета (TYPE - молекулярный тип опухоли). На панели (a) показана конфигурация узлов двумерной упругой карты в проекции на первые три главные компоненты. Сравнивая (b) и (c), можно заметить, что базальный тип опухоли как кластер лучше отделен на нелинейной проекции (b).
    Метод аппроксимации многомерных данных, основанный на минимизации «энергии упругой деформации» карты, погружённой  в пространство данных, был предложен  А. Н. Горбанём в 1996 году, и впоследствии развит им совместно с А. Ю. Зиновьевым, А. А. Россиевым и А. А. Питенко.[1] Метод основан на аналогии между главным многообразием и эластичной мембраной и упругой пластиной. В этом смысле он является развитием классической идеи сплайна (хотя упругие карты и не являются многомерными сплайнами).
    Пусть задана совокупность входных векторов . Так же, как и сети векторного квантования и самоорганизующиеся карты, упругая карта представлена как совокупность кодовых векторов (узлов) в пространстве сигналов. Множество данных разделено на классы , состоящие из тех точек , которые ближе к , чем к другим ( ). Искажение кодирования
     
    может трактоваться как суммарная энергия  пружин единичной жёсткости, связывающих  векторы данных с соответствующими кодовыми векторами.
    На  множестве узлов задана дополнительная структура: некоторые пары связаны  «упругими связями», а некоторые  тройки объединены в «рёбра жёсткости». Обозначим множество пар, связанных  упругими связями, через  , а множество троек, составляющих рёбра жёсткости, через . Например, в квадратной решётке ближайшие узлы (как по вертикали, так и погоризонтали) связываются упругими связями, а ребра жёсткости образуются вертикальными и горизонтальными тройками ближайших узлов. Энергия деформации карты состоит из двух слагаемых:
    энергия растяжения   

    энергия изгиба 
    где — соответствующие модули упругости.
    Задача  построения упругой карты состоит  в минимизации функционала 
      
    Если  разбиение совокупности входных  векторов на классы фиксировано, то минимизация — линейная задача с разреженной симметричной матрицей коэффициентов. Поэтому, как и для сетей векторного квантования, применяется метод расщепления: фиксируем — ищем — для данных   ищем — для данных ищем — … Алгоритм сходится к (локальному) минимуму .
    Метод упругих карт позволяет решать все  задачи, которые решают самоорганизующиеся карты Кохонена, однако обладает большей  регулярностью и предсказуемостью. При увеличении модуля изгиба  упругие  карты приближаются к линейным главным  компонентам. При уменьшении обоих  модулей упругости они превращаются в Кохоненовские сети векторного квантования. В настоящее время упругие карты интенсивно используются для анализа многомерных данных в биоинформатике.[1] Соответствующее программное обеспечение опубликовано и свободно доступно на сайте Института Кюри (Париж).[1][1]
     Визуализация  набора данных по экспрессии генов  в раке молочной железы с использованием упругих карт (b) и метода главных компонент (c). Классы точек показаны с использованием размера (ER - статуc эстроген-рецептора), формы (GROUP - риск развития метастаз) и цвета (TYPE - молекулярный тип опухоли). На панели (a) показана конфигурация узлов двумерной упругой карты в проекции на первые три главные компоненты. Сравнивая (b) и (c), можно заметить, что базальный тип опухоли как кластер лучше отделен на нелинейной проекции (b). 

    На  рисунке представлены результаты визуализации данных по раку молочной железы. Эти  данные содержат 286 примеров с указанием  уровня экспрессии 17816 генов[1]. Они доступны онлайн как ставший классическим тестовый пример для визуализации и картографии данных[1].
    Сети  векторного квантования, обучаемые  с учителем
     
    Пример  возможного разделения классов, составленного  с помощью разбиения Вороного-Дирихле.
    
    Пример  возможного разделения классов, составленного  с помощью разбиения Вороного-Дирихле. 

    Решается  задача классификации. Число классов  может быть любым. Изложим алгоритм для двух классов, и . Исходно для обучения системы поступают данные, класс которых известен. Задача: найти для класса некоторое количество кодовых векторов , а для класса некоторое (возможно другое) количество кодовых векторов таким образом, чтобы итоговая сеть Кохонена с кодовыми векторами , (объединяем оба семейства) осуществляла классификацию по следующему решающему правилу:
    если  для вектора входных сигналов ближайший кодовый вектор («победитель», который в слое Кохонена «забирает всё») принадлежит семейству , то принадлежит классу ; если же ближайший к кодовый вектор принадлежит семейству , то принадлежит классу .
    С каждым кодовым вектором объединённого  семейства  связан многогранник Вороного-Дирихле. Обозначим эти многогранники ,  соответственно. Класс в пространстве сигналов, согласно решающему правилу, соответствует объединению , а класс соответствует объединению . Геометрия таких объединений многогранников может быть весьма сложной (см. Рис с примером возможного разбиения на классы).
    Правила обучения сети онлайн строится на основе базового правила обучения сети векторного квантования. Пусть на вход системы подаётся вектор сигналов , класс которого известен. Если он классифицируется системой правильно, то соответствующий кодовый вектор слегка сдвигается в сторону вектора сигнала («поощрение»)
     
    Если  же классифицируется неправильно, то соответствующий кодовый вектор слегка сдвигается в противоположную сторону от сигнала («наказание»)
       

    где — шаг обучения. Для обеспечения стабильности используется онлайн метод с затухающей скоростью обучения. Возможно также использование разных шагов для «поощрения» правильного решения и для «наказания» неправильного
    Это — простейшая (базовая) версия метода[1]. Существует множество других модификаций.
    Сети  Кохонена принципиально отличаются от всех других типов сетей, реализованных  в пакете ST Neural Networks. В то время как все остальные сети предназначены для задач с управляемым обучением, сети Кохонена главным образом рассчитана на неуправляемое обучение (Kohonen, 1982; Haykin, 1994; Patterson, 1996; Fausett, 1994).
    При управляемом обучении наблюдения, составляющие обучающие данные, вместе с входными переменными содержат также и  соответствующие им выходные значения, и сеть должна восстановить отображение, переводящее первые во вторые. В  случае же неуправляемого обучения обучающие  данные содержат только значения входных  переменных.
    На  первый взгляд это может показаться странным. Как сеть сможет чему-то научиться, не имея выходных значений? Ответ заключается  в том, что сеть Кохонена учится понимать саму структуру данных.
    Одно  из возможных применений таких сетей - разведочный анализ данных. Сеть Кохонена может распознавать кластеры в данных, а также устанавливать близость классов. Таким образом пользователь может улучшить свое понимание структуры данных, чтобы затем уточнить нейросетевую модель. Если в данных распознаны классы, то их можно обозначить, после чего сеть сможет решать задачи классификации. Сети Кохонена можно использовать и в тех задачах классификации, где классы уже заданы, - тогда преимущество будет в том, что сеть сможет выявить сходство между различными классами.
    Другая  возможная область применения - обнаружение  новых явлений. Сеть Кохонена распознает кластеры в обучающих данных и  относит все данные к тем или  иным кластерам. Если после этого  сеть встретится с набором данных, непохожим ни на один из известных  образцов, то она не сможет классифицировать такой набор и тем самым  выявит его новизну.
    Сеть  Кохонена имеет всего два слоя: входной и выходной, составленный из радиальных элементов (выходной слой называют также слоем топологической карты). Элементы топологической карты  располагаются в некотором пространстве - как правило двумерном (в пакете ST Neural Networks реализованы также одномерные сети Кохонена).
    Обучается сеть Кохонена методом последовательных приближений. Начиная со случайным  образом выбранного исходного расположения центров, алгоритм постепенно улучшает его так, чтобы улавливать кластеризацию  обучающих данных. В некотором  отношении эти действия похожи на алгоритмы выборки из выборки  и K-средних, которые используются для  размещения центров в сетях RBF и GRNN, и действительно, алгоритм Кохонена можно использовать для размещения центров в сетях этих типов. Однако, данный алгоритм работает и на другом уровне.
    Помимо  того, что уже сказано, в результате итеративной процедуры обучения сеть организуется таким образом, что  элементы, соответствующие центрам, расположенным близко друг от друга  в пространстве входов, будут располагаться  близко друг от друга и на топологической карте. Топологический слой сети можно  представлять себе как двумерную  решетку, которую нужно так отобразить в N-мерное пространство входов, чтобы  по возможности сохранить исходную структуру данных. Конечно же, при  любой попытке представить N-мерное пространство на плоскости будут  потеряны многие детали; однако, такой  прием иногда полезен, так как  он позволяет пользователю визуализировать  данные, которые никаким иным способом понять невозможно.
    Основной  итерационный алгоритм Кохонена последовательно  проходит одну за другой ряд эпох, при  этом на каждой эпохе он обрабатывает каждый из обучающих примеров, и  затем применяет следующий алгоритм:
    Выбрать выигравший нейрон (то есть тот, который  расположен ближе всего к входному примеру);
    Скорректировать выигравший нейрон так, чтобы он стал более похож на этот входной пример (взяв взвешенную сумму прежнего центра нейрона и обучающего примера).
    В алгоритме при вычислении взвешенной суммы используется постепенно убывающий  коэффициент скорости обучения, с  тем чтобы на каждой новой эпохе коррекция становилась все более тонкой. В результате положение центра установится в некоторой позиции, которая удовлетворительным образом представляет те наблюдения, для которых данный нейрон оказался выигравшим.
    Свойство  топологической упорядоченности достигается  в алгоритме с помощью дополнительного  использования понятия окрестности. Окрестность - это несколько нейронов, окружающих выигравший нейрон. Подобно  скорости обучения, размер окрестности  убывает со временем, так что вначале  к ней принадлежит довольно большое  число нейронов (возможно, почти  вся топологическая карта); на самых  последних этапах окрестность становится нулевой (т.е. состоящей только из самого выигравшего нейрона). На самом деле в алгоритме Кохонена корректировка применяется не только к выигравшему нейрону, но и ко всем нейронам из его текущей окрестности.
    Результатом такого изменения окрестностей является то, что изначально довольно большие  участки сети "перетягиваются" - и притом заметно - в сторону  обучающих примеров. Сеть формирует  грубую структуру топологического  порядка, при которой похожие  наблюдения активируют группы близко лежащих нейронов на топологической карте. С каждой новой эпохой скорость обучения и размер окрестности уменьшаются, тем самым внутри участков карты  выявляются все более тонкие различия, что в конце концов приводит к тонкой настройке каждого нейрона. Часто обучение умышленно разбивают на две фазы: более короткую, с большой скоростью обучения и большими окрестностями, и более длинную с малой скоростью обучения и нулевыми или почти нулевыми окрестностями.
    После того, как сеть обучена распознаванию  структуры данных, ее можно использовать как средство визуализации при анализе  данных. С помощью данных, выводимых  в окне Частоты выигрышей - Win Frequencies , (где для каждого нейрона подсчитывается, сколько раз он выигрывал при обработке обучающих примеров), можно определить, разбивается ли карта на отдельные кластеры. Можно также обрабатывать отдельные наблюдения и смотреть, как при этом меняется топологическая карта, - это позволяет понять, имеют ли кластеры какой-то содержательный смысл (как правило при этом приходится возвращаться к содержательному смыслу задачи, чтобы установить, как соотносятся друг с другом кластеры наблюдений). После того, как кластеры выявлены, нейроны топологической карты помечаются содержательными по смыслу метками (в некоторых случаях помечены могут быть и отдельные наблюдения). После того, как топологическая карта в описанном здесь виде построена, на вход сети можно подавать новые наблюдения. Если выигравший при этом нейрон был ранее помечен именем класса, то сеть осуществляет классификацию. В противном случае считается, что сеть не приняла никакого решения.
и т.д.................


Перейти к полному тексту работы


Скачать работу с онлайн повышением уникальности до 90% по antiplagiat.ru, etxt.ru или advego.ru


Смотреть полный текст работы бесплатно


Смотреть похожие работы


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