Autor Beitrag
sebastian1234
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: Mi 05.03.14 13:37 
Hallo zusammen,
nachdem ich nun schon einiges entwickelt habe komme ich nun zum Kern meines Programms - der Clusteranalyse! Ich versuch mal kurz die Clusteranalyse anzusprechen, ich hoffe es ist verständlich =)…

Ausgangspunkt solle eine solche Matrix sein! (Array?!)

- / 1 / 2 / 3
1 / 0 / 10 / 20
2 / 10/ 0 / 30
3 / 20 / 30 / 0

1, 2, 3 stehen für die verschiedenen Unternehmen bzw. die Start-Cluster!

Die Aufgabe ist jetzt in der Matrix den geringsten Wert zu finden und diese Unternehmen bzw. Start-Cluster miteinander zu verschmelzen. Also im obigen Beispiel Unternehmen 1 und 2, weil 10 der geringste Wert ist!

Ausgabe in der Konsole sollte dann später ungefähr so aussehen: (Beispiel)
1.Schritt (also noch keine Verschmelzung durchgeführt sondern erstmal nur die Unternehmen anzeigen): {1}; {2}; {3}
2.Schritt (Unternehmen 1 und 2 werden verschmelzt): {1,2}; {3}

Dadurch das die Unternehmen 1 und 2 verschmelzt wurden, muss auch die Matrix angepasst werden… denn es muss festgelegt werden inwieweit Unternehmen {3} nun von „Unternehmenscluster“ {1, 2} enfernt ist. Die Berechnung sieht folgender Maßen aus…

verbleibendes Cluster {3}
Abstand {1} zu {3} war 20
Abstand {2} zu {3} war 10 (alles entnommen aus oberer Matrix)

ich nehme immer den niedrigsten Wert, in diesem Fall also die 10!… also sieht die neue Matrix so aus…

- {1,2} / {3}
{1, 2} 0 / 10
{1, 2} 10 / 0

und auf dieser Basis soll dann weiter verschmolzen werden… bis nichts mehr da ist…!

Um jetzt nicht einfach zu fragen wie würdet ihr das machen, vielleicht Schritt für Schritt!
Die erste Frage die sich mir stellt bezieht sich somit auf das Array!

Der letzte Schritt bevor die Clusteranalyse durchgerechnet werden soll sind die Methoden „distanzBerechnungEukli“ oder „distanzBerechnungCity“ jenachdem was man an der Oberfläche auswählt! Danach sollte das angepasste Array an die Methode? übergeben werden die Clusteranalyse durchführt.

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
public static void distanzBerechnungEukli(double[][] kunde)
        {
            double Ergebnis = 0;
            double Formel = 0;
            Console.WriteLine("Berechnung auf Basis Euklidischer Distanz!");
            Console.WriteLine("");
            
            for (int a = 0; a < kunde.Length; ++a)
            {
                Console.WriteLine("");
                Console.WriteLine("Unternehmen: "+kunde[a][0]);

                for (int b = 0; b < kunde.Length; ++b)
                {
                    for (int i = 1; i < kunde[0].Length; ++i)
                    {       
                        Formel = (Math.Pow(kunde[a][i] - kunde[b][i],2));
                        Ergebnis += Formel;
                    }
                    
                    double Endergebnis = 0;
                    
                        Endergebnis = Math.Sqrt(Ergebnis);
                        Console.WriteLine(Endergebnis);
                        Endergebnis = 0;
                        Ergebnis = 0;
               
                }
            }
        }


        public static void distanzBerechnungCity(double[][] kunde)
        {
            double Ergebnis = 0;
            double Formel = 0;

            Console.WriteLine("Berechnung auf Basis CityBlock Distanz!");
            Console.WriteLine("");

            for (int a = 0; a < kunde.Length; ++a)
            {
                Console.WriteLine("");
                Console.WriteLine("Unternehmen: " + kunde[a][0]);

                for (int b = 0; b < kunde.Length; ++b)
                {
                    for (int i = 1; i < kunde[0].Length; ++i)
                    {
                        Formel = (Math.Abs(kunde[a][i] - kunde[b][i]));
                        Ergebnis += Formel;
                    }

                    double Endergebnis = 0;
                    Endergebnis = Ergebnis;
                    Console.WriteLine(Endergebnis);
                    Endergebnis = 0;
                    Ergebnis = 0;
                    
                }
            }


Jetzt meine Frage!

Die Werte die innerhalb der Methoden ausgegeben werden, werden zum jetzigen Zeitpunkt nicht in das Array geschrieben! Das heißt es findet ja nur eine Ausgabe statt die aber nicht das Array mit den neue Werten anpasst! Was muss ich innerhalb der beiden Methoden ungefähr tun damit diese neuen Werte in das Array übertragen werde und vorallendingen wie erhalte ich eine solche Matrix wie sie oben bei der weiteren Verrechnung der CLusteranalyse aufgeführt wird? Oder anders gefragt ist ein solche Matrix für die weitere Verrechnung nötig? oder gibt es vielleicht auch eine andere einfachere Lösung!

Oder reicht vielleicht sogar nur der Clone des Arrays aus um die Berechnung in der nächsten Methode durchzuführen?

Die Ausgabe der Methoden in der Konsole sieht so aus:
Unternehmen 0:
0
0,194

Unternehmen 1:
0,194
0

Würde mich über Tipps sehr freuen!

Moderiert von user profile iconTh69: Beitragsformatierung überarbeitet (Text aus zitiertem und editiertem Beitrag übernommen).
sebastian1234 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: Mi 05.03.14 17:41 
War wohl zu viel auf einmal... =)

