Редактирование: Уменьшение размерности

Перейти к: навигация, поиск

Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 1: Строка 1:
Под '''уменьшением размерности''' (англ. ''dimensionality reduction'') в машинном обучении подразумевается уменьшение числа признаков набора данных. Наличие в нем признаков избыточных, неинформативных или слабо информативных может понизить эффективность модели, а после такого преобразования она упрощается, и соответственно уменьшается размер набора данных в памяти и ускоряется работа алгоритмов ML на нем. Уменьшение размерности может быть осуществлено методами выбора признаков (англ. ''feature selection'') или выделения признаков (англ. ''feature extraction'').
+
Под '''уменьшением размерности''' (англ. ''dimensionality reduction'') в машинном обучении подразумевается уменьшение числа признаков датасета. Наличие в нем признаков избыточных, неинформативных или слабо информативных может понизить эффективность модели, а после такого преобразования она упрощается, и соответственно уменьшается размер набора данных в памяти и ускоряется работа алгоритмов ML на нем. Уменьшение размерности может быть осуществлено методами отбора признаков (англ. ''feature selection'') или выделения признаков (англ. ''feature extraction'').
==Выбор признаков==
+
==Feature selection==
Методы '''выбора признаков''' оставляют некоторое подмножество исходного набора признаков, избавляясь от признаков избыточных и слабо информативных. Основные преимущества этого класса алгоритмов:
+
Методы '''feature selection''' оставляют некоторое подмножество исходного набора признаков, избавляясь от признаков избыточных и слабо информативных. Основные преимущества этого класса алгоритмов:
*Уменьшение вероятности [[переобучение|переобучения]];
+
*Уменьшение вероятности [[переобучение|переобучения]]
*Увеличение точности предсказания модели;
+
*Увеличение точности предсказания модели
*Сокращение времени обучения;
+
*Сокращение времени обучения
*Увеличивается семантическое понимание модели.
+
*Увеличивается семантическое понимание модели
  
Все методы выбора признаков можно разделить на 5 типов, которые отличаются алгоритмами выбора лишних признаков.
+
Все методы отбора признаков можно разделить на 5 типов, которые отличаются алгоритмами выбора лишних признаков.
===Фильтры===
+
===Filters===
 
'''Фильтры''' (англ. ''filter methods'') измеряют релевантность признаков на основе функции $\mu$, и затем решают по правилу $\kappa$, какие признаки оставить в результирующем множестве.
 
'''Фильтры''' (англ. ''filter methods'') измеряют релевантность признаков на основе функции $\mu$, и затем решают по правилу $\kappa$, какие признаки оставить в результирующем множестве.
  
 
Фильтры могут быть:
 
Фильтры могут быть:
*Одномерные (англ. ''univariate'') {{---}} функция $\mu$ определяет релевантность одного признака по отношению к выходным меткам. В таком случае обычно измеряют "качество" каждого признака и удаляют худшие;
+
*Одномерные (англ. ''univariate'') {{---}} функция $\mu$ определяет релевантность одного признака по отношению к выходным меткам. В таком случае, обычно, измеряют "качество" каждого признака и удаляют худшие.
 
*Многомерные (англ. ''multivariate'') {{---}} функция $\mu$ определяет релевантность некоторого подмножества исходного множества признаков относительно выходных меток.
 
*Многомерные (англ. ''multivariate'') {{---}} функция $\mu$ определяет релевантность некоторого подмножества исходного множества признаков относительно выходных меток.
  
 
Распространенными вариантами для $\mu$ являются:
 
