コード例 #1
0
ファイル: GWNeuralNetwork.cs プロジェクト: dtklinh/CRFTool
        public GWNeuralNetwork(List <NeuralNetworkInputNode <InputData> > inputNodes, int[] innerLayers)
        {
            Graph            = new GWGraph <NeuralNetworkNodeData, NeuralNetworkEdgeData, GWNeuralNetwork <InputData> >();
            Graph.GraphStyle = GraphStyle.Directed;

            InputNodes = inputNodes.ToList();

            // init layers
            Layers = new List <GWNode <NeuralNetworkNodeData, NeuralNetworkEdgeData, GWNeuralNetwork <InputData> > > [innerLayers.Length + 2];
            for (int layer = 0; layer < Layers.Length; layer++)
            {
                Layers[layer] = new List <GWNode <NeuralNetworkNodeData, NeuralNetworkEdgeData, GWNeuralNetwork <InputData> > >();
            }

            //inputLayer:
            for (int i = 0; i < InputNodes.Count; i++)
            {
                var node = Graph.CreateNode();
                node.Data = InputNodes[i];
                Layers[0].Add(node);
            }

            //create inner layers
            var random      = new Random();
            int defConnects = 4;

            for (int layer = 1; layer <= innerLayers.Length; layer++)
            {
                Layers[layer] = new List <GWNode <NeuralNetworkNodeData, NeuralNetworkEdgeData, GWNeuralNetwork <InputData> > >();
                for (int i = 0; i < innerLayers[layer - 1]; i++)
                {
                    var node = Graph.CreateNode();
                    node.Data = new NeuralNetworkNodeData();

                    //connect with former layer
                    for (int k = 0; k < defConnects; k++)
                    {
                        var otherNode = Layers[layer - 1].RandomElement(random);
                        var edge      = Graph.CreateEdge(otherNode, node);
                        edge.Data        = new NeuralNetworkEdgeData();
                        edge.Data.Weight = random.NextDouble();
                    }

                    Layers[layer].Add(node);
                }
            }

            //create endingPoint
            var endnode = Graph.CreateNode();

            endnode.Data = new NeuralNetworkNodeData();
            for (int i = 0; i < Layers[Layers.Length - 2].Count; i++)
            {
                var edge = Graph.CreateEdge(Layers[Layers.Length - 2][i], endnode);
                edge.Data        = new NeuralNetworkEdgeData();
                edge.Data.Weight = random.NextDouble();
            }
            Layers[Layers.Length - 1].Add(endnode);
        }
コード例 #2
0
 private static void SetEdgeMaxDiffValues(GWGraph <CRFNodeData, CRFEdgeData, CRFGraphData> crfGraph)
 {
     foreach (var edge in crfGraph.Edges)
     {
         edge.Data.MaxZellnerScore  = edge.Head.Data.Characteristics[0] >= edge.Foot.Data.Characteristics[0] ? edge.Head.Data.Characteristics[0] : edge.Foot.Data.Characteristics[0];
         edge.Data.DiffZellnerScore = Math.Abs((edge.Head.Data.Characteristics[0] - edge.Foot.Data.Characteristics[0]));
     }
 }
コード例 #3
0
        public static void assignedLabeling(GWGraph <ICRFNodeData, ICRFEdgeData, ICRFGraphData> cloneGraph)
        {
            // Aufruf der Inferenz-Heuristik
            int numberOfLabels = 2;
            int bufferSize     = 200;
            var request        = new SolveInference(cloneGraph, numberOfLabels, bufferSize);

            request.RequestInDefaultContext();

            cloneGraph.Data.AssginedLabeling = request.Solution.Labeling;
        }
コード例 #4
0
 public OLMEvaluationGraphResult(GWGraph <CRFNodeData, CRFEdgeData, CRFGraphData> graph, int[] prediction, int tp, int tn, int fp, int fn, double sensitivity, double specificity, double mcc, double accuracy)
 {
     Graph       = graph;
     Prediction  = prediction;
     TP          = tp;
     TN          = tn;
     FP          = fp;
     FN          = fn;
     Sensitivity = sensitivity;
     Specificity = specificity;
     MCC         = mcc;
     Accuracy    = accuracy;
 }
