Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Пространство имён AlgorithmsСодержание книги
Поиск на нашем сайте
CN2.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Documents; using CN2.Core.DataStructures;
namespace CN2.Core.Algorithms { public class CN2 { private List<ProductionRule> _cover; private List<Tuple<ProductionRule, ArguedLearnableExample>> _arguedCover;
/// <summary> /// Процент правильно распознанных примеров. /// </summary> // prce is percentage of correctly recognized examples private double _pcre;
public List<ProductionRule> Cover { get { return _cover; } }
public List<Tuple<ProductionRule, ArguedLearnableExample>> ArguedCover { get { return _arguedCover; } }
/// <summary> /// Возвращает процент правильно распознанных примеров. /// </summary> public double PCRE { get { return _pcre; } }
public CN2() { _cover = null; _arguedCover = null; _pcre = 0; }
/// <summary> /// Производит обучение. /// </summary> /// <param name="learningExamples"></param> /// <param name="starSize"></param> /// <param name="heapSize"></param> /// <param name="isRandom"></param> public void Learn(List<LearnableExample> learningExamples, int starSize = 3, int heapSize = 3, bool isRandom = false) { if (learningExamples == null || learningExamples.Count == 0) { throw new ArgumentException("Недопустимый список атрибутов."); } if (starSize < 1) { throw new ArgumentException("Недопустимое значение StarSize: " + starSize + "."); }
// список записей вида «значение типа решающего атрибута», «список положительных примеров», «список отрицательных примеров» List<Tuple<AttributeValue, List<LearnableExample>, List<LearnableExample>>> CArr = new List<Tuple<AttributeValue, List<LearnableExample>, List<LearnableExample>>>();
// тип решающего атрибута AttributeType attributeType = learningExamples[0].DecisiveAttribute.Type;
_cover = new List<ProductionRule>();
// цикл по всем значениям типа решающего атрибута foreach (var value in attributeType.Values) { var cArr = new Tuple<AttributeValue, List<LearnableExample>, List<LearnableExample>>( new AttributeValue(attributeType, value), new List<LearnableExample>(), new List<LearnableExample>()); CArr.Add(cArr);
// цикл по всем обучающим примерам foreach (var example in learningExamples) { // если очередное значение типа решающего атрибута эквивалентно значению решающего атрибута очереднеого примера if (value.Equals(example.DecisiveAttribute.Value)) { cArr.Item2.Add(example); } else { cArr.Item3.Add(example); } }
Random random = new Random(); int nextSeed = 0;
// пока есть примеры в POS while (cArr.Item2.Count > 0) { List<LearnableExample> NEG = new List<LearnableExample>(cArr.Item3);
nextSeed = isRandom? random.Next(0, cArr.Item2.Count - 1): nextSeed; if (isRandom) { nextSeed = random.Next(0, cArr.Item2.Count - 1); }
LearnableExample SEED = cArr.Item2[nextSeed];
if (!isRandom) { nextSeed++; }
Expression STAR = new Expression(Operation.Con);
bool isStarCoversNEG = true;
int nextNeg = 0;
// todo обработать ситуацию бесконечного цикла // пока условия STAR покрывают NEG (cArr.Item3) while (isStarCoversNEG) { if (isRandom) { nextNeg = random.Next(0, NEG.Count - 1); }
if (nextNeg >= NEG.Count) { nextSeed = 0; break; }
LearnableExample Eneg = NEG[nextNeg];
if (!isRandom) { nextNeg++; }
Expression EXTENSION = new Expression(Operation.Con);
for (int i = 0; i < SEED.PredictiveAttributes.Count; i ++) { if (!SEED.PredictiveAttributes[i].Equals(Eneg.PredictiveAttributes[i]) && EXTENSION.Members.Count < heapSize) { EXTENSION.AddMember(new Expression(Operation.Dis, new List<IExpressionMember>() { SEED.PredictiveAttributes[i] /*, new Expression(Operation.Neg, Eneg.PredictiveAttributes[i])*/ })); } }
if (!STAR.Members.Contains(EXTENSION)) { STAR.AddMember(EXTENSION); } NEG.Remove(Eneg);
bool needBreak = true; foreach (var example in NEG) { if (STAR.IsCover(example)) { needBreak = false; break; } } if (needBreak) { break; } }
// todo удалить дублирующие устолия STAR
List<Tuple<IExpressionMember, int>> starExpressions = new List<Tuple<IExpressionMember, int>>(); foreach (var starExpression in STAR.Members) { int coveredExamplesCount = 0; foreach (var example in cArr.Item2) { if (starExpression.IsCover(example)) { coveredExamplesCount++; } } starExpressions.Add(new Tuple<IExpressionMember, int>(starExpression, coveredExamplesCount)); }
// сортировка по возрастанию полезности starExpressions = starExpressions.OrderBy(starExpression => starExpression.Item2).ToList();
if (STAR.Members.Count > starSize) { for (int i = 0; STAR.Members.Count > starSize; i ++) { STAR.Members.Remove(starExpressions[i].Item1); } }
IExpressionMember BEST = starExpressions.Last().Item1; //COVER.AddMember(BEST); _cover.Add(new ProductionRule(BEST, cArr.Item1)); for (int i = 0; i < cArr.Item2.Count; i ++) { if (BEST.IsCover(cArr.Item2[i])) { cArr.Item2.RemoveAt(i); i--; } } } } }
/// <summary> /// Производит обучение по аргументированным примерам. /// </summary> /// <param name="learningExamples"></param> /// <param name="starSize"></param> /// <param name="heapSize"></param> /// <param name="isRandom"></param> public void Learn(List<ArguedLearnableExample> learningExamples, int starSize = 3, int heapSize = 3, bool isRandom = false) { Learn(new List<LearnableExample>(learningExamples), starSize, heapSize, isRandom);
_arguedCover = new List<Tuple<ProductionRule, ArguedLearnableExample>>();
foreach (var arguedLearnableExample in learningExamples) { foreach (var productionRule in _cover) { if (_arguedCover.Select(rule => rule.Item1).ToList().Contains(productionRule)) { continue; }
if (productionRule.Condition.IsCover(arguedLearnableExample)) { bool hasBecause = false; foreach (var expressionMember in arguedLearnableExample.BecauseExpression.Members) { Expression productionRuleExpression = productionRule.Condition as Expression; if (productionRuleExpression == null) { continue; }
foreach (var member in productionRuleExpression.Members) { AttributeValue value = member as AttributeValue; if (value == null) { Expression expression = member as Expression; if (expression!= null && expression.Members.Count == 1) { value = expression.Members.First() as AttributeValue; if (value == null) { continue; } } else { continue; } }
if (value.Equals(expressionMember)) { hasBecause = true; break; } } if (hasBecause) { break; } } if (!hasBecause) { continue; }
if (arguedLearnableExample.DespiteExpression!= null) { bool hasDespite = false; foreach (var expressionMember in arguedLearnableExample.DespiteExpression.Members) { Expression productionRuleExpression = productionRule.Condition as Expression; if (productionRuleExpression == null) { continue; }
foreach (var member in productionRuleExpression.Members) { AttributeValue value = member as AttributeValue; if (value == null) { Expression expression = member as Expression; if (expression!= null & expression.Members.Count == 1) { value = expression.Members.First() as AttributeValue; if (value == null) { continue; } } else { continue; } }
if (value.Equals(expressionMember)) { hasDespite = true; break; } } if (hasDespite) { break; } } if (hasDespite) { continue; } }
_arguedCover.Add(new Tuple<ProductionRule, ArguedLearnableExample>(productionRule, arguedLearnableExample)); } } } }
/// <summary> /// Производит экзамен. /// </summary> /// <param name="examineExamples"></param> /// <returns></returns> public List<Tuple<ExaminableExample, ProductionRule>> Examine(List<ExaminableExample> examineExamples) { // подготовка к экзамену
// сипсок записей вида "экзаменуемый пример", "предсказываемое значение экзаменуемого примера" List<Tuple<ExaminableExample, List<ProductionRule>>> extendedExaminedExamples = new List<Tuple<ExaminableExample, List<ProductionRule>>>(); foreach (var examineExample in examineExamples) { extendedExaminedExamples.Add( new Tuple<ExaminableExample, List<ProductionRule>>(new ExaminableExample(examineExample), new List<ProductionRule>())); }
// список записей вида "продукционное правило из COVER", "количество примеров, покрываемых продукционным правилом из COVER" List<Tuple<ProductionRule, int>> extendedCover = new List<Tuple<ProductionRule, int>>(); foreach ( var productionRule in (_arguedCover == null)? _cover: _arguedCover.Select(arguedCover => arguedCover.Item1)) { int coveredRulesCount = 0; foreach (var examineExample in examineExamples) { if (productionRule.Condition.IsCover(examineExample)) { coveredRulesCount ++; } } extendedCover.Add(new Tuple<ProductionRule, int>(productionRule, coveredRulesCount)); }
// поиск значения по умолчанию
List<Tuple<AttributeValue, int>> resultValuesRating = new List<Tuple<AttributeValue, int>>(); foreach (var value in examineExamples[0].DecisiveAttribute.Type.Values) { int rating = 0;
foreach (var examineExample in examineExamples) { if (value == examineExample.DecisiveAttribute.Value) { rating++; } }
resultValuesRating.Add( new Tuple<AttributeValue, int>( new AttributeValue(examineExamples[0].DecisiveAttribute.Type, value), rating)); }
resultValuesRating = resultValuesRating.OrderByDescending(tuple => tuple.Item2).ToList();
// определение правила по умолчанию
List<AttributeValue> defaultAttributeTypes = new List<AttributeValue>(); int defaultQ = 0;
var decisiveAttributeType = examineExamples.First().DecisiveAttribute.Type; foreach (var value in decisiveAttributeType.Values) { int q = 0; foreach (var example in examineExamples) { if (value.Equals(example.DecisiveAttribute.Value)) { q++; } }
if (defaultAttributeTypes.Count == 0) { defaultAttributeTypes.Add(new AttributeValue(decisiveAttributeType, value)); defaultQ = q; continue; }
if (q == defaultQ) { defaultAttributeTypes.Add(new AttributeValue(decisiveAttributeType, value)); continue; }
if (q > defaultQ) { defaultAttributeTypes.Clear(); defaultAttributeTypes.Add(new AttributeValue(decisiveAttributeType, value)); defaultQ = q; continue; } }
// проведение экзамена
foreach (var examinedExample in extendedExaminedExamples) { foreach (var extendedRule in extendedCover) { if (extendedRule.Item1.Condition.IsCover(examinedExample.Item1)) { examinedExample.Item2.Add(extendedRule.Item1); } }
// если ни одно продукционное правило из COVER не покрывает очередной экзаменуемый пример if (examinedExample.Item2.Count == 0) { examinedExample.Item1.ExaminedAttribute = resultValuesRating[0].Item1; examinedExample.Item2.Clear(); examinedExample.Item2.Add(new ProductionRule(defaultAttributeTypes.First(), examinedExample.Item1.DecisiveAttribute) {IsDefault = true});
continue; }
// если одно продукционное правило из COVER покрывает очередной экзаменуемый пример if (examinedExample.Item2.Count == 1) { examinedExample.Item1.ExaminedAttribute = examinedExample.Item2[0].Result; continue; }
// если несколько продукционных правил из COVER покрывают очередной экзаменуемый пример if (examinedExample.Item2.Count > 1) { Tuple<ProductionRule, int> bestProductionRule = extendedCover[0]; for (int i = 1; i < extendedCover.Count; i ++) { if (extendedCover[i].Item2 > bestProductionRule.Item2 && examinedExample.Item2.Contains(extendedCover[i].Item1)) { bestProductionRule = extendedCover[i]; } } examinedExample.Item1.ExaminedAttribute = bestProductionRule.Item1.Result; examinedExample.Item2.Clear(); examinedExample.Item2.Add(bestProductionRule.Item1); continue; } }
// ccre is count of correctly recognized examples double ccre = 0;
List<Tuple<ExaminableExample, ProductionRule>> examinedExamples = new List<Tuple<ExaminableExample, ProductionRule>>(); foreach (var extendedExaminedExample in extendedExaminedExamples) { examinedExamples.Add(new Tuple<ExaminableExample, ProductionRule>(extendedExaminedExample.Item1, extendedExaminedExample.Item2.First())); if ( extendedExaminedExample.Item1.DecisiveAttribute.Value.Equals( extendedExaminedExample.Item1.ExaminedAttribute.Value)) { ccre ++; } }
_pcre = ccre/examinedExamples.Count;
return examinedExamples; } } }
|
||||
Последнее изменение этой страницы: 2016-08-10; просмотров: 169; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.131.13.24 (0.006 с.) |