Распространенными вариантами для $\mu$ являются:
*Коэффициент ранговой корреляции Спирмена <ref>[https://en.wikipedia.org/wiki/Spearman%27s_rank_correlation_coefficient Определение коэффициента ранговой корреляции Спирмена]</ref>(англ. ''Spearman's rank correlation coefficient''): $p(x, y)=\displaystyle \frac{\sum_{i, j}(x_{ij}-\bar{x_j})(y_i-\bar{y})}{\sqrt{\sum_{i, j}(x_{ij}-\bar{x_j})^2\sum_i(y_i-\bar{y})^2}}$;
+
*Коэффициент ранговой корреляции Спирмена (англ. ''Spearman's rank correlation coefficient'') $p(x, y)=\displaystyle \frac{\sum_{i, j}(x_{ij}-\bar{x_j})(y_i-\bar{y})}{\sqrt{\sum_{i, j}(x_{ij}-\bar{x_j})^2\sum_i(y_i-\bar{y})^2}}$;
*Information gain<ref>[https://en.wikipedia.org/wiki/Information_gain_in_decision_trees Определение information gain]</ref>: $IG(x, y)=\displaystyle -\sum_{i=1}^kp(c_i)\log_2{(p(c_i))}+\sum_{i=1}^{n}p(t_i)\sum_{j=1}^kp(c_j|t_i)log_2{(p(c_j|t_i))}$, и другие.
+
*Information gain $IG(x, y)=\displaystyle -\sum_{i=1}^kp(c_i)\log_2{(p(c_i))}+\sum_{i=1}^{n}p(t_i)\sum_{j=1}^kp(c_j|t_i)log_2{(p(c_j|t_i))}$, и другие.
  
Преимуществом группы фильтров является простота вычисления релевантности признаков в наборе данных, но недостатком в таком подходе является игнорирование возможных зависимостей между признаками.
+
Преимуществом группы фильтров является простота вычисления релевантности признаков в датасете, но недостатком в таком подходе является игнорирование возможных зависимостей между признаками.
===Оберточные методы===
+
===Wrappers===
[[File:Feature_selection_wrapper_rus.png|450px|thumb|right|Процесс работы оберточных методов]]
+
[[File:Feature_selection_Wrapper_Method.png|300px|thumb|right|Процесс работы оберточных методов]]
 
'''Оберточные методы''' (англ. ''wrapper methods'') находят подмножество искомых признаков последовательно, используя некоторый классификатор как источник оценки качества выбранных признаков, т.е. этот процесс является циклическим и продолжается до тех пор, пока не будут достигнуты заданные условия останова. Оберточные методы учитывают зависимости между признаками, что является преимуществом по сравнению с фильтрами, к тому же показывают большую точность, но вычисления занимают длительное время, и повышается риск [[переобучение|переобучения]].  
 
'''Оберточные методы''' (англ. ''wrapper methods'') находят подмножество искомых признаков последовательно, используя некоторый классификатор как источник оценки качества выбранных признаков, т.е. этот процесс является циклическим и продолжается до тех пор, пока не будут достигнуты заданные условия останова. Оберточные методы учитывают зависимости между признаками, что является преимуществом по сравнению с фильтрами, к тому же показывают большую точность, но вычисления занимают длительное время, и повышается риск [[переобучение|переобучения]].  
  
 
Существует несколько типов оберточных методов: детерминированные, которые изменяют множество признаков по определенному правилу, а также рандомизированные, которые используют генетические алгоритмы для выбора искомого подмножества признаков. Среди детерминированных алгоритмов самыми простыми являются:
 
Существует несколько типов оберточных методов: детерминированные, которые изменяют множество признаков по определенному правилу, а также рандомизированные, которые используют генетические алгоритмы для выбора искомого подмножества признаков. Среди детерминированных алгоритмов самыми простыми являются:
*SFS (Sequential Forward Selection) {{---}} жадный алгоритм, который начинает с пустого множества признаков, на каждом шаге добавляя лучший из еще не выбранных признаков в результирующее множество;
+
*SFS (Sequential Forward Selection) {{---}} жадный алгоритм, который начинает с пустого множества признаков, на каждом шаге добавляя лучший из еще не выбранных признаков в результирующее множество
*SBS (Sequential Backward Selection) {{---}} алгоритм обратный SFS, который начинает с изначального множества признаков, и удаляет по одному или несколько худших признаков на каждом шаге.
+
*SBS (Sequential Backward Selection) {{---}} алгоритм обратный SFS, который начинает с изначального множества признаков, и удаляет по одному или несколько худших признаков на каждом шаге
  
Популярным оберточным методом является SVM-RFE (SVM-based Recursive Feature Elimination), который иногда также обозначается как встроенный <ref>[https://benthamopen.com/FULLTEXT/TOBIOIJ-11-117/ C. Embedded method]</ref>. Этот метод использует как классификатор [[Метод опорных векторов (SVM)| SVM]]<sup>[на 28.01.19 не создан]</sup> и работает итеративно: начиная с полного множества признаков обучает классификатор, ранжирует признаки по весам, которые им присвоил классификатор, убирает какое-то число признаков и повторяет процесс с оставшегося подмножества фичей, если не было достигнуто их требуемое количество. Таким образом, этот метод очень похож на встроенный, потому что непосредственно использует знание того, как устроен классификатор.
+
Популярным оберточным методом является SVM-RFE (SVM-based Recursive Feature Elimination), который иногда также обозначается как встроенный <ref>[https://benthamopen.com/FULLTEXT/TOBIOIJ-11-117/ C. Embedded method]</ref>. Этот метод использует как классификатор [[Метод опорных векторов (SVM)| SVM]]<sup>[на 20.01.18 не создан]</sup> и работает итеративно: начиная с полного множества признаков обучает классификатор, ранжирует признаки по весам, которые им присвоил классификатор, убирает какое-то число признаков и повторяет процесс с оставшегося подмножества фичей, если не было достигнуто их требуемое количество. Таким образом, этот метод очень похож на встроенный, потому что непосредственно использует знание того, как устроен классификатор.
  
===Встроенные методы===
+
===Embedded===
[[File:Feature_selection_embedded_rus.png|450px|thumb|right|Процесс работы встроенных методов]]
+
[[File:Feature_selection_Embedded_Method.png|300px|thumb|right|Процесс работы встроенных методов]]
 
Группа '''встроенных методов''' (англ. ''embedded methods'') очень похожа на оберточные методы, но для выбора признаков используется непосредственно структуру некоторого классификатора. В оберточных методах классификатор служит только для оценки работы на данном множестве признаков, тогда как встроенные методы используют какую-то информацию о признаках, которую классификаторы присваивают во время обучения.  
 
Группа '''встроенных методов''' (англ. ''embedded methods'') очень похожа на оберточные методы, но для выбора признаков используется непосредственно структуру некоторого классификатора. В оберточных методах классификатор служит только для оценки работы на данном множестве признаков, тогда как встроенные методы используют какую-то информацию о признаках, которую классификаторы присваивают во время обучения.  
  
Одним из примеров встроенного метода является реализация на [[Дерево решений и случайный лес| случайном лесе]]: каждому дереву на вход подаются случайное подмножество данных из датасета с каким-то случайным набор признаков, в процессе обучения каждое из деревьев решений производит "голосование" за релевантность его признаков, эти данные агрегируются, и на выходе получаются значения важности каждого признака набора данных. Дальнейший выбор нужных нам признаков уже зависит от выбранного критерия отбора.
+
Одним из примеров встроенного метода является реализация на [[Дерево решений и случайный лес| случайном лесе]]: каждому дереву на вход подаются случайное подмножество данных из датасета с каким-то случайным набор признаков, в процессе обучения каждое из деревьев решений производит "голосование" за релевантность его признаков, эти данные агрегируются, и на выходе получаются значения важности каждого признака датасета. Дальнейший отбор нужных нам признаков уже зависит от выбранного критерия отбора.
  
 
Встроенные методы используют преимущества оберточных методов и являются более эффективными, при этом на отбор тратится меньше времени, уменьшается риск [[переобучение|переобучения]], но т.к. полученный набор признаков был отобран на основе знаний о классификаторе, то есть вероятность, что для другого классификатора это множество признаков уже не будет настолько же релевантным.
 
Встроенные методы используют преимущества оберточных методов и являются более эффективными, при этом на отбор тратится меньше времени, уменьшается риск [[переобучение|переобучения]], но т.к. полученный набор признаков был отобран на основе знаний о классификаторе, то есть вероятность, что для другого классификатора это множество признаков уже не будет настолько же релевантным.
  
 
===Другие методы===
 
===Другие методы===
[[File:Feature_selection_ensemble_rus.png|thumb|Один из примеров процесса работы ансамблевых методов]]
+
[[File:Ensemble_feature_selection.jpg|175px|thumb|right|Один из примеров процесса работы ансамблевых методов]]
Есть и другие методы выбора признаков: '''гибридные''' (англ. ''hybrid methods'') и '''ансамблевые''' (англ. ''ensemble methods''). '''Гибридные методы''' комбинируют несколько разных методов выбора признаков, например, некоторое множество фильтров, а потом запускают оберточный или встроенный метод. Таким образом, гибридные методы сочетают в себе преимущества сразу нескольких методов, и на практике повышают эффективность выбора признаков.
+
Есть и другие методы отбора признаков: '''гибридные''' (англ. ''hybrid methods'') и '''ансамблевые''' (англ. ''ensemble methods''). '''Гибридные методы''' комбинируют несколько разных методов выбора признаков, например некоторое множество фильтров, а потом запускают оберточный или встроенный метод. Таким образом, гибридные методы сочетают в себе преимущества сразу нескольких методов, и на практике повышают эффективность выбора признаков.
  
'''Ансамблевые методы''' применяются больше для наборов данных с очень большим числом признаков. В данном подходе для начального множества признаков создается несколько подмножеств признаков, и эти группы каким-то образом объединяются, чтобы получить набор самых релевантных признаков. Это довольно гибкая группа методов, т.к. для нее можно применять различные способы выбора признаков и объединения их подмножеств.
+
'''Ансамблевые методы''' применяются больше для датасетов с очень большим числом признаков. В данном подходе для начального множества признаков создается несколько подмножеств признаков, и эти группы каким-то образом объединяются, чтобы получить набор самых релевантных признаков. Это довольно гибкая группа методов, т.к. для нее можно применять различные способы выбора признаков и объединения их подмножеств.
 
 
<div style="clear:{{{1|both}}};"></div>
 
  
 
===Примеры кода scikit-learn===
 
===Примеры кода scikit-learn===
 
Пример кода, реализующего функцию оценки фильтра на основе коэффициента ранговой корреляции:
 
Пример кода, реализующего функцию оценки фильтра на основе коэффициента ранговой корреляции:
   # Импорт библиотек
+
   // Импорт библиотек
 
   import pandas as pd
 
   import pandas as pd
 
   import numpy as np
 
   import numpy as np
 
    
 
    
   # Вспомогательная функция для расчета корреляции
+
   // Вспомогательная функция для расчета корреляции
 
   def correlation(X, Y):
 
   def correlation(X, Y):
 
       return np.cov(X, Y) / np.sqrt(np.var(X) * np.var(Y))
 
       return np.cov(X, Y) / np.sqrt(np.var(X) * np.var(Y))
  
   # Сам фильтр на основе метрики ранговой корреляции
+
   // Сам фильтр на основе метрики ранговой корреляции
   # Аргументы X -- значения объектов датасета для какой-то фичи, Y -- метки этих объектов
+
   // Аргументы X -- значения объектов датасета для какой-то фичи, Y -- метки этих объектов
 
   def measure_spearmans(X, Y):
 
   def measure_spearmans(X, Y):
 
       xr = pd.Series(X).rank()
 
       xr = pd.Series(X).rank()
Строка 64: Строка 62:
  
 
Пример кода, реализующего SVM-RFE wrapper:
 
Пример кода, реализующего SVM-RFE wrapper:
   # Импорт библиотек
+
   // Импорт библиотек
 
   import numpy as np
 
   import numpy as np
 
   import pandas as pd
 
   import pandas as pd
 
   from sklearn import svm
 
   from sklearn import svm
  
   # X -- наш датасет, Y -- массив меток
+
   // X -- наш датасет, Y -- массив меток
   # N -- число признаков, которые хотим оставить, step -- сколько фичей удаляется на каждой итерации
+
   // N -- число признаков, которые хотим оставить, step -- сколько фичей удаляется на каждой итерации
   # Возвращает массив из булевых переменных размерностью 1x[число признаков], показывающий, отбрасываем признак или нет
+
   // Возвращает массив из булевых переменных размерностью 1x[число признаков], показывающий, отбрасываем признак или нет
 
   def RFE(X, Y, N, step = 10):
 
   def RFE(X, Y, N, step = 10):
         # cache_size нужен, если набор данных большой, иначе можно опустить
+
         // cache_size нужен, если датасет большой, иначе можно опустить
 
         clfRFE = svm.SVC(kernel='linear', cache_size=1024)
 
         clfRFE = svm.SVC(kernel='linear', cache_size=1024)
 
         featureCount = X.shape[1]
 
         featureCount = X.shape[1]
Строка 89: Строка 87:
 
             curCount -= curStep
 
             curCount -= curStep
 
         return included
 
         return included
==Выделение признаков==
+
==Feature extraction==
Другим способом уменьшить размерность входных данных является выделение признаков. Эти методы каким-то образом составляют из уже исходных признаков новые, все также полностью описывающие пространство набора данных, но уменьшая его размерность и теряя в репрезентативности данных, т.к. становится непонятно, за что отвечают новые признаки.
+
Другим способом уменьшить размерность входных данных является выделение признаков. Эти методы каким-то образом составляют из уже исходных признаков новые, все также полностью описывающие пространство датасета, но уменьшая его размерность и теряя в репрезентативности данных, т.к. становится непонятно, за что отвечают новые признаки.
 
Все методы feature extraction можно разделить на '''линейные''' и '''нелинейные'''.
 
Все методы feature extraction можно разделить на '''линейные''' и '''нелинейные'''.
  
Одним из самых известных методов '''линейного''' выделения признаков является [[Метод главных компонент (PCA)| PCA]]<sup>[на 28.01.19 не создан]</sup> (Principal Component Analysis, рус. ''метод главных компонент''). Основной идеей этого метода является поиск такой гиперплоскости, на которую при ортогональной проекции всех признаков максимизируется дисперсия. Данное преобразование может быть произведено с помощью сингулярного разложения матриц и создает проекцию только на линейные многомерные плоскости, поэтому и метод находится в категории линейных.
+
Одним из самых известных методов линейного feature extraction является PCA (Principal Component Analysis, рус. ''метод главных компонент''). Основной идеей этого метода является поиск такой гиперплоскости, на которую при ортогональной проекции всех признаков максимизируется дисперсия. Данное преобразование может быть произведено с помощью сингулярного разложения матриц и создает проекцию только на линейные многомерные плоскости, поэтому и метод находится в категории линейных. К нелинейным методам, например, могут быть отнесены методы отображающие исходное пространство признаков на нелинейные поверхности или топологические многообразия.  
 
 
К '''нелинейным''' методам, например, могут быть отнесены методы отображающие исходное пространство признаков на нелинейные поверхности или топологические многообразия. Одним из таких алгоритмов является [[Стохастическое вложение соседей с t-распределением |t-SNE]]<sup>[на 28.01.19 не создан]</sup> (t-distributed Stochastic Neighbor Embedding, рус. ''стохастическое вложение соседей с t-распределением''). Данный метод состоит из двух шагов: изначально строится распределение вероятностей по всем парам точек набора данных, каждая условная вероятность $p_{j|i}$ которого означает насколько точка $X_j$ близка к точке $X_i$ при гауссовом распределении вокруг $X_i$. Данное распределение как метрику похожести использует евклидово расстояние. Алгоритм старается получить отображение из точек размерности $\mathbb{R}^k$ в меньшую размерность $\mathbb{R}^d$, для этого вводится еще одно распределение, описывающее насколько точки из нового пространства похожи друг на друга, но используя при этом t-распределение Стьюдента с одной степенью свободы. Как метрику похожести двух распределений используется дивергенция Кульбака-Лейблера<ref>[https://en.wikipedia.org/wiki/Kullback%E2%80%93Leibler_divergence Дивергенция Кульбака-Лейблера]</ref>, и чтобы найти точки новой размерности $d$ запускается градиентный спуск для минимизации этой величины.  
 
 
===Пример кода scikit-learn===
 
===Пример кода scikit-learn===
 
Пример выделения признаков с помощью PCA в scikit-learn:
 
Пример выделения признаков с помощью PCA в scikit-learn:
   # Импорт библиотек
+
   // Импорт библиотек
 
   from sklearn.decomposition import PCA
 
   from sklearn.decomposition import PCA
  from sklearn.model_selection import train_test_split
 
  
   X = ... # загрузка X
+
   // X -- датасет, n -- число извлекаемых признаков
  Y = ... # загрузка Y
+
  def extractPCA(X, n):
  # Разделение данных на train и test
+
      pca = PCA(n_components=n)
  Xtrain, Xtest, Ytrain, Ytest = train_test_split(X, Y)
+
      return pca.fit_transform(X)
  
  clf = ... # берем какой-то классификатор
+
===Примеры кода на языке Scala===
  # Обучаем PCA для выделения 5 признаков
 
  pca = PCA(n_components=5)
 
  pca.fit(Xtrain)
 
  # Изменяем наши наборы данных под выбранные признаки
 
  Xtrain = pca.transform(Xtrain)
 
  Xtest = pca.transform(Xtest)
 
  # Обучаем классификатор и проверяем точность его работы
 
  clf.fit(Xtrain, Ytrain)
 
  print ("Score: %.6f" % clf.score(Xtest, Ytest))
 
 
 
===Пример на языке Scala===
 
 
SBT зависимость:
 
SBT зависимость:
 
   libraryDependencies '''+=''' "com.github.haifengl" '''%%''' "smile-scala" '''%''' "1.5.2"
 
   libraryDependencies '''+=''' "com.github.haifengl" '''%%''' "smile-scala" '''%''' "1.5.2"
Строка 128: Строка 112:
 
   '''import '''smile.validation.Accuracy
 
   '''import '''smile.validation.Accuracy
  
   <span style="color:#3D9970>// Загрузка данных</span>
+
   // Загрузка данных
 
   '''val '''data = read.arff("data/weka/segment-test.arff", 19)
 
   '''val '''data = read.arff("data/weka/segment-test.arff", 19)
 
   '''val '''(x, y) = data.unzipInt
 
   '''val '''(x, y) = data.unzipInt
 
   '''val '''trainer = '''new '''GradientTreeBoost.Trainer(100)
 
   '''val '''trainer = '''new '''GradientTreeBoost.Trainer(100)
 
   '''val '''measure = '''new '''Accuracy
 
   '''val '''measure = '''new '''Accuracy
   <span style="color:#3D9970>// Cоздание генетического алгоритма и его настройка.</span>
+
   // Cоздание генетического алгоритма и его настройка.
 
   '''val '''selector = '''new '''GAFeatureSelection
 
   '''val '''selector = '''new '''GAFeatureSelection
   <span style="color:#3D9970>// Размер популяции - 50, количество поколений - 20 </span>
+
   // Размер популяции - 50, количество поколений - 20  
   <span style="color:#3D9970>// Каждая возращаемая BitString содержит фичи и их качество.</span>
+
   // Каждая возращаемая BitString содержит фичи и их качество.
 
   '''val '''result = selector.learn(50, 20, trainer, measure, x, y, 5)
 
   '''val '''result = selector.learn(50, 20, trainer, measure, x, y, 5)
 
   result.foreach { bits =>
 
   result.foreach { bits =>
Строка 176: Строка 160:
 
==См. также==
 
==См. также==
 
*[[Переобучение]]
 
*[[Переобучение]]
*[[Метод опорных векторов (SVM)| SVM]]<sup>[на 28.01.19 не создан]</sup>
+
*[[Метод опорных векторов (SVM)| SVM]]<sup>[на 20.01.18 не создан]</sup>
 
*[[Дерево решений и случайный лес| Случайный лес]]
 
*[[Дерево решений и случайный лес| Случайный лес]]
*[[Метод главных компонент (PCA)| PCA]]<sup>[на 28.01.19 не создан]</sup>
 
*[[Стохастическое вложение соседей с t-распределением |t-SNE]]<sup>[на 28.01.19 не создан]</sup>
 
 
==Примечания==
 
==Примечания==
 
<references/>
 
<references/>
Строка 187: Строка 169:
 
#[https://benthamopen.com/FULLTEXT/TOBIOIJ-11-117 Публикация про feature selection]
 
#[https://benthamopen.com/FULLTEXT/TOBIOIJ-11-117 Публикация про feature selection]
 
#[https://towardsdatascience.com/feature-selection-using-random-forest-26d7b747597f Embedded random forest]
 
#[https://towardsdatascience.com/feature-selection-using-random-forest-26d7b747597f Embedded random forest]
 
[[Категория: Машинное обучение]]
 
[[Категория: Уменьшение размерности]]
 

Пожалуйста, учтите, что любой ваш вклад в проект «Викиконспекты» может быть отредактирован или удалён другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Викиконспекты:Авторские права). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!

Чтобы изменить эту страницу, пожалуйста, ответьте на приведённый ниже вопрос (подробнее):

Отменить | Справка по редактированию (в новом окне)

Шаблон, используемый на этой странице: