В настоящее время я пытаюсь автоматически сгенерировать набор нечетких правил для набора наблюдений, которые содержат четыре значения для каждого наблюдения, где каждое наблюдение будет соответствовать состоянию (хороший пример - данные Фишера по радужной оболочке).
В Matlab я создаю четырехмерную таблицу правил, в которой одна ячейка (a, b, c, d) будет содержать соответствующее состояние. Чтобы уменьшить таблицу, я использую метод Хонга и Ли. проверки сходства строк и столбцов, но мне трудно понять, как обращаться к строкам и столбцам третьего и четвертого измерений. Из метода я понимаю, что каждое измерение рассматривается индивидуально, и если правило верно, таблица упрощается. Правила слияния следующие:
- Если все ячейки в соседних столбцах или строках одинаковы.
- Если две ячейки совпадают или одна из них пуста в соседних
столбцах или строках и хотя бы одна ячейка в обеих не пуста.- Если все ячейки в столбце или строке пусты, а ячейки в двух
соседних столбцах или строках совпадают, объедините эти три ячейки.- Если все ячейки в столбце или строке пусты, а ячейки в двух
соседних столбцах или строках одинаковы или хотя бы одна из них пуста, объедините эти три ячейки.- Если все ячейки в столбце или строке пусты и если все непустые
ячейки в столбце или строке слева имеют одну и ту же область, а все непустые ячейки в столбце или строке справа имеют того же региона, но отличного от ранее упомянутого региона, объедините эти три столбца в две части.
Теперь немного запутанного. Простая проверка того, совпадает ли вся строка/столбец с соседней (правило 1), кажется достаточно простой:
if (a,:,:,:) == (a+1,:,:,:)
(:,b,:,:) == (:,b+1,:,:)
(:,:,c,:) == (:,:,c+1,:)
(:,:,:,d) == (:,:,:,d+1)
это правильно?
но чтобы проверить, совпадают ли элементы в строке/столбце или равны нулю (правила 2 и 4), я немного теряюсь. Будет ли это что-то в этом роде:
for a = 1:20
for i = 1:length(b)
if (a+1,i,:,:) == (a,i,:,:)
...
else if (a+1,i,:,:) == 0
...
else if (a,i,:,:) == 0 etc.
и для третьего и четвертого измерений:
for c = 1:20
for i = 1:length(a)
if (i,:,c,:) == (i,:,c+1,:)
...
else if (i,:,c+1,:) == 0
...
else if (i,:,c,:) == 0 etc.
for d = 1:20
for i = 1:length(a)
if (i,:,:,d) == (i,:,:,d+1)
...
else if (i,:,:,d+1) == 0
...
else if (i,:,:,d) == 0 etc.
даже любая помощь с четырехмерными массивами была бы полезна, поскольку меня так смущает мысль о более чем трех! Я бы посоветовал вам посмотреть на статью, чтобы понять, что я имею в виду - они сами использовали данные Iris, но привели только пример с 2D-таблицей.