コード例 #5
0
ファイル: CRFInput.cs プロジェクト: MarlonWelter/CRFTool
        public static GWGraph <SGLNodeData, SGLEdgeData, SGLGraphData> ParseFile_CRF_Class(string file)
        {
            var graph = new GWGraph <SGLNodeData, SGLEdgeData, SGLGraphData>();

            graph.Data = new SGLGraphData();

            using (var reader = new StreamReader(file))
            {
                //if (reader.ReadLine() != "reflabels:")
                //    throw new IOException("unbekanntes FileFormat - File sollte mit 'numlabels:' beginnen");
                //int refLabels = int.Parse(reader.ReadLine());
                //if (reader.ReadLine() != "observations:")
                //    throw new IOException("unbekanntes FileFormat - File sollte mit 'numlabels:' beginnen");
                //int observations = int.Parse(reader.ReadLine());

                if (reader.ReadLine() != "nodes:")
                {
                    throw new IOException("unbekanntes FileFormat - File sollte 'nodes:' in Zeile 3 enthalten");
                }

                string line = string.Empty;
                while ((line = reader.ReadLine()) != "edges:" && line.NotNullOrEmpty())
                {
                    string[] words  = Regex.Split(line, "\\s");
                    var      node   = graph.CreateNode();
                    var      scores = new List <double>();
                    node.Data = new SGLNodeData();
                    node.Data.ReferenceLabel = int.Parse(words[1]);
                    node.Data.Observation    = int.Parse(words[2]);

                    if (words.Length > 3)
                    {
                        node.Data.AssignedLabel = int.Parse(words[3]);
                    }

                    node.Data.Id = words[0];
                }
                while ((line = reader.ReadLine()).NotNullOrEmpty())
                {
                    string[] words = Regex.Split(line, "\\s");
                    string   name  = words[0] + "_" + words[1];
                    string   check = words[1] + "_" + words[0];

                    var edge = graph.CreateEdge(graph.Nodes.First((n) => n.Data.Id.Equals(words[0])), graph.Nodes.First((n) => n.Data.Id.Equals(words[1])));

                    edge.Data = new SGLEdgeData();
                }
            }
            return(graph);
        }
コード例 #6
0
ファイル: CRFInput.cs プロジェクト: MarlonWelter/CRFTool
        //Davids files
        public static GWGraph <ICRFNodeData, ICRFEdgeData, ICRFGraphData> ParseFileFormatThree(string file)
        {
            var graph = new GWGraph <ICRFNodeData, ICRFEdgeData, ICRFGraphData>();

            var edgeMode = false;
            int CountAdd = 0;

            using (var reader = new StreamReader(file))
            {
                string line = string.Empty;
                while ((line = reader.ReadLine()) != null)
                {
                    if (line.Equals("NODES"))
                    {
                        reader.ReadLine();
                        edgeMode = false;
                    }
                    else if (line.Equals("EDGES"))
                    {
                        reader.ReadLine();
                        edgeMode = true;
                    }
                    else if (!edgeMode)
                    {
                        string[] words  = Regex.Split(line, ";");
                        var      node   = graph.CreateNode();
                        var      scoreI = int.Parse(words[1]);
                        var      scoreN = int.Parse(words[2]);
                        var      scores = new List <double>();
                        scores.AddRange(scoreN + CountAdd, scoreI + CountAdd);
                        graph.Nodes.Add(node);
                        node.Data.Scores         = scores.ToArray();
                        node.Data.Id             = words[0];
                        node.Data.ReferenceLabel = (words[3].Equals("N")) ? 0 : 1;
                    }
                    else
                    {
                        string[] words  = Regex.Split(line, ";");
                        var      headId = words[0];
                        var      footId = words[1];
                        var      head   = graph.Nodes.First(n => n.Data.Id.Equals(headId));
                        var      foot   = graph.Nodes.First(n => n.Data.Id.Equals(footId));

                        var edge = new GWEdge <ICRFNodeData, ICRFEdgeData, ICRFGraphData>(head, foot);
                        graph.Edges.Add(edge);
                    }
                }
            }
            return(graph);
        }
コード例 #7
0
        // delete graph
        public static void randomLabeling(GWGraph <ICRFNodeData, ICRFEdgeData, ICRFGraphData> cloneGraph)
        {
            int count = cloneGraph.Data.ReferenceLabeling.Count();

            int[] label = new int[count];

            for (int j = 0; j < count; j++)
            {
                int l = rdm.Next(0, 2);
                label[j] = l;
                //Console.Write(label[i]);
            }

            cloneGraph.Data.ReferenceLabeling = label;
        }
コード例 #8
0
 public TrainingEvaluationCycleInputParameters(GWGraph <CRFNodeData, CRFEdgeData, CRFGraphData> graph,
                                               int numberOfGraphInstances, int numberOfSeedsForPatchCreation, int maximumTotalPatchSize,
                                               List <OLMVariant> trainingVariantsToTest, double isingConformityParameter, double isingCorrelationParameter,
                                               double[,] transitionProbabilities, int numberOfLabels, int bufferSizeViterbi)
 {
     Graph = graph;
     NumberOfGraphInstances        = numberOfGraphInstances;
     NumberOfSeedsForPatchCreation = numberOfSeedsForPatchCreation;
     MaximumTotalPatchSize         = maximumTotalPatchSize;
     TrainingVariantsToTest        = trainingVariantsToTest;
     IsingConformityParameter      = isingConformityParameter;
     IsingCorrelationParameter     = isingCorrelationParameter;
     TransitionProbabilities       = transitionProbabilities;
     NumberOfLabels    = numberOfLabels;
     BufferSizeViterbi = bufferSizeViterbi;
 }
コード例 #9
0
ファイル: ComputeKeys.cs プロジェクト: dtklinh/CRFTool
        public OLMEvaluationGraphResult computeEvalutionGraphResult(GWGraph <CRFNodeData, CRFEdgeData, CRFGraphData> graph,
                                                                    int[] predicitionLabeling)
        {
            double sensitivity = 0.0, specificity = 0.0, mcc = 0.0, accuracy = 0.0;

            int[] referenceLabel = graph.Data.ReferenceLabeling;

            // für jeden graphen: true positives / false positives / true negatives / fn   || 0: negative 1: positive
            int[] tps = computeClassification(referenceLabel, predicitionLabeling);
            int   tp = tps[0], tn = tps[1], fp = tps[2], fn = tps[3];

            // Sensitivität / Spezifität / MCC Matthew Correlation Coefficient
            sensitivity = computeTPR(tp, fn);
            specificity = computeSPC(tn, fp);
            mcc         = computeMCC(tp, tn, fp, fn);
            accuracy    = computeAcc(tp, tn, fp, fn);

            OLMEvaluationGraphResult result = new OLMEvaluationGraphResult(graph, predicitionLabeling, tp, tn, fp, fn, sensitivity, specificity, mcc, accuracy);

            return(result);
        }
コード例 #10
0
        private static void startTestCycle()
        {
            // erzeugt die RequestListener
            Build.Do();

            // einfache Graphen erzeugen (12 clone)
            //var graph = CreateGraphs.createGraph_Grid2D();
            var pdbFile      = PDBExt.Parse(RandomlySelectedPDBFile);
            var proteinGraph = CreateProteinGraph.Do(pdbFile, 6.0, ResidueNodeCenterDefinition.CAlpha).Values.First();
            IGWGraph <ICRFNodeData, ICRFEdgeData, ICRFGraphData> crfGraph = proteinGraph.Convert(nd => new CRFNodeData(nd.Data.Residue.Id), ed => new CRFEdgeData(), gd => new CRFGraphData());

            // seeding

            // 12 clone erzeugen
            var clone = new GWGraph <ICRFNodeData, ICRFEdgeData, ICRFGraphData> [clones];

            for (int i = 0; i < clones; i++)
            {
                var cloneGraph = crfGraph.Clone(ConvertData.convertNodeData, ConvertData.convertEdgeData, ConvertData.convertGraphData);

                // für jeden graphen (clone): Erzeugung eines Labelings (rdm) => als int[]
                Labeling.randomLabeling(cloneGraph);
                Labeling.assignedLabeling(cloneGraph);

                clone[i] = cloneGraph;
            }

            // calculation of tp, fp, tn, fn, sensitivity, specificity, mcc
            double[][] keysForAllClones = new double[clones][];
            for (int i = 0; i < clones; i++)
            {
                double[] keys = Compute.computeKeys(crfGraph, clone, i);
                keysForAllClones[i] = keys;
            }

            // test
            //outputKeys(keysForAllClones);
            outputLabelingsScores(clone);
        }
コード例 #11
0
ファイル: IProteinGraph.cs プロジェクト: dtklinh/CRFTool
        public static GWGraph <ICRFNodeData, ICRFEdgeData, ICRFGraphData> CreateGraph(this ProteinGraph graph, IDictionary <ResidueNodeData, double[]> nodescores, IDictionary <SimpleEdgeData, double[, ]> edgescores)
        {
            var clonegraph = new GWGraph <ICRFNodeData, ICRFEdgeData, ICRFGraphData>();

            foreach (var node in graph.Nodes)
            {
                var clone = clonegraph.CreateNode();
                clone.Data = new CRFNodeData()
                {
                    Id = node.Data.Residue.Id, Scores = nodescores[node.Data]
                };
                clonegraph.Nodes.Add(clone);
            }
            foreach (var edge in graph.Edges)
            {
                var newEdge = new GWEdge <ICRFNodeData, ICRFEdgeData, ICRFGraphData>(clonegraph.Nodes.First(n => n.Data.Id.Equals(edge.Head.Data.Residue.Id)),
                                                                                     clonegraph.Nodes.First(n => n.Data.Id.Equals(edge.Foot.Data.Residue.Id)));
                newEdge.Data        = new CRFEdgeData();
                newEdge.Data.Scores = edgescores[edge.Data];
                clonegraph.Edges.Add(newEdge);
            }

            return(clonegraph);
        }
コード例 #12
0
        public void DoMCMCStyle(GWGraph <CRFNode3DInfo, CRFEdge3DInfo, Graph3DInfo> graph, int steps, double ChangePenalty)
        {
            var rdm = new Random();

            int[] stateMap     = new int[graph.Nodes.Count()];
            int[] stateCounts  = new int[stateMap.Length];
            int   numberStates = stateMap.Length;


            foreach (var node in graph.Nodes)
            {
                node.Data.ClusterId     = node.GraphId;
                node.Data.CurrentState  = node.GraphId;
                node.Data.LastUpdate    = 0;
                node.Data.InStateCounts = new int[numberStates];
                node.Data.StateScores   = new double[numberStates];
                for (int st = 0; st < numberStates; st++)
                {
                    node.Data.StateScores[st] = 1.0 / numberStates;
                }
            }
            foreach (var edge in graph.Edges)
            {
                edge.Data.StateScores = new double[numberStates, numberStates];
                for (int st1 = 0; st1 < numberStates; st1++)
                {
                    for (int st2 = 0; st2 < numberStates; st2++)
                    {
                        if (st1 == st2)
                        {
                            edge.Data.StateScores[st1, st2] = 1.0;
                        }
                        else
                        {
                            edge.Data.StateScores[st1, st2] = ChangePenalty;
                        }
                    }
                }
            }

            for (int i = 0; i < stateMap.Length; i++)
            {
                stateMap[i]    = i;
                stateCounts[i] = 1;
            }

            var nodes = graph.Nodes.ToList().RemoveWhere(n => !n.Neighbours.Any()).ToList();

            for (int step = 1; step <= steps; step++)
            {
                var selectedNode = nodes[rdm.Next(nodes.Count)];

                var possibleNewState = rdm.Next(numberStates);
                var oldState         = selectedNode.Data.CurrentState;
                if (possibleNewState == oldState)
                {
                    continue;
                }

                var oldScore = 1.0;
                oldScore *= selectedNode.Data.StateScores[selectedNode.Data.CurrentState];
                foreach (var edge in selectedNode.Edges)
                {
                    oldScore *= edge.Data.StateScores[edge.Head.Data.CurrentState, edge.Foot.Data.CurrentState];
                }
                selectedNode.Data.CurrentState = possibleNewState;
                var newScore = 1.0;
                oldScore *= selectedNode.Data.StateScores[selectedNode.Data.CurrentState];
                foreach (var edge in selectedNode.Edges)
                {
                    newScore *= edge.Data.StateScores[edge.Head.Data.CurrentState, edge.Foot.Data.CurrentState];
                }


                if (rdm.NextDouble() < oldScore / (newScore + oldScore))
                {
                    selectedNode.Data.CurrentState = oldState;
                }

                selectedNode.Data.InStateCounts[selectedNode.Data.CurrentState] += step - selectedNode.Data.LastUpdate;
                selectedNode.Data.LastUpdate = step;

                if (step % 250 == 0)
                {
                    foreach (var node in nodes)
                    {
                        node.Data.ClusterId = node.Data.InStateCounts.MaxEntry(st => st);
                    }
                    Thread.Sleep(100);
                }
            }

            foreach (var node in nodes)
            {
                node.Data.ClusterId = node.Data.InStateCounts.MaxEntry(st => st);
            }
        }
