Нормализация - важно для ГИС

Вопросы общего характера по ГИС и дистанционному зондированию, не связанные с конкретным ПО.
Ответить
Василиус
Интересующийся
Сообщения: 37
Зарегистрирован: 09 ноя 2010, 06:38
Репутация: 0

Нормализация - важно для ГИС

Сообщение Василиус » 12 ноя 2010, 05:24

Главный мой алгоритм и программа - Рапознавание "образов" - в таком виде не встречал - но все просто, могу там все прокомментировать, тут долго и ни к чему.
Еще пару рывков - главное решено. Остаются Трудности в подготовке данных и разнообразные варианты - это потом.
Основная цель Нормализации (нормировки, стандартизации) - устранение природных различий для совместного использования данных (в сопоставимых величинах).
Образно говоря "загнать в бутылку" или Свобода, Равенство, Братство. Равенство перед Законом распределения но не в Объекте!!! (пробе и др.)
В нашем случае хитрая СУММА, обратите внимание - редко где встречается описание, не путать с Sum, смотри в программе
Приведение к нормальному распределению с параметрами (0, 1) путем автоматического преобразованния (в случае необходимости) данных, расчета среднего (SredХj) и стандарта (Sj)
nj
SredХj = Sum Хji / nj ,
i=1
_______________
1 / nj
Sj = —— / Sum (Xji - SredХj)2 ,
n–1 \/ i=1

затем производится нормировка данных Хji по формуле Zji -нормализованные данные похожие друг на друга например Титан (был 500) и Серебро (было 0.001) стали 0!!!:
Хji - SredХj
Zji = ——————.
Sj
Мне не верите посмотрите в БСЭ. Тут сказано плохо и не совсем о том. Нигде слишком четко это не говорится. Нужно быть внимательным.
Просто так в книжках ничего не пишут. Математической литературы под рукой сейчас нет!
В БСЭ «СТАНДАРТИЗОВАННЫЕ КОЭФФИЦИЕНТЫ, статистич. показатели, применяемые для сравнения совокупностей разного состава с целью устранения различий. Так, сравнение показателей смертности лиц двух разных профессий может затрудняться различием их возрастной структуры. Чтобы устранить его влияние на коэффициенты смертности, для обеих групп принимают условно одну и ту же возрастную структуру, после чего исчисляют С. к., характеризующие показатели смертности обеих групп, пригодные для сопоставления. С этой целью по той и другой профессии из повозрастных показателей смертности вычисляются средние с одними и теми же весами для возрастных групп. Возможны и более сложные способы получения С. к. В демографич. статистике С. к. применяются и для сравнения др. показателей (напр., рождаемости, брачности) и не только по профессиям, но и по территориям, периодам времени и т. п. В экономич. статистике с С. к. сходны индексы, в исчислении к-рых принимаются, напр., одинаковые для обоих сравниваемых периодов наборы продуктов.»

Код: Выделить всё

*Программа несколько усложнена с дальним прицелом - нормировки эталонов по
*тому же закону распределения, как и основной файл,
* для простой нормировки можно подставить vibor = 0
*Процедура НОРМА для программы ГЕОКЛАСС. Предназначена для нормировки
*цифровой информации распределенной по нормальному закону. В связи с этим
*в исходных данных могут присутствовать ноли (0) и отрицательные числа.
*Создаются два дополнительных файла - нормированных чисел с заменой последних
*двух букв в названии на ng и параметров нормировки на np в случае нормировки
*основного файла vibor = 0, и один на ng в случае нормировки файла эталонов
* по параметрам нормировки по файлу с np vibor # 0.
*Еще хитрая СУММА где минус идет в плюс, плюс + минус пополам!
*Автор алгоритмов и программы В.Д.Брусницын
PROCEDURE НОРМА
*можно подставить vibor = 0
PARAMETERS vibor
SET TALK OFF
CLEAR
IF ALLTRIM(DBF(1))==""
    DEFINE POPUP obj_fil PROMPT FILES LIKE *.DBF;
        MESSAGE "ВЫБРАТЬ ФАЙЛ ДЛЯ НОРМИРОВКИ";
        TITLE "ВЫБРАТЬ ФАЙЛ ДЛЯ НОРМИРОВКИ"
    ON SELECTION POPUP obj_fil DEACTIVATE POPUP obj_fil
    ACTIVATE POPUP obj_fil
    SELECT 1
    USE PROMPT() NOUPDATE
