Example #1
0
        public void LearnParameters(DataMining.Data.Dataset dataset)
        {
            foreach (Variable variable in this._variables)
            {
                string desc = variable.ToString();
                variable.CPT = new ConditionalProbabilityTable(desc, variable.GetCTPSize());
                //if (cache.ContainsKey(desc))
                //    variable.CPT.LoadFormString(cache[desc]);
                //else
                //{

                if (variable.Parents == null)
                {
                    int rowIndex = 0;
                    DataMining.Data.Attribute attribute = dataset.Metadata.Target.Index == variable.Index ? dataset.Metadata.Target : dataset.Metadata.Attributes[variable.Index];

                    for (int valueIndex = 0; valueIndex < variable.Attribute.Values.Length; valueIndex++)
                    {
                        int indexExpression = valueIndex + 1;
                        int count           = attribute.ValueCounts[valueIndex];
                        variable.CPT.Set(rowIndex, indexExpression, count);
                        rowIndex++;
                    }
                }

                else
                {
                    List <int> attributeIndexes            = new List <int>();
                    DataMining.Data.Attribute[] attributes = new DataMining.Data.Attribute[variable.Parents.Count + 1];
                    attributes[0] = variable.Attribute;
                    attributeIndexes.Add(variable.Attribute.Index);

                    if (variable.Parents != null)
                    {
                        int i = 1;
                        foreach (Variable parent in variable.Parents)
                        {
                            attributes[i] = parent.Attribute;
                            attributeIndexes.Add(parent.Attribute.Index);
                            i++;
                        }
                    }

                    int[]       valuesPointers = new int[attributes.Length];
                    Stack <int> pointerStack   = new Stack <int>();

                    int rowIndex = 0;

                    bool stop = false;

                    while (true)
                    {
                        int indexExpression = variable.GetIndexExpression(valuesPointers.ToArray());
                        int count           = dataset.Filter(attributeIndexes, valuesPointers.ToList <int>()).Count;
                        variable.CPT.Set(rowIndex, indexExpression, count);
                        rowIndex++;

                        int attributePointer = valuesPointers.Length - 1;

                        while (true)
                        {
                            if (valuesPointers[attributePointer] == attributes[attributePointer].Values.Length - 1)
                            {
                                if (attributePointer == 0)
                                {
                                    stop = true;
                                    break;
                                }

                                valuesPointers[attributePointer] = 0;
                                attributePointer--;
                            }
                            else
                            {
                                valuesPointers[attributePointer]++;
                                break;
                            }
                        }

                        if (stop)
                        {
                            break;
                        }
                    }

                    //}

                    //cache[desc] = variable.CPT.ToString();
                }
            }
        }