コード例 #13
0
        //public void Do(GWGraph<Node3DWrap<NodeData>, EdgeData, GraphData> graph)
        //{
        //    var rdm = new Random();
        //    int[] clusterMap = new int[graph.Nodes.Count()];
        //    int[] clusterCounts = new int[clusterMap.Length];


        //    foreach (var node in graph.Nodes)
        //    {
        //        node.Data.ClusterId = node.GraphId;
        //    }

        //    for (int i = 0; i < clusterMap.Length; i++)
        //    {
        //        clusterMap[i] = i;
        //        clusterCounts[i] = 1;
        //    }

        //    var totalPossibleEdges = (clusterMap.Length * (clusterMap.Length - 1)) / 2;
        //    var ClusterEdges = 0.0;
        //    var clusterEdgesPossible = 0.0;
        //    var otherEdges = 0.0;
        //    var totalOtherEdges = 0.0;
        //    foreach (var edge in graph.Edges)
        //    {
        //        if (clusterMap[edge.Foot.GraphId] == clusterMap[edge.Head.GraphId])
        //        {
        //            ClusterEdges++;
        //        }
        //        else
        //            otherEdges++;
        //    }

        //    for (int i = 0; i < clusterCounts.Length; i++)
        //    {
        //        clusterEdgesPossible += (clusterCounts[i] * (clusterCounts[i] - 1)) / 2;
        //    }
        //    totalOtherEdges = totalPossibleEdges - clusterEdgesPossible;

        //    var clusterEdgeProb = clusterEdgesPossible == 0 ? 0 : ClusterEdges / clusterEdgesPossible;
        //    var interClusterEdgesProb = otherEdges / totalOtherEdges;

        //    var score = clusterEdgeProb / interClusterEdgesProb;
        //    var nodes = graph.Nodes.ToList().RemoveWhere(n => !n.Neighbours.Any()).ToList();

        //    for (int step = 0; step < 100000; step++)
        //    {
        //        var selectedNode = nodes[rdm.Next(nodes.Count)];

        //        var possibleClusters = selectedNode.Neighbours.Select(nb => clusterMap[nb.GraphId]).ToList();
        //        if (possibleClusters.Count() == 1 && clusterMap[selectedNode.GraphId] == possibleClusters.First())
        //        {
        //            step--;
        //            continue;
        //        }

        //        var selectedCluster = 0;// possibleClusters[rdm.Next(possibleClusters.Count)];

        //        var clusterMappingScore = new Dictionary<int, double>();
        //        var tempScore = 0.0;

        //        foreach (var cluster in possibleClusters)
        //        {
        //            selectedCluster = cluster;
        //            //Preview Scores

        //            if (clusterMap[selectedNode.GraphId] == selectedCluster)
        //            {
        //                clusterMappingScore.Add(selectedCluster, score);
        //                continue;
        //            }

        //            var scoreLocal = 1.0;

        //            var changeClusterEdges = 0;
        //            foreach (var nb in selectedNode.Neighbours)
        //            {
        //                if (clusterMap[nb.GraphId] == clusterMap[selectedNode.GraphId])
        //                {
        //                    changeClusterEdges--;
        //                    scoreLocal *= 0.3;
        //                }
        //                else if (clusterMap[nb.GraphId] == selectedCluster)
        //                {
        //                    changeClusterEdges++;
        //                    scoreLocal *= 3.0;
        //                }
        //            }
        //            var changePossibleClusterEdges = 0;

        //            changePossibleClusterEdges -= clusterCounts[selectedNode.GraphId] > 1 ?
        //                (clusterCounts[selectedNode.GraphId] * (clusterCounts[selectedNode.GraphId] - 1)) / 2 - ((clusterCounts[selectedNode.GraphId] - 1) * (clusterCounts[selectedNode.GraphId] - 2)) / 2 : 0;

        //            changePossibleClusterEdges -= clusterCounts[selectedCluster] > 0 ?
        //                (clusterCounts[selectedCluster] * (clusterCounts[selectedCluster] - 1)) / 2 - ((clusterCounts[selectedCluster] + 1) * (clusterCounts[selectedCluster])) / 2 : 0;

        //            var clusterEdgeProbLocal = clusterEdgesPossible + changePossibleClusterEdges == 0 ? 0 : (ClusterEdges + changeClusterEdges) / (clusterEdgesPossible + changePossibleClusterEdges);
        //            var interClusterEdgesProbLocal = (otherEdges - changeClusterEdges) / totalOtherEdges;

        //            //var scoreLocal = Math.Max(0, changeClusterEdges); //(clusterEdgeProbLocal / interClusterEdgesProbLocal, 2);

        //            clusterMappingScore.Add(selectedCluster, scoreLocal);
        //            tempScore += scoreLocal;
        //        }



        //        //execute best score
        //        selectedCluster = clusterMappingScore.ChooseByDistributionNormalize(); // clusterMappingScore.First(kvp => kvp.Value == clusterMappingScore.Values.Max()).Key;

        //        if (clusterMap[selectedNode.GraphId] == selectedCluster)
        //        {
        //            continue;
        //        }

        //        var temp = step;

        //        var changeClusterEdges2 = 0;
        //        foreach (var nb in selectedNode.Neighbours)
        //        {
        //            if (clusterMap[nb.GraphId] == clusterMap[selectedNode.GraphId])
        //                changeClusterEdges2--;
        //            else if (clusterMap[nb.GraphId] == selectedCluster)
        //                changeClusterEdges2++;
        //        }
        //        var changePossibleClusterEdges2 = 0;

        //        changePossibleClusterEdges2 -= clusterCounts[selectedNode.GraphId] > 1 ?
        //            (clusterCounts[selectedNode.GraphId] * (clusterCounts[selectedNode.GraphId] - 1)) / 2 - ((clusterCounts[selectedNode.GraphId] - 1) * (clusterCounts[selectedNode.GraphId] - 2)) / 2 : 0;

        //        changePossibleClusterEdges2 -= clusterCounts[selectedCluster] > 0 ?
        //            (clusterCounts[selectedCluster] * (clusterCounts[selectedCluster] - 1)) / 2 - ((clusterCounts[selectedCluster] + 1) * (clusterCounts[selectedCluster])) / 2 : 0;

        //        var clusterEdgeProbLocal2 = clusterEdgesPossible + changePossibleClusterEdges2 == 0 ? 0 : (ClusterEdges + changeClusterEdges2) / (clusterEdgesPossible + changePossibleClusterEdges2);
        //        var interClusterEdgesProbLocal2 = (otherEdges - changeClusterEdges2) / totalOtherEdges;

        //        var scoreLocal2 = clusterEdgeProbLocal2 / interClusterEdgesProbLocal2;

        //        score = scoreLocal2;
        //        ClusterEdges += changeClusterEdges2;
        //        clusterEdgesPossible += changePossibleClusterEdges2;
        //        otherEdges -= changeClusterEdges2;
        //        selectedNode.Data.ClusterId = selectedCluster;
        //        clusterCounts[clusterMap[selectedNode.GraphId]]--;
        //        clusterCounts[selectedCluster]++;
        //        clusterMap[selectedNode.GraphId] = selectedCluster;

        //        Thread.Sleep(10);
        //    }
        //}
        public void Do(GWGraph <Node3DWrap <NodeData>, Edge3DWrap <EdgeData>, GraphData> graph)
        {
            var rdm = new Random();

            int[] clusterMap    = new int[graph.Nodes.Count()];
            int[] clusterCounts = new int[clusterMap.Length];


            foreach (var node in graph.Nodes)
            {
                node.Data.ClusterId = node.GraphId;
            }

            for (int i = 0; i < clusterMap.Length; i++)
            {
                clusterMap[i]    = i;
                clusterCounts[i] = 1;
            }

            var totalPossibleEdges   = (clusterMap.Length * (clusterMap.Length - 1)) / 2;
            var ClusterEdges         = 0.0;
            var clusterEdgesPossible = 0.0;
            var otherEdges           = 0.0;
            var totalOtherEdges      = 0.0;

            foreach (var edge in graph.Edges)
            {
                if (clusterMap[edge.Foot.GraphId] == clusterMap[edge.Head.GraphId])
                {
                    ClusterEdges++;
                }
                else
                {
                    otherEdges++;
                }
            }

            for (int i = 0; i < clusterCounts.Length; i++)
            {
                clusterEdgesPossible += (clusterCounts[i] * (clusterCounts[i] - 1)) / 2;
            }
            totalOtherEdges = totalPossibleEdges - clusterEdgesPossible;

            var clusterEdgeProb       = clusterEdgesPossible == 0 ? 0 : ClusterEdges / clusterEdgesPossible;
            var interClusterEdgesProb = otherEdges / totalOtherEdges;

            var score = clusterEdgeProb / interClusterEdgesProb;
            var nodes = graph.Nodes.ToList().RemoveWhere(n => !n.Neighbours.Any()).ToList();

            for (int step = 0; step < 100000; step++)
            {
                var selectedNode = nodes[rdm.Next(nodes.Count)];

                var possibleClusters = selectedNode.Neighbours.Select(nb => clusterMap[nb.GraphId]).Distinct().ToList();
                if (possibleClusters.Count() == 1 && clusterMap[selectedNode.GraphId] == possibleClusters.First())
                {
                    step--;
                    continue;
                }

                var selectedCluster = 0;// possibleClusters[rdm.Next(possibleClusters.Count)];

                var clusterMappingScore = new Dictionary <int, double>();
                var tempScore           = 0.0;

                foreach (var cluster in possibleClusters)
                {
                    selectedCluster = cluster;
                    //Preview Scores

                    if (clusterMap[selectedNode.GraphId] == selectedCluster)
                    {
                        clusterMappingScore.Add(selectedCluster, score);
                        continue;
                    }

                    var scoreLocal = 1.0;

                    var changeClusterEdges = 0;
                    foreach (var nb in selectedNode.Neighbours)
                    {
                        if (clusterMap[nb.GraphId] == clusterMap[selectedNode.GraphId])
                        {
                            changeClusterEdges--;
                            scoreLocal *= 0.3;
                        }
                        else if (clusterMap[nb.GraphId] == selectedCluster)
                        {
                            changeClusterEdges++;
                            scoreLocal *= 3.0;
                        }
                    }
                    var changePossibleClusterEdges = 0;

                    changePossibleClusterEdges -= clusterCounts[selectedNode.GraphId] > 1 ?
                                                  (clusterCounts[selectedNode.GraphId] * (clusterCounts[selectedNode.GraphId] - 1)) / 2 - ((clusterCounts[selectedNode.GraphId] - 1) * (clusterCounts[selectedNode.GraphId] - 2)) / 2 : 0;

                    changePossibleClusterEdges -= clusterCounts[selectedCluster] > 0 ?
                                                  (clusterCounts[selectedCluster] * (clusterCounts[selectedCluster] - 1)) / 2 - ((clusterCounts[selectedCluster] + 1) * (clusterCounts[selectedCluster])) / 2 : 0;

                    var clusterEdgeProbLocal       = clusterEdgesPossible + changePossibleClusterEdges == 0 ? 0 : (ClusterEdges + changeClusterEdges) / (clusterEdgesPossible + changePossibleClusterEdges);
                    var interClusterEdgesProbLocal = (otherEdges - changeClusterEdges) / totalOtherEdges;

                    //var scoreLocal = Math.Max(0, changeClusterEdges); //(clusterEdgeProbLocal / interClusterEdgesProbLocal, 2);

                    clusterMappingScore.Add(selectedCluster, scoreLocal);
                    tempScore += scoreLocal;
                }



                //execute best score
                selectedCluster = clusterMappingScore.ChooseByDistributionNormalize(); // clusterMappingScore.First(kvp => kvp.Value == clusterMappingScore.Values.Max()).Key;

                if (clusterMap[selectedNode.GraphId] == selectedCluster)
                {
                    continue;
                }

                var temp = step;

                var changeClusterEdges2 = 0;
                foreach (var nb in selectedNode.Neighbours)
                {
                    if (clusterMap[nb.GraphId] == clusterMap[selectedNode.GraphId])
                    {
                        changeClusterEdges2--;
                    }
                    else if (clusterMap[nb.GraphId] == selectedCluster)
                    {
                        changeClusterEdges2++;
                    }
                }
                var changePossibleClusterEdges2 = 0;

                changePossibleClusterEdges2 -= clusterCounts[selectedNode.GraphId] > 1 ?
                                               (clusterCounts[selectedNode.GraphId] * (clusterCounts[selectedNode.GraphId] - 1)) / 2 - ((clusterCounts[selectedNode.GraphId] - 1) * (clusterCounts[selectedNode.GraphId] - 2)) / 2 : 0;

                changePossibleClusterEdges2 -= clusterCounts[selectedCluster] > 0 ?
                                               (clusterCounts[selectedCluster] * (clusterCounts[selectedCluster] - 1)) / 2 - ((clusterCounts[selectedCluster] + 1) * (clusterCounts[selectedCluster])) / 2 : 0;

                var clusterEdgeProbLocal2       = clusterEdgesPossible + changePossibleClusterEdges2 == 0 ? 0 : (ClusterEdges + changeClusterEdges2) / (clusterEdgesPossible + changePossibleClusterEdges2);
                var interClusterEdgesProbLocal2 = (otherEdges - changeClusterEdges2) / totalOtherEdges;

                var scoreLocal2 = clusterEdgeProbLocal2 / interClusterEdgesProbLocal2;

                score                       = scoreLocal2;
                ClusterEdges               += changeClusterEdges2;
                clusterEdgesPossible       += changePossibleClusterEdges2;
                otherEdges                 -= changeClusterEdges2;
                selectedNode.Data.ClusterId = selectedCluster;
                clusterCounts[clusterMap[selectedNode.GraphId]]--;
                clusterCounts[selectedCluster]++;
                clusterMap[selectedNode.GraphId] = selectedCluster;

                Thread.Sleep(10);
            }
        }
