Это деление на Log(2) сделано в коэффициенте, т.к. потом при вычислении частных критериев также используется логарифм и он тоже переводится к основанию 2:
- Код: Выделить всё
DBGOTO(N_Atr+1);N = SUMMA // SUMM угловой элемент
DBGOTO(N_Atr+4);Nobj = SUMMA // Всего логических объектов обучающей выборки
K = LOG(N_Cls)/LOG(N)/LOG(2) // Нормировочный коэффицент для перевода в биты
*** Начало цикла по классам *******************
FOR j = 1 TO N_Cls
SELECT ABS_CLUST2
DBGOTO(N_Atr+1);Nj = FIELDGET(2+j) // Суммарное число признаков по j-му классу
DBGOTO(N_Atr+4);Njo = FIELDGET(2+j) // Суммарное число объектов по j-му классу
FOR i = 1 TO N_Atr
****** Выбор способа расчета для разных моеделей
PUBLIC Ar_Model := {"Abs", "Prc1", "Prc2", "Inf1", "Inf2", "Inf3", "Inf4", "Inf5", "Inf6", "Inf7" }
SELECT ABS_CLUST2
DBGOTO(i)
Nij = FIELDGET(2+j)
Ni = SUMMA
Iij = 0 // На случай, если вообще не посчитается, чтобы не возникала ошибка при присвоении значения полю базы
DO CASE
CASE mNumMod = 1 // ABS (модель ABS есть сама матрица ABS, т.е. ее рассчиывать не нужно)
Iij = Nij
CASE mNumMod = 2 // PRC1
IF Nj <> 0
Iij = Nij/Nj
ENDIF
CASE mNumMod = 3 // PRC2
IF Njo <> 0
Iij = Nij/Njo
ENDIF
CASE mNumMod = 4 // INF1
IF Nij*Ni*Nj*N <> 0
Iij = K*LOG((Nij*N)/(Ni*Nj))
ENDIF
CASE mNumMod = 5 // INF2
IF Nij*Ni*Njo*Nobj <> 0
Iij = LOG((Nij*Nobj)/(Ni*Njo))/LOG(2)
ENDIF
CASE mNumMod = 6 // INF3
IF N <> 0
Iij = Nij-Ni*Nj/N
ENDIF
CASE mNumMod = 7 // INF4
IF Ni*N <> 0
Iij = (Nij*N)/(Ni*Nj) - 1
ENDIF
CASE mNumMod = 8 // INF5
IF Ni*Njo*Nobj <> 0
Iij = (Nij*Nobj)/(Ni*Njo) - 1
ENDIF
CASE mNumMod = 9 // INF6
IF Nj*Nobj <> 0
Iij = (Nij/Nj) - (Ni/N)
ENDIF
CASE mNumMod = 10 // INF7
IF Njo*Nobj <> 0
Iij = (Nij/Njo) - (Ni/Nobj)
ENDIF
ENDCASE
SELECT INF_CLUST
DBGOTO(i)
FIELDPUT(2+j,Iij) // сам элемент Iij
REPLACE SUMMA WITH SUMMA + Iij // столбец SUMMA
DBGOTO(N_Atr+1)
FIELDPUT(2+j,FIELDGET(2+j)+Iij) // строка SUMMA
REPLACE SUMMA WITH SUMMA + Iij // Угл.эл. SUMMA
NEXT
NEXT
****** Расчет средних по строкам
SELECT INF_CLUST
FOR i = 1 TO N_Atr
DBGOTO(i)
REPLACE SREDN WITH SUMMA/N_Cls
NEXT
** Расчет средних по столбцам
GO N_Atr+2 // SREDN строка
FOR j = 1 TO N_Cls
DBGOTO(N_Atr+1);mSumma = FIELDGET(2+j) // SUMMA строка
DBGOTO(N_Atr+2);FIELDPUT(2+j,mSumma/N_Atr) // SREDN строка
NEXT
DBGOTO(N_Atr+1);mSredn = SUMMA/(N_Cls*N_Atr)
DBGOTO(N_Atr+2);REPLACE SREDN WITH mSredn // SREDN угловой элемент
****** Расчет столбца интегральной информативности факторов
Ds = 0 // угловой элемент DISP
FOR i = 1 TO N_Atr
DBGOTO(i);mSredn = SREDN
FOR j = 1 TO N_Cls
Iij = FIELDGET(2+j) // Информативность-элемент (i,j)
REPLACE DISP WITH DISP+(mSredn-Iij)^2
Ds = Ds + (mSredn-Iij)^2
NEXT
NEXT
**** Дорасчет интегральной информативности факторов
FOR i = 1 TO N_Atr
DBGOTO(i);mDisp = DISP // DISP столбец
REPLACE DISP WITH SQRT(DISP/(N_Cls-1))
NEXT
*** Расчет степени редукции классов
FOR j = 1 TO N_Cls
DBGOTO(N_Atr+2);mSredn=FIELDGET(2+j)
FOR i = 1 TO N_Atr
DBGOTO(i);Iij=FIELDGET(2+j) // Информативность-элемент (i,j)
DBGOTO(N_Atr+3);FIELDPUT(2+j,FIELDGET(2+j)+(mSredn-Iij)^2)
NEXT
NEXT
**** Дорасчет среднеквадратичного оклонения по классам и угл.элемент
DBGOTO(N_Atr+3)
FOR j = 1 TO N_Cls
FIELDPUT(2+j,SQRT(FIELDGET(2+j)/(N_Atr-1)))
NEXT
REPLACE DISP WITH SQRT(Ds/(N_Cls*N_Atr-1)) // DISP - угловой элемент
См. строки:
CASE mNumMod = 4 // INF1
IF Nij*Ni*Nj*N <> 0
Iij = K*LOG((Nij*N)/(Ni*Nj))
ENDIF
А для модели Inf2 этот коэффициент не используется, поэтому там кол-во информации просто делится на Log(2)
CASE mNumMod = 5 // INF2
IF Nij*Ni*Njo*Nobj <> 0
Iij = LOG((Nij*Nobj)/(Ni*Njo))/LOG(2)
ENDIF
Но эта модель хуже обоснована теоретически, хотя и более понятна, чем Inf1