Ich mach es in kleinen Schritten!
Die Methode...

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
public static void distanzBerechnungCity(double[][] kunde)
        {
            double Ergebnis = 0;
            double Formel = 0;
            //double[][] arrayDistanzCity = (double[][])kunde.Clone();

            Console.WriteLine("Berechnung auf Basis CityBlock Distanz!");
            Console.WriteLine("");

            for (int a = 0; a < kunde.Length; ++a)
            {
                Console.WriteLine("");
                Console.WriteLine("Unternehmen: " + kunde[a][0]);

                for (int b = 0; b < kunde.Length; ++b)
                {
                    
                    for (int i = 1; i < kunde[0].Length; ++i)
                    {
                        Formel = (Math.Abs(kunde[a][i] - kunde[b][i]));
                        Ergebnis += Formel;
 
                    }
                    
                    double Endergebnis = 0;
                    Endergebnis = Ergebnis;
                    Console.WriteLine(Endergebnis);
                    //arrayDistanzCity[a][b] = Endergebnis;
                    Endergebnis = 0;
                    Ergebnis = 0;
                    
                }
            }
            //clusterAnalyse(arrayDistanzCity);
        }


liefert folgende Ausgabe in der Konsole:

Unternehmen: 0
0
11

Unternehmen: 1
11
0


(Unternehmen 0 zu 0 = 0
Unternehmen 0 zu 1 = 11)

(Unternehmen 1 zu O = 11
Unternehmen 1 zu 1 = 0)

Was muss ich ändern damit ich das so in das arrayDistanzCity schreiben kann:
das quasi zu Unternehmen0 folgende Zeile im Array angelegt wird...

0 / 0 / 11

und für unternehmen1 ...

1 / 11 / 0

An der Stelle wo es jetzt steht geht es nicht, da dann eine falsche Reihenfolge heraus kommt...

EDIT: Unter Console.WriteLine("Unternehmen: " + Kunde[a][0]);
arrayDistanzCity[a][0] = kunde[a][0];

aber wie benenne ich das untere Array i geht ja nicht...
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 06.03.14 14:41 
Hallo!

Welche Reihenfolge erhältst Du denn anstatt der gewünschten? Ich hätte jetzt schon drauf getippt, dass arrayDistanzCity[a][b] die richtige Wahl ist. aist dann die Zeile im Array und b geht die Spalten durch.

Auch ist diese Frage völlig unverständlich:
user profile iconsebastian1234 hat folgendes geschrieben Zum zitierten Posting springen:
aber wie benenne ich das untere Array i geht ja nicht...


Grüße
Christian

P.S.: Ruf mal bitte Deine privaten Nachrichten ab.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
sebastian1234 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: Sa 08.03.14 14:23 
Ja habe ich gelesen, ich weiß jetzt bescheid!

Also in der Methode wird ja unter...

ausblenden C#-Quelltext
1:
Console.Writeline(Endergebnis);					


ein Wert ausgegeben.

Das Array sieht ungefähr so aus...

0/10/20
1/30/40
2/50/60 usw...