コード例 #14
0
ファイル: CRFInput.cs プロジェクト: MarlonWelter/CRFTool
        public static IGWGraph <ICRFNodeData, ICRFEdgeData, ICRFGraphData> ParseFileFormatTwo(string file)
        {
            var graph = new GWGraph <ICRFNodeData, ICRFEdgeData, ICRFGraphData>();

            using (var reader = new StreamReader(file))
            {
                string line = string.Empty;
                while ((line = reader.ReadLine()) != null)
                {
                    if (line.StartsWith("#"))
                    {
                        continue;
                    }
                    else if (line.StartsWith("NODE"))
                    {
                        string[] words  = Regex.Split(line, "\\s").Where(s => !string.IsNullOrWhiteSpace(s)).ToArray();
                        var      node   = graph.CreateNode();
                        var      scores = new List <double>();
                        for (int counter = 0; counter < 2; counter++)
                        {
                            try
                            {
                                scores.Add(double.Parse(words[counter + 5], CultureInfo.InvariantCulture));
                            }
                            catch (FormatException ex)
                            {
                                if (words[counter + 5].Equals("N_INF"))
                                {
                                    scores.Add(double.NegativeInfinity);
                                }
                                else
                                {
                                    throw ex;
                                }
                            }
                        }
                        graph.Nodes.Add(node);
                        node.Data                = new CRFNodeData();
                        node.Data.Scores         = scores.ToArray();
                        node.Data.Id             = words[1];
                        node.Data.ReferenceLabel = int.Parse(words[7]);
                    }
                    else if (line.StartsWith("NEIGH"))
                    {
                        string[] words = Regex.Split(line, "\\s").Where(s => !string.IsNullOrWhiteSpace(s)).ToArray();

                        var stringNode = words[1].Substring(0, words[1].Length - 1);

                        for (int nb = 2; nb < words.Length; nb++)
                        {
                            //Don't use the double occurence edges
                            if (stringNode.CompareTo(words[nb]) > 0)
                            {
                                continue;
                            }

                            var edge = new GWEdge <ICRFNodeData, ICRFEdgeData, ICRFGraphData>(graph.Nodes.First((n) => n.Data.Id.Equals(stringNode)), graph.Nodes.First((n) => n.Data.Id.Equals(words[nb])));
                            edge.Data = new CRFEdgeData();
                            graph.Edges.Add(edge);
                        }
                    }
                }
            }
            return(graph);
        }
コード例 #15
0
ファイル: CRFInput.cs プロジェクト: MarlonWelter/CRFTool
        public static IGWGraph <ICRFNodeData, ICRFEdgeData, ICRFGraphData> ParseFile(string file)
        {
            var graph = new GWGraph <ICRFNodeData, ICRFEdgeData, ICRFGraphData>();

            using (var reader = new StreamReader(file))
            {
                if (reader.ReadLine() != "numlabels:")
                {
                    throw new IOException("unbekanntes FileFormat - File sollte mit 'numlabels:' beginnen");
                }

                int numberLabels = int.Parse(reader.ReadLine());
                if (reader.ReadLine() != "nodes:")
                {
                    throw new IOException("unbekanntes FileFormat - File sollte 'nodes:' in Zeile 3 enthalten");
                }

                string line = string.Empty;
                while ((line = reader.ReadLine()) != "edges:")
                {
                    string[] words  = Regex.Split(line, "\\s");
                    var      node   = graph.CreateNode();
                    var      scores = new List <double>();
                    for (int counter = 1; counter < numberLabels + 1; counter++)
                    {
                        try
                        {
                            scores.Add(double.Parse(words[counter], CultureInfo.InvariantCulture));
                        }
                        catch (FormatException ex)
                        {
                            if (words[counter].Equals("N_INF"))
                            {
                                scores.Add(double.NegativeInfinity);
                            }
                            else
                            {
                                throw ex;
                            }
                        }
                    }
                    graph.Nodes.Add(node);
                    node.Data.Scores = scores.ToArray();
                    node.Data.Id     = words[0];
                }
                while ((line = reader.ReadLine()) != null)
                {
                    string[] words = Regex.Split(line, "\\s");
                    string   name  = words[0] + "_" + words[1];
                    string   check = words[1] + "_" + words[0];

                    //Don't use the double occurence edges
                    if (words[0].CompareTo(words[1]) > 0)
                    {
                        continue;
                    }

                    var edge = new GWEdge <ICRFNodeData, ICRFEdgeData, ICRFGraphData>(graph.Nodes.First((n) => n.Data.Id.Equals(words[0])), graph.Nodes.First((n) => n.Data.Id.Equals(words[1])));

                    graph.Edges.Add(edge);

                    edge.Data.Scores = new double[numberLabels, numberLabels];
                    int word = 2;
                    for (int dounter = 0; dounter < numberLabels; dounter++)
                    {
                        for (int counter = 0; counter < numberLabels; counter++)
                        {
                            edge.Data.Scores[dounter, counter] = (double.Parse(words[word], CultureInfo.InvariantCulture));
                            word++;
                        }
                    }
                }
            }
            return(graph);
        }