ENDIF
SELECT 1
vorname = DBF(1)
vorname = SUBSTR(vorname,1,LEN(vorname)-6)
imia = "ng"
nach_el = f_fiel()
viv_file = vorname + ALLTRIM(imia) + '.dbf'
IF vibor = 0
    imia1 = "np"
    viv_fil1 = vorname + ALLTRIM(imia1) + '.dbf'
    COPY TO &viv_file AS 1251
    COPY STRUCTURE TO &viv_fil1
    USE &viv_file
    contf = FCOUNT()
    konec = FCOUNT()
    COUNT TO nom
    nom1 = 1/nom/(nom - 1)
    DIME srst(2, konec-nach_el + 1)
    FOR ii2 = nach_el TO konec
        pii = FIELD(ii2)
        SUM(&pii) TO sumx
        srst(1,ii2-nach_el+1) = sumx/nom
        kvsumx = sumx^2
        SUM(&pii^2) TO sumxkv
        nsumxkv = nom* sumxkv
        srst(2,ii2-nach_el+1) = SQRT(nom1*(nsumxkv-kvsumx))
    ENDFOR
    SELECT 2
    USE &viv_fil1
    APPEND BLANK
    APPEND BLANK
    FOR ii3 = nach_el TO konec
        pii = FIELD(ii3)
        GO BOTTOM
        REPL &pii WITH srst(2,ii3-nach_el+1)
        SKIP -1
        REPL &pii WITH srst(1,ii3-nach_el+1)
    ENDFOR
    p1 = FIELD(1)
    ALTER TABLE &viv_fil1 ALTER COLUMN &p1 C(8)
    ALTER TABLE &viv_fil1 RENAME COLUMN &p1 TO "Pokaz"
    GO TOP
    REPL Pokaz WITH "СРЕДНЕЕ"
    SKIP
    REPL Pokaz WITH "СТАНДАРТ"
    ii4 = 2
    DO WHILE ii4<nach_el
        pii = UPPER(FIELD(2))
        ALTER TABLE &viv_fil1 DROP COLUMN &pii
        ii4 = ii4 + 1
    ENDDO
    BROW TITLE ;
        "ВНЕСТИ ИЗМЕНЕНИЯ В СРЕДНЕЕ И СТАНДАРТ (Esc - для продолжения счета)"
ELSE
    CLEAR
    IF ALLTRIM(DBF(2))==""
        DEFINE POPUP obj_fil PROMPT FILES LIKE *.DBF;
            MESSAGE "ВЫБРАТЬ ФАЙЛ ПОКАЗАТЕЛЕЙ ДЛЯ НОРМИРОВКИ";
            TITLE "ВЫБРАТЬ ФАЙЛ ПОКАЗАТЕЛЕЙ ДЛЯ НОРМИРОВКИ"
        ON SELECTION POPUP obj_fil DEACTIVATE POPUP obj_fil
        ACTIVATE POPUP obj_fil
        SELECT 2
        USE PROMPT() NOUPDATE
    ENDIF
    SELECT 2
    COPY STRUCTURE TO &viv_file
    SELE 3
    USE &viv_file
    p1 = FIELD(1)
    ALTER TABLE &viv_file ALTER COLUMN &p1 N(3)
    p2 = "klasse"
    ALTER TABLE &viv_file RENAME COLUMN &p1 TO &p2
    APPEND FROM DBF(1)
    USE
    SELE 1
    USE &viv_file
    SELE 2
    nach_el = 2
    konec = FCOUNT()
