Однослойный персептрон (пример)

Материал из MachineLearning.

(Различия между версиями)
Перейти к: навигация, поиск
(Вычислительный эксперимент)
(Модельные данные (сложный вариант): задача исключающего ИЛИ)
Строка 148: Строка 148:
hold off
hold off
</source>
</source>
 +
 +
[[Изображение:Hard.png|300px]]
 +
 +
Алгоритм допустил около 50% ошибок классификация, что неудивительно, т.к. входные данные были принципиально линейно неразделимы.
== Исходный код ==
== Исходный код ==

Версия 14:14, 6 мая 2009

Содержание

Однослойный персептрон — это модель нейрона, простейший пример нейронной сети. Фактически представляет собой линейный пороговый классификатор. [1] [1]

Постановка задачи линейного разделения классов

Пусть X - пространство объектов; [1] [1]

Y - множество допустимых ответов. Будем считать, что x = (x^0,x^1,\dots,x^n) \in \{-1\}\times\mathbb{R}^n, где x^j = f_j(x), j \geq 1 - признаковое описание объекта, а x_0 = -1 - дополнительный константный признак; Y = \{0,1\}. Задана обучающая выборка \{(\mathbf{x}_i,y_i)\}_{i=1}^\ell. Значения признаков x^j = f_j(x) рассматриваются как импульсы, поступающие на вход нейрона, которые складываются с весами w_1,\dots,w_n. Если суммарный импульс превышает порог активации w_0, то нейрон возбуждается и выдаёт на выходе 1, иначе выдаётся 0. Таким образом, нейрон вычисляет n-арную булеву функцию вида

a(x) = \varphi(\sum_{i=1}^{\ell}w_jx^j-w_0) = \varphi(\langle w,x \rangle), где \varphi(z)=[z \geq 0]

Требуется найти значения параметров, при которых алгоритм наилучшим образом аппроксимирует целевую зависимость, заданную на объектах обучающей выборки. [1] [1]

Описание алгоритма

Для настройки вектора весов воспользуемся методом стохастического градиента. Возьмем квадратичную функцию потерь: Q(w) = \sum_{i=1}^{\ell}(a(x_i)-y_i)^2, а в качестве функции активации возьмем сигмоидную функцию: \varphi(z) = \frac{1}{1+e^{-z}}. Согласно принципу минимизации эмпирического риска задача сводится к поиску вектора, доставляющего минимум функционалу  Q(w) \rightarrow \min_w. Применим для минимизации метод градиентного спуска:

w:=w - \eta \nabla Q(w),

где \eta > 0 величина шага в направлении антиградиента, называемая также темпом обучения (learning rate). Будем выбирать прецеденты (x_i, y_i) по одному в случайном порядке, для каждого делать градиентный шаг и сразу обновлять вектор весов:

w:= w - \eta(a(x_i,w)-y_i)(1-\varphi(\langle w,x_i \rangle))\varphi(\langle w,x_i \rangle)x_i.

[1]

Значение функционала оцениваем:
Q = (1-\lambda)Q+\lambda \eps_i,
где \eps_i = (a(x_i,w)-y_i)^2.

[1]

Процедура останавливается после того, как изменение значения функционала функционала Q становится меньше заданной константы:
|Q_n - Q_{n-1}|< \delta

Вычислительный эксперимент

Показана работа алгоритма в серии задач, основанных как на реальных, так и на модельных данных.

Пример на реальных данных: ирисы

Из задачи о классификации ирисов выбраны 2 вида ирисов: Versicolour и Virginica, которые предлагается классифицировать по двум признакам — длине и ширине лепестка. Данные содержат информацию о 50 цветках каждого видаiris.txt.

Iris.jpg

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

%load data
load 'iris.txt';
x = iris;
x(:,1:2) = []; %eliminating first two attributes
y = [repmat(0,50,1);repmat(1,50,1)]; %creating class labels
 
%plotting data
plot(x(y == 0,1),x(y == 0,2),'*r');
hold on
plot(x(y == 1,1),x(y == 1,2),'*b');
 
