Диссертация (1149691), страница 25
Текст из файла (страница 25)
Если же ЗЛПне имеет решения, то вероятность пропозициональной формулы устанавливается равной 0.Локальный апостериорный выводТеперь рассмотрим второй вид локального логико-вероятностноговывода – апостериорный вывод. Все алгоритмы апостериорного выводареализованы в классах, являющихся наследниками класса BasePropagator.Также, как и классы, содержащие реализацию алгоритмов априорного вывода, классы-пропагаторы реализуют паттерн «одиночка».Начнем с первой задачи апостериорного вывода – определить вероятность поступившего свидетельства.
Рассмотрим пропагацию детерминированного свидетельства во фрагмент знаний со скалярными оценками.Листинг 4.11 — Реализация алгоритма вычисления вероятностисвидетельства.public virtual double evidenceProbaility ( BinaryEvidencebinaryEvidence ){Matrix < double > quants = binaryEvidence . getProbabilities () ;if ( this . kp is ScalarConjunctKnowledgePattern )5{quants = matrixHelper .
getKronekerPowerOfI ( binaryEvidence .getSize () ) * quants ;}int [] atomsMap = getAtomsMap ( binaryEvidence );Vector < double > transformedEvidence ;10for ( int i = 0; i < quants . RowCount ; i ++){142if ( quants [i , 0] == 1){transformedEvidence = transformEvidence (i , binaryEvidence .getSize () , atomsMap ) ;if ( this . kp is ScalarConjunctKnowledgePattern ){return conjunctEvidenceProbability ( transformedEvidence );}else{return quantEvidenceProbability ( transformedEvidence ) ;}}1520}return 0;25}Листинг 4.12 — Вспомогательные алгебраические вычисления для методаevidenceProbability.protected double quantEvidenceProbability ( Vector < double >evidence ){return getEvidenceMatrix ( matrixHelper .
sMatrixArray , evidence ) .PointwiseMultiply ( this . kp . getProbabilities () ) . Column (0) . Sum() ;}5 protected double conjunctEvidenceProbability ( Vector < double >evidence ){return getEvidenceMatrix ( matrixHelper . rMatrixArray , evidence ) .PointwiseMultiply ( this . kp . getProbabilities () ) . Column (0) . Sum() ;}В первых четырех строках мы преобразуем вектор вероятностей свидетельства, построенного над идеалом конъюнктов в вектор вероятностейквантов.
Переменная atomsMap используется для сопоставления индексов атомов свидетельства с индексами атомов фрагмента знаний, в которое данноесвидетельство поступило. Далее мы проходим по всему вектору вероятностей квантов и ищем номер того кванта, вероятность которого не равна 0.Очевидно, что поскольку свидетельство детерминированное, то существуетодин и только один такой квант. По номеру кванта мы можем определить143сам квант, а значит и означивание атомов, входящих в него, после чегопостроить вектор, соответствующий данному детерминированному свидетельству. Данный вектор объединяет в себя информацию о положительно иотрицательно означенных атомах, а также о тех атомах, которые не вошлив свидетельство.
По данному вектору можно построить вектор r⟨ ; ⟩ ,d⟨ ; ⟩ ,или s⟨ ; ⟩ и воспользовавшись матрично-векторными операциями, предоставляемыми библиотекой Math.NET, получить апостериорную вероятностьсвидетельства. Реализация алгоритмов поиска вероятности стохастического и интервального свидетельства схожи с вышеуказанной реализацией иотличаются лишь заданием ограничений для ЗЛП в случае неточного свидетельства, поэтому опустим их рассмотрение и сразу перейдем к реализациирешения второй задачи апостериорного вывода.Сперва рассмотрим пропагацию детерминированного свидетельстваво фрагмент знаний со скалярными оценками, чтобы подробно разобратьалгоритм обработки свидетельства, а затем пропагацию стохастическогосвидетельства во фрагмент знаний с интервальными оценками.
Ниже приведен метод propagate класса ScalarPropagator, параметром которого являетсяобъект класса BinaryEvidence. Данный метод возвращает матрицу с апостериорными оценками вероятностей. Листинг 4.13 — Реализация алгоритма пропагации бинарногосвидетельства.public Matrix < double > propagate ( BinaryEvidence binaryEvidence ){var evidenceProbability = binaryEvidence . getProbabilities () ;5int [] atomsMap = getAtomsMap ( binaryEvidence );Matrix < double > quants = matrixHelper .
getKronekerPowerOfI (binaryEvidence . getSize () ) *evidenceProbability ;Matrix < double > aposterioriProbability = DenseMatrix .Create ( this . kp . getVectorSize () , 1 , 0) ;10Vector < double > transformedEvidence ;15for ( int i = 0; i < quants . RowCount ; i ++){if ( quants [i , 0] == 1){144transformedEvidence = transformEvidence (i , binaryEvidence .getSize () , 7 atomsMap ) ;if ( this .
kp is ScalarConjunctKnowledgePattern ){aposterioriProbability = aposterioriProbability +getConjunctsProbability ( transformedEvidence ) * quants[i , 0];} else{aposterioriProbability = aposterioriProbability +getQuantsProbability ( transformedEvidence ) * quants [i ,0];}2025}}return aposterioriProbability ;}Как можно заметить, та часть метода, где происходит предобработкасвидетельства, схожа с реализацией решения первой задачи апостериорноговывода, поэтому сконцентрируем внимание на той части, где непосредственно проводятся вычисления апостериорных вероятностей. Для этогообратим внимание на реализацию следующих двух методов, первый изкоторых предназначен для вычисления апостериорных вероятностей пропозиций-квантов, а второй апостериорных вероятностей элементов идеалаконъюнктов.Листинг 4.14 — Вспомогательные алгебраические вычисления для методаpropagate.private Matrix < double > getQuantsProbability ( Vector < double >evidence ){Matrix < double > nonNormalizedQuants = getEvidenceMatrix (matrixHelper .
hMatrixArray , evidence ) * this . kp .getProbabilities () ;var normalizationFactor = quantEvidenceProbability ( evidence ) ;5Matrix < double > aposterioriQuants = nonNormalizedQuants . Divide (normalizationFactor ) ;return aposterioriQuants ;}14510 private Matrix < double > getConjunctsProbability ( Vector < double >evidence ){Matrix < double > nonNormalizedConjuncts = getEvidenceMatrix (matrixHelper . tMatrixArray , evidence ) * this . kp .getProbabilities () ;var normalizationFactor = conjunctEvidenceProbability ( evidence);Matrix < double > aposterioriConjuncts = nonNormalizedConjuncts .Divide ( normalizationFactor ) ;15return aposterioriConjuncts ;}В каждом из методов, сначала вычисляются ненормализованныеапостериорные оценки вероятностей, затем отдельно вычисляется нормализующий множитель и ,наконец, векторы, содержащие апостериорныеоценки покомпонентно делятся на нормализующий множитель.
МетодgetEvidenceMatrix по заданному набору матриц (H∘ ,H+ ,H− ,M∘ ,M+ ,M− , илиT∘ ,T+ ,T− ) и характеристическому вектору свидетельства вычисляет соответствующее произведение Кронекера.Теперь рассмотрим пропагацию стохастического свидетельства вофрагмент знаний с интервальными оценками.Листинг 4.15 — Реализация алгоритма пропагации стохастическогосвидетельства.public Matrix < double > propagate ( ScalarEvidence scalarEvidence ){var evidenceProbability = scalarEvidence .
getProbabilities () ;int [] atomsMap = getAtomsMap ( scalarEvidence );5Matrix < double > evidenceQuants = matrixHelper .getKronekerPowerOfI ( scalarEvidence . getSize () ) *evidenceProbability ;10Vector < double > convertedEvidence = new DenseVector ( this . kp .getSize () );Matrix < double > newProbabilities = new DenseMatrix ( this . kp .getVectorSize () , 2) ;for ( int i = 0; i < evidenceQuants . RowCount ; i ++){convertedEvidence = transformEvidence (i , scalarEvidence .getSize () , atomsMap ) ;Matrix < double > evidenceMatrix ;146Vector < double > evidenceVector ;if ( this . kp is IntervalConjunctKnowledgePattern ){evidenceMatrix = getEvidenceMatrix ( matrixHelper .tMatrixArray , convertedEvidence ) ;evidenceVector = getEvidenceMatrix ( matrixHelper .rMatrixArray , convertedEvidence ) .
Column (0) ;Matrix < double > a = DiagonalMatrix . OfDiagonal (1 , 2,evidenceVector ) ;} else{evidenceMatrix = getEvidenceMatrix ( matrixHelper .hMatrixArray , convertedEvidence ) ;evidenceVector = getEvidenceMatrix ( matrixHelper .sMatrixArray , convertedEvidence ) . Column (0) ;}var lp = setBinaryConstraints ( evidenceVector ) ;newProbabilities += solveProblem ( evidenceMatrix , lp ) *evidenceProbability [i , 0];152025}Console . Write ( " After propagation : " + newProbabilities .ToString () ) ;return newProbabilities ;}В первых 5 строках инициализируются матрицы, хранящие апостериорные вероятности, вероятности пропозиций-квантов, соответствующихидеалу конъюнктов, над которым построено свидетельство, и другие. Внутри цикла for производится итерация по пропозициями-квантам и построение матрицы и вектора, соответствующих данному детерминированномусвидетельству.
Затем создается и решается ЗЛП, результатами которойявляется матрица 2 × , хранящая апостерионые вероятности. После этого полученные вероятности взвешиваются умножением на вероятностьпропагированного свидетельства и складываются, давая окончательный результат.Рассмотрение остальных типов поступающих свидетельств и фрагментов знаний мы опустим, поскольку целью данного парагарфа являетсяобзор основных технологий и подходов к программированию, использованных при реализации алгоритмов логико-вероятностного вывода.1474.2.5Примеры использованияВ данном параграфе продемонстрируем некоторые варианты использования комплекса программ.
Для начала рассмотрим фрагмент кода ипроанализируем его, а затем рассмотрим результат его работы.Листинг 4.16 — Тестирование метода проверки непротиворечивости.static void IntervalConsistency (){IntervalKnowledgePattern intervalKP = newIntervalConjunctKnowledgePattern (new double [] { 1 , 0.52 , 0.84 , 0.52 , 0.68 , 0.2 , 0.52 , 0.2 } ,5new double [] { 1 , 0.6 , 1 , 0.7 , 0.7 , 0.5 , 0.68 , 0.9 } ,new string [] { " x1 " , " x2 " ," x3 " });Console .
WriteLine ( " Probability of conjuncts : \ n " + intervalKP .getProbabilities () . ToMatrixString () ) ;Console . WriteLine ( " This pattern is consistent ? " + intervalKP .isConsistent () ) ;10 Console . WriteLine ( " Consistent probability of conjuncts : \ n " +intervalKP . getProbabilities () . ToMatrixString () );}В первых четырех строках инициализируется фрагмент знаний надидеалом конъюнктов с интервальными оценками вероятностей. Затем оценки вероятностей выводятся на экран, после чего производится проверканепротиворечивости фрагмента знаний и уже согласованные оценки выводятся на экран.
Результатом работы данного фрагмента кода будетследующий вывод:Листинг 4.17 — Результат работы функции IntervalConsistency.510Probability of conjuncts :110 ,30 ,90 ,610 ,50 ,90 ,520 ,70 ,12 0 ,540 ,22 0 ,680 ,20 ,9148This pattern is consistent ? TrueConsistent probability of conjuncts :110 ,50 ,90 ,610 ,50 ,90 ,520 ,70 ,2 0 ,540 ,22 0 ,680 ,2 0 ,541520Сравнив первые и вторые оценки, можно заметить, что некоторые изних отличаются, что вкупе с положительным результатом работы методаisConsistent() говорит о том, что интервальные оценки были уточнены. Благодаря использованию метода ToMatrixString() библиотеки Math.NET можно небеспокоится о табуляции и аккуратном выводе на экран матриц, содержащих оценки вероятностей.Теперь приведем пример априорного вывода во фрагменте знаний надпропозициями-квантами.