ENDIF
FOR ii5 = 2 TO FCOUNT()
    SELECT 2
    pii = FIELD(ii5)
    GO BOTTOM
    standart =  &pii
    SKIP -1
    srednee = &pii
    SELECT 1
    REPL ALL &pii WITH (EVAL(pii)-(srednee))/standart
ENDFOR
SELECT 1
FOR ii1 = nach_el TO konec
    pii = FIELD(ii1)
    pii1 = pii+"_k"
    ALTER TABLE &viv_file RENAME COLUMN &pii TO &pii1
ENDFOR
ALTER TABLE &viv_file ADD COLUMN "KA_PLU" N(10,2)
ALTER TABLE &viv_file ADD COLUMN "KA_MIN" N(10,2)
ALTER TABLE &viv_file ADD COLUMN "KA_SUM" N(10,2)
beg = fst_el(UPPER('_K'))
elts = n_el(UPPER('_K'))
last_el = beg + elts - 1
DIMENSION a(elts)
GO TOP
* хитрая СУММА!!!!
DO WHILE ! EOF()
    FOR jj=1 TO elts
        a(jj)=EVAL(FIELD(beg-1+jj))
    ENDFOR
    =ASORT(a, 1, elts, 1)
    ka = 0
    SUM = 0
    ii = 1
    SUM = a(ii)
    ka1 = SUM / SQRT(ii)
    DO WHILE ii <=elts
        IF  ka < ka1
            ka = ka1
            ii = ii + 1
            IF ii = elts+1
                EXIT
            ENDIF
            SUM = SUM + a(ii)
            ka1 = SUM / SQRT(ii)
        ELSE
            ii = elts+1
        ENDIF
    ENDDO
    REPLACE ka_plu WITH ka
    ka = 0
    SUM = 0
    ii = elts
    IF a(ii)<0
        SUM = a(ii)
        ka1 = SUM / SQRT(elts - ii + 1)
    ELSE
        SUM = 0
        ka1 = 0
    ENDIF
    DO WHILE ii>= beg
        IF  ka > ka1 AND a(ii)<0
            ka = ka1
            ii = ii - 1
            SUM = SUM + a(ii)
            ka1 = SUM / SQRT(elts -ii+1)
            IF ii =  beg-1 AND ka > ka1
                ka = ka1
                EXIT
            ENDIF
        ELSE
            ii =  beg-1
        ENDIF
    ENDDO
    REPLACE ka_min WITH ka
    SKIP
ENDDO
REPLACE ALL ka_sum WITH (ka_plu + ABS(ka_min))/SQRT(2)
CLOSE ALL

*Процедура fst_el для программы ГЕОКЛАСС. Предназначена
*для автоматического определения первого элемента расчета
*по окончаниям "_K", "_R" -  BUKVA и др.
*Автор алгоритмов и программы В.Д.Брусницын
PROCEDURE fst_el
   PARAMETERS bukva
   fst_el = 0
   FOR i= 1 TO FCOUNT()
      pii = FIELD(i)
      IF UPPER(SUBSTR(ALLTRIM(pii), LEN(pii)-1, 2)) = bukva
         fst_el = i
         EXIT
      ENDIF
   ENDFOR
   RETURN fst_el

*Подпрограмма расчета  для программы ГЕОКЛАСС. Предназначена
*для автоматического определения числа полей расчета
*по окончаниям "_K", "_R" -  BUKVA  и др.
*Автор алгоритмов и программы В.Д.Брусницын

PROCEDURE N_EL
PARAMETERS  BUKVA
N_EL = 0
FOR I= 1 TO FCOUNT()
   PII = FIELD(I)
   IF UPPER(SUBSTR(ALLTRIM(PII), LEN(PII)-1, 2)) = BUKVA
      N_EL = N_EL + 1
   ENDIF
ENDFOR
RETURN N_EL

Ответить

Вернуться в «Общие вопросы»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя