Уровень алгоритма

Участник:ADovganich/Нечеткий алгоритм С средних: различия между версиями

Материал из Алговики
Перейти к навигации Перейти к поиску
Нет описания правки
Строка 8: Строка 8:
}}
}}


Авторы : [[Участник:Protsenko|Мария Проценко]], [[Участник:ADovganich|Андрей Довганич]]
Авторы : [[Участник:Protsenko|Мария Проценко]](1.5-1.10),[[Участник:ADovganich|Андрей Довганич]] (1.1-1.4)


= Свойства и структура алгоритмов =
= Свойства и структура алгоритмов =

Версия от 23:27, 14 октября 2016


Нечеткий алгоритм C средних


Авторы : Мария Проценко(1.5-1.10),Андрей Довганич (1.1-1.4)

Свойства и структура алгоритмов

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

Нечеткий алгоритм C-средних (fuzzy C-means) позволяет разбить имеющееся множество векторов (точек) мощностью p на заданное число нечетких множеств. Предназначен для кластеризации больших наборов данных. Основным достоинством алгоритма является нечеткость при определении объекта в кластер. Благодаря этому становится возможным определить объекты, которые находятся на границе, в кластеры. Из основного достоинства следует и главный недостаток - неопределенность с объектами, удаленными от центров всех кластеров. В остальном ему присущи стандартные проблемы подобного класса алгоритмов: вычислительная сложность, необходимость задания количества кластеров[1].

Алгоритм был разработан J.C. Dunn в 1973 г.[2], усовершенствован J.C. Bezdek в 1981 г.[3].

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

В общем виде алгоритм можно записать следующим образом:

1) Инициализировать матрицу принадлежности;

2) Вычислить центры кластеров;

3) Вычислить значение решающей функции. Если значение ниже некоторого порогового или его улучшение по сравнению с предыдущей итерацией меньше определенной величины, то остановить вычисления;

4) Иначе вычислить новые значения матрицы принадлежности;

5) Перейти к шагу 2

Математическое описание алгоритма

Рассмотрим матрицу [math]\displaystyle{ M = m_{ik} \in[0,1],\; i = 1, ..., c, \; k = 1, ..., K }[/math]. [math]\displaystyle{ m_{i,k} }[/math] - вероятность принадлежности объекта [math]\displaystyle{ k }[/math] к кластеру [math]\displaystyle{ i }[/math]; [math]\displaystyle{ c }[/math] - количество кластеров, [math]\displaystyle{ K }[/math] - количество векторов. При этом элементы матрицы удовлетворяют следующим условиям:

- сумма элементов в каждом столбце равна [math]\displaystyle{ 1 }[/math];

- сумма всех элементов матрицы равно [math]\displaystyle{ K }[/math];

Назовем [math]\displaystyle{ M }[/math] матрицей принадлежности.

Пусть [math]\displaystyle{ c_{i} (i = 1,2,...c) }[/math] - центры кластеров. Тогда рассмотрим функцию [math]\displaystyle{ (2) }[/math], где [math]\displaystyle{ d_{ik} = \left\Vert{u_{k}-c_{i}}\right\| }[/math] - Евклидово расстояние между центром кластера и объектом, [math]\displaystyle{ 1 \le q \le \infty }[/math] - экспоненциальный весовой коэффициент, характеризующий нечеткость. Будем минимизировать значение функции [math]\displaystyle{ J }[/math]. [math]\displaystyle{ (1) }[/math] и [math]\displaystyle{ (3) }[/math] являются необходимым условие достижения минимума этой функцией. Таким образом эти два условия дают нам итерационный процесс, описанный выше.

Вычислительное ядро алгоритма

Вычислительным ядром алгоритма являются формулы: [math]\displaystyle{ (1) }[/math], [math]\displaystyle{ (2) }[/math], [math]\displaystyle{ (3) }[/math]. В них производится вычисление новых центров кластеров, значения решающей функции и пересчет элементов матрицы принадлежности.

Макроструктура алгоритма

Макроструктура алгоритма состоит из следующих шагов:

1) Инициализация матрицы [math]\displaystyle{ M }[/math] случайными значениями от 0 до 1;

2) Вычисление центров кластеров;

3) Вычисление значения решающей функции(если оно удовлетворяет условиям останова - завершение вычислений);

4) Вычисление новых элементов матрицы принадлежности;

5) Переход к шагу 2;

Схема реализации последовательного алгоритма

Пример реализации алгоритма на языке С++

    float ** m;
    int *c;
    int number_clusters, number_items;
    m = gen_random_clusters();//заполним матрицу m случайными значениями от 0 до 1
    
    while (true)
    {
      //вычисление центров кластеров
        for (int i=0; i<number_clusters; i++)
        {
            numerator==denumerator=0;
            for (int k=0; k<number_items; k++)
            {
                numerator+=pow(m[i, k], q)*u[k];//u[k]-вектор
                denumerator+=pow(m[i, k], q);
            }
        c[i]= numerator / denumerator;//центры кластеров
        }
    
        j=0;//вычисление решающей функции
        for (int i=0; i<number_clusters; i++)
            for (int k=0; k<number_items; k++)
                j+=pow(m[i, k], q)*pow(dist(c[i], x[k],2);//dist-вычисляет расстояние между заданными векторами
    
       if ((abs(j-last_j)<eps1) || (j<eps2)) break;//проверка на необходимость завернешения алгоритма
       last_j=j;
     //обновление матрицы m
       for (int i=0; i<number_clusters; i++)
          for (int k=0; k<number_items; k++)
             {
               m[i,k]=0
              for(int j=0; j<number_clusters; j++)
                  m[i,k]=pow(dist(c[i], x[k]),2/(q-1));
                 m[i,k]=1/m[i,k];
              }
                                       
    }

Последовательная сложность алгоритма

Каждая итерация включает в себя

  • Вычисление центров кластеров [math]\displaystyle{ O(C*K) }[/math]
  • Вычисление решающей функции [math]\displaystyle{ O(C*K) }[/math]
  • Обновлене матрицы m [math]\displaystyle{ O(C*C*K) }[/math]

Общая сложность каждой итерации [math]\displaystyle{ O(C*C*K) }[/math] Сложность всего алгоритма будет зависеть от числа итераций, которое зависит от

  • Выбора начального приближения
  • Выбора условий останова

Информационный граф

Ресурс параллелизма алгоритма

Входные и выходные данные алгоритма

Свойства алгоритма

Программная реализация алгоритма

Особенности реализации последовательного алгоритма

Локальность данных и вычислений

Возможные способы и особенности параллельной реализации алгоритма

Масштабируемость алгоритма и его реализации

Динамические характеристики и эффективность реализации алгоритма

Выводы для классов архитектур

Существующие реализации алгоритма

Литература

  1. ↑ Нейский И.М. Классификация и сравнение методов кластеризации
  2. ↑ Dunn, J. C. (1973-01-01). "A Fuzzy Relative of the ISODATA Process and Its Use in Detecting Compact Well-Separated Clusters". Journal of Cybernetics. 3 (3): 32–57. doi:10.1080/01969727308546046. ISSN 0022-0280.
  3. ↑ Bezdek, James C. (1981). Pattern Recognition with Fuzzy Objective Function Algorithms. ISBN 0-306-40671-3.