Der erste Wert der ausgegeben wird soll (0 für unternehmen0) an die Stelle /10/ der nächste an die stelle /20/ dann der nächste (1 für unternehmen1) an die stelle 30 geschrieben werden usw...

Also die erste Spalte in Array (0,1,2) soll unberührt bleiben. Denn bspw. da wo jetzt der Wert /20/ steht steht nach der Berechnung ein Wert der die Beziehung zwischen Unternehmen 0 und 1 darstellt...
sebastian1234 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: Mo 10.03.14 18:27 
Ich habe jetzt mal die Konsolenausgabe mit dazu geschrieben, vllt hilft das bei der Lösung des Problems...

Nochmal die 1.Methode! Hier soll eigentlich nichts anderes passieren als die Übertragung der Werte in das neue Array...

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
public static void distanzBerechnungCity(double[][] kunde)
        {
            
            double Ergebnis = 0;
            double Formel = 0;
            double[][] arrayDistanzCity = (double[][])kunde.Clone();

            Console.WriteLine("Berechnung auf Basis CityBlock Distanz!");
            Console.WriteLine("");

            for (int a = 0; a < kunde.Length; ++a)
            {
                
                Console.WriteLine("");
                Console.WriteLine("Unternehmen: " + kunde[a][0]);

                arrayDistanzCity[a][0] = kunde[a][0];

                for (int b = 0; b < kunde.Length; ++b)
                {
                    
                    for (int i = 1; i < kunde[0].Length; ++i)
                    {
                        Formel = (Math.Abs(kunde[a][i] - kunde[b][i]));
                        Ergebnis += Formel;
 
                    }
                    
                        double Endergebnis = 0;
                        Endergebnis = Ergebnis;
                        Console.WriteLine(Endergebnis);
                        arrayDistanzCity[a][b] = Endergebnis;
                        Endergebnis = 0;
                        Ergebnis = 0;
                        
                    
                }
            }
            clusterAnalyse(arrayDistanzCity);
        }


... welches dann über diese Methode ausgelesen wird ...

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
public static void clusterAnalyse(double[][] kunde)
        {
            for (int a = 0; a < kunde.Length; ++a)
            {
                Console.WriteLine("");
                Console.WriteLine("Unternehmen :" + kunde[a][0]);

                for (int i = 1; i < kunde[0].Length; ++i)
                {
                    Console.WriteLine(+kunde[a][i]);
                }
            }

        }


... aber falsche Werte liefert! Links die Ausgabe der Methode (distanzBerechnungCity) rechts die Ausgabe der Methode (clusterAnalyse)!

distanzBerechnungCity----------------------------------------clusterAnalyse

Unternehmen: 0---------------------------------------------Unternehmen: 0
0----------------------------------------------------------------11
11---------------------------------------------------------------2

Unternehmen: 1---------------------------------------------Unternehmen: 65
65---------------------------------------------------------------0
0----------------------------------------------------------------1

Ich frage mich auch wie der Wert 2 zustande kommt?

EDIT: Vermutlich liegt das Problem in der ersten Methode beim hochzählen von b?
EDIT2: Irgendwie scheint noch mehr falsch zu sein denn das Ergebnis 65 müsste eigentlich auch 11 sein!

Moderiert von user profile iconTh69: Beiträge zusammengefasst

--> Antwort zu EDIT2: Ich glaube das problem liegt an dem Array clon, ich habe es in eine andere Methode eingbaut und da ist es jetzt auch falsch...

Das Array das ich clone hat nicht unbedingt die richtige große -> die Größe die ich benötige orientiert sich in der Methode distanzBerechnungCity an den Zeilenwerten -> Also 2 Zeilenwerte dann ist das Array 2x2 groß! Wie schaffe ich es das so umzusetzen?

Moderiert von user profile iconTh69: Vollzitat entfernt.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 11.03.14 10:33 
Hallo sebastian1234,

ja, die Clone-Methode führt bei "jagged arrays" nur ein "shallow copy" (und kein "deep copy" durch), d.h. nur die erste Ebene wird kopiert (die Referenzen auf die Unterarrays bleiben).
Copy one jagged array ontop of another müßte dir weiterhelfen.
Andere Kopiermöglichkeiten habe ich noch unter Extremely fast way to clone the values of a jagged array into a second array? gefunden.

P.S. Bei clusterAnalyse() fängt dein innerer Schleifenzähler erst bei 1 an (anstatt bei 0)...