Medoidtest

Neue Frage »

Auf diesen Beitrag antworten »
neuling96 Medoidtest

code:
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:
/**
 * Medoid Klasse. Diese Klasse dient zur Berechnung des Medoids einer Menge von
 * Zahlen.
 */
public class Medoid {

    /**
     * Die Methode medoid berechnet den Medoid eines Arrays vom Typ double. Der
     * Medoid ist die Zahl, die dem Mittelwert aller Zahlen am nächsten
     * liegt.
     *
     * @param numbers Die Menge von Zahlen, deren Medoid berechnet werden soll.
     * @return Gibt den Medoid der Eingabemenge von Zahlen zurück
     */
    public static int medoid(int[] numbers) {
		int sum;
    int mittel;
for (int i =0; i<numbers.length; i++){
sum+=numbers [i];
	}
 int [] test= new int [numbers.length];
mittel =sum/numbers.length;
for (int i =0; i<numbers.length; i++){
 test[i]= mittel-numbers [i];
 	}
       int y=1;
       int i=0;
while (y<numbers.length){
if ( test [i] < test [y]){
  y=y+1;
	} else {
               i=y;
                   y=y+1;
      }
     }
    return numbers [i];
}
}


1) macht das sinn?

2) wie füht man bsp ein um zuprüfen ob es stimmt?

code:
1:
2:
public static void main(String[] args)
 {System.out.println("medoid(7,4,8,42,13)=" + medoid(new int[]{7, 4, 8, 42, 13})); 
<- funktioniert nicht
 
Auf diesen Beitrag antworten »
eulerscheZahl

erst mal in eine leserliche Form bringen und die Variable sum initialisieren:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
public static int medoid(int[] numbers) {
	int sum = 0;
	int mittel;
	for (int i = 0; i < numbers.length; i++) {
		sum += numbers[i];
	}
	int [] test = new int[numbers.length];
	mittel = sum / numbers.length;
	for (int i = 0; i < numbers.length; i++) {
		test[i] = mittel - numbers[i];
	}
	int y = 1;
	int i = 0;
	while (y < numbers.length) {
		if ( test[i] < test[y]) {
			y++;
		} else {
			i = y;
			y++;
		}
	}
	return numbers[i];
}

Das Problem:
wenn du eine Zahl hast, die größer als der Mittelwert ist, steht in test an dieser Stelle etwas negatives.
Für dein Beispiel konkret: [7, 10, 6, -28, 1]
Bei dem Vergleich test[i] < test[y] wird also die -28 gefunden, weil das die kleinste Zahl ist.
Du musst also irgendwo den Betrag einbauen, z.B. so: test[i] = Math.abs(mittel - numbers[i]);

Jetzt findet das Programm auch den richtigen Wert.

ein paar Verbesserungsvorschläge:
Den Mittelwert würde ich nicht als Ganzzahl berechnen. Sonst kann es sein, dass bei einem Mittelwert von 5.9 trotzdem die 5 statt der 6 ausgegeben wird.
Die Variable test ist nicht unbedingt nötig -> nicht so viel Speicher verschwenden
In der while-Schleife am Ende (bei der for die bessere Wahl wäre), hast du in if und in else y++, das könnte man also auch rausziehen.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
public static int medoid(int[] numbers) {
	int sum = 0;
	for (int i = 0; i < numbers.length; i++) {
		sum += numbers[i];
	}
	float mittel = (float)sum / numbers.length;
	int index = 0;
	float minDiff = Math.abs(mittel - numbers[0]);
	for (int i = 1; i < numbers.length; i++) {
		if (Math.abs(mittel - numbers[i]) < minDiff) {
			minDiff = Math.abs(mittel - numbers[i]);
			index = i;
		}
	}
	return numbers[index];
}
Auf diesen Beitrag antworten »
neuling96

Zitat:
Original von eulerscheZahl


Jetzt findet das Programm auch den richtigen Wert.

ein paar Verbesserungsvorschläge:
Den Mittelwert würde ich nicht als Ganzzahl berechnen. Sonst kann es sein, dass bei einem Mittelwert von 5.9 trotzdem die 5 statt der 6 ausgegeben wird.
Die Variable test ist nicht unbedingt nötig -> nicht so viel Speicher verschwenden
In der while-Schleife am Ende (bei der for die bessere Wahl wäre), hast du in if und in else y++, das könnte man also auch rausziehen.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
public static int medoid(int[] numbers) {
	int sum = 0;
	for (int i = 0; i < numbers.length; i++) {
		sum += numbers[i];
	}
	float mittel = (float)sum / numbers.length;
	int index = 0;
	float minDiff = Math.abs(mittel - numbers[0]);
	for (int i = 1; i < numbers.length; i++) {
		if (Math.abs(mittel - numbers[i]) < minDiff) {
			minDiff = Math.abs(mittel - numbers[0]);
			index = i;
		}
	}
	return numbers[index];
}


Wir hatten noch nicht math.abs()
gehts auch anders?


müsste statt der null nicht i stehen?

if (Math.abs(mittel - numbers[i]) < minDiff) {
minDiff = Math.abs(mittel - numbers[i]);
Auf diesen Beitrag antworten »
eulerscheZahl

Mit i statt 0 hast du Recht. Habe ich ausgebessert.

Wenn du keinen Betrag verwenden willst, gibt es auch andere Wege. Du kannst die Zahl quadrieren, dann wird sie auch positiv. Oder du baust dir selbst einen Betrag mit if (zahl < 0) zahl *= -1;.
 
 
Neue Frage »
Antworten »


Verwandte Themen