%invoke One layer perceptron algorithm
w = OneLayerPerc(x,y);
 
%getting classification
y = PercTest(x,w);
 
%plotting resulting classification
plot(x(y == 0,1),x(y == 0,2),'or');
plot(x(y == 1,1),x(y == 1,2),'ob');
 
plot([w(3)/w(1),0],[0,w(3)/w(2)],'g');
 
hold off;

Заметим, что данные линейно не разделимы, но алгоритм показывает хороший результат, допустив 5 ошибок классификации.

Модельные данные (простой вариант): 2 нормально распределенных класса линейно разделимы

%generating 2 sample normal classes
x = GetNormClass(100,[0,0],[1,1]);
s = GetNormClass(100,[4,4],[1,1]);
 
x = [x;s];
 
y = [repmat(1,100,1);repmat(0,100,1)];
 
%invoke One layer perceptron algorithm
w = OneLayerPerc(x,y);
 
%generating control data with the same distribution
x = GetNormClass(100,[0,0],[1,1]);
s = GetNormClass(100,[4,4],[1,1]);
x = [x;s];
 
%plotting control data
plot(x(:,1),x(:,2),'*r');
hold on
plot(s(:,1),s(:,2),'*b');
 
%getting classification
y = PercTest(x,w);
 
%plotting classified data
plot(x(y == 0,1),x(y == 0,2),'ob');
plot(x(y == 1,1),x(y == 1,2),'or');
 
plot([w(3)/w(1),0],[0,w(3)/w(2)],'g');
 
hold off

Алгоритм не допустил при классификации ни одной ошибки.

Модельные данные (сложный вариант): задача исключающего ИЛИ

%generate 2 sample classes
x = GetNormClass(100,[0,0],[1,1]);
s = GetNormClass(100,[6,6],[1,1]);
x = [x;s];
s = GetNormClass(100,[0,6],[1,1]);
x = [x;s];
s = GetNormClass(100,[6,0],[1,1]);
x = [x;s];
 
 
y = [repmat(1,200,1);repmat(0,200,1)];
 
%invoke One layer perceptron algorithm
w = OneLayerPerc(x,y);
 
%generate control data with the same distribution
x = GetNormClass(100,[0,0],[1,1]);
s = GetNormClass(100,[6,6],[1,1]);
x = [x;s];
s = GetNormClass(100,[0,6],[1,1]);
x = [x;s];
s = GetNormClass(100,[6,0],[1,1]);
x = [x;s];
 
 
%plot control data
plot(x(y == 1,1),x(y == 1,2),'*r');
hold on
plot(x(y == 0,1),x(y == 0,2),'*b');
 
%get classification
y = PercTest(x,w);
 
%plot classified data
plot(x(y == 0,1),x(y == 0,2),'ob');
plot(x(y == 1,1),x(y == 1,2),'or');
 
plot([w(3)/w(1),0],[0,w(3)/w(2)],'g');
 
hold off

Алгоритм допустил около 50% ошибок классификация, что неудивительно, т.к. входные данные были принципиально линейно неразделимы.

Исходный код

Скачать листинги алгоритмов можно здесь Func.m, OneLayerPerc.m, PercTest.m, GetNormClass.m.

Смотри также

Литература

  • [1]
  • К. В. Воронцов, Лекции по линейным алгоритмам классификации
  • Bishop, C. Pattern Recognition And Machine Learning. Springer. 2006.
Данная статья является непроверенным учебным заданием.
Студент: Участник:Максим Панов
Преподаватель: Участник:В.В. Стрижов
Срок: 28 мая 2009

До указанного срока статья не должна редактироваться другими участниками проекта MachineLearning.ru. По его окончании любой участник вправе исправить данную статью по своему усмотрению и удалить данное предупреждение, выводимое с помощью шаблона {{Задание}}.

См. также методические указания по использованию Ресурса MachineLearning.ru в учебном процессе.


Замечания

Личные инструменты