Entropie Berechnung

Status
Nicht offen für weitere Antworten.

Plackan

Mitglied
Hallo Leute,

ich habe da eine Aufgabe, die die Entropie von Dateien berechnen soll. Hier mal die genaue Formulierung dessen was gemacht werden soll:

Schreiben Sie eine Anwendung, um den Informationsgehalt von Dateien zu messen.
Die Anwendung soll als Argument einen Namen für entweder eine Datei oder
ein Verzeichnis übernehmen. Handelt es sich um ein Verzeichnis, so werden im
weiteren alle Dateien in diesem Verzeichnis betrachtet. Berechnen Sie für jede
Datei die Entropie H. Betrachten Sie dabei jeweils Bytes als Einheit, d. h. der
Zeichenvorrat sind die 256 verschiedenen Bytes. Messen Sie die Häufigkeit der
einzelnen Bytes und berechnen daraus die Entropie. Testen Sie die Anwendung
für verschiedene Dateiarten:
- Text
- Bilder (Bitmap und JPEG)
- ausführbare Dateien (.exe)


Ich komme da irgendwie nicht mehr Weiter. Ich weiß nicht, wie ich die Formel zur Berechnung der Entropie in Java umsetzen kann:


He = log 1=p(X) = ¡log p(X)

Mein Code sieht bisher wie folgt aus:







Code:
mport java.io.*;
/**
 * Beschreiben Sie hier die Klasse Entropie.
 * 
 * @author (Ihr Name) 
 * @version (eine Versionsnummer oder ein Datum)
 */
public class Entropie
{
    // Definieren Sie ab hier die Klassenvariablen für Entropie
    
    long[] zaehler;
    
    // Definieren Sie ab hier die Objektvariablen für Entropie

    // Definieren Sie ab hier die KOnstruktoren für Entropie
    /**
     * Konstruktor für Objekte der Klasse Entropie
     */
    public Entropie()
    {
        // Objektvariable initialisieren
    }

    // Definieren Sie ab hier die Methoden für Entropie
    
    void entropie()
    { 
        int i;
        try {
        DataInputStream quelle = new DataInputStream( new FileInputStream( "test.dat" ) );
        
       
        
        for (i=0;i<=256;i++);
        zaehler = new long[256];
        
        quelle.readUnsignedByte();
}
        catch (EOFException e) 
        {
        // Dateiende
        System.exit(0);
}
        catch (IOException e) {
                // Fehler beim Lesen
                    System.out.println(e.getMessage());
}
   

    /**
     * Diese Methode leistet....
     * 
     * @param   Parameter...
     * @return  Rückgabewert...
     */
}
    void readUnsignedByte()
    {
        double entropie;
  
      
     
    }
}
 
S

SlaterB

Gast
zunächst mal vergiss alles was mit Dateien zu tun hat und berechne einfach die Entropie des Teststrings 'test'

dafür musst du natürlich erstmal wissen, was Entropie heißt,

deine Formel ist ohne genaure Erklärung aller benutzen Zeichen nutzlos, was ist p, was ist x,

vielleicht versuchst du es überhaupt lieber umgangssprachlich, was soll eigentlich erreicht werden,
z.B. alle Zeichen als Bytes betrachen, den Mittelwert ausrechnen und dann die durchschnittliche Abweichung?
 

Plackan

Mitglied
Zu der Formel:

He = log 1=p(X) = -log p(X)

P ist die Wahrscheinlichkeit mit der ein Zeichen x vorkommt.

Die Entropie ist ein Maß für den mittleren Informationsgehalt pro Zeichen einer Nachricht. Also wohl so wie du das auch geschrieben hast, zuerst die Bytes betrachten und dann den Mittelwert berechnen.
 

dsv fritz

Bekanntes Mitglied
10er-Logrithmus: Math.log10()

oder ist deine Frage etwas genereller? Also wie berechne ich die Wahrscheinlichkeit für die Byte-Einheit etc?
 

Plackan

Mitglied
dsv fritz hat gesagt.:
10er-Logrithmus: Math.log10()

oder ist deine Frage etwas genereller? Also wie berechne ich die Wahrscheinlichkeit für die Byte-Einheit etc?

Genau allgemein wie man die Wahrscheinlichkeit also die Formel jetzt umsetzt, damit auch die Entropie von verschiedenen Dateien berechnet werden kann. Als basis des Logarithmus sollten wir die 2 nehmen.

Hatte es schon mit Math.log2() versucht, hat aber nicht so ganz funktioniert.
 

Plackan

Mitglied
Die Methode void readUnsignedByte() soll die Bytes die zuvor ausgelesen wurden und im Array gespeichert wurden nehmen und mit diesen dann rechnen.

Nur wie mache ich das?
 

Murray

Top Contributor
Für den Zweierlogarithmus gibt es int java.lang.Math keine direkte Funktion. Da man Logarithmen verschiedener Basen aber nach folgender Formel

logb(x) = loga(x) / loga(b)

ineinander umrechnen kann, ist das nicht weiter schlimm:

Code:
public static double log2( double wert) {
  return Math.log( wert) / Math.log( 2.0);
}
 
S

SlaterB

Gast
wenn schon dann
Code:
private static double log2 = Math.log( 2.0)

public static double log2( double wert) {
  return Math.log( wert) / log2;
}
 

dsv fritz

Bekanntes Mitglied
Ich habe mein altes Kommunikationstechnik-Skript hervor gegraben und hab nun folgenden Vorschlag:
Die Entropie lässt sich wie folgt berechnen:
H = p1 * log2(1/p1) + p2*log2(1/p2)+...+pn*log2(1/pn)

Was du nun machen musst, ist eigentlich die p's der einzelnen Zeichen berechnen. Das kannst du machen, indem du einfach die Anzahl jedes einzelnen Zeichens durch die Gesamte Anzahl an Zeichen dividierst.
Zum Schluss kannst du dann die Formel bequem anwenden.

Z.B.: Eine Datei beinhaltet folgenden Text:
"AAAAABBBCDD"

Somit ergibt sich für
p(A) = 5 / 11
p(B) = 3 / 11
p(C) = 1 / 11
p(D) = 2 / 11

=> H = 1.78993 bit
 

Plackan

Mitglied
Danke das bringt mich schon etwas weiter. Da ich 256 bit insgesamt erlaube, müsste ich dann durch 256 teilen. Nur wie bekomme ich die p's aus einer Datei?
 
S

SlaterB

Gast
Datei als String einlesen (besser erstmal mit Teststring probieren), z.B. mit BufferedReader.readLine(),
Zeilenumbrüche nicht vergessen, sind ja auch irgendwie ein Zeichen,
dann String.charAt,

oder Datei gleich als byte[] einlesen, das ist wohl schlauer ;)
sowas liest man allgemein in einem Lehrbuch nach, z.B.

http://www.galileocomputing.de/openbook/javainsel5/
 

marble

Mitglied
Hier was allgemeines zur Entropie:

http://de.wikipedia.org/wiki/Entropie

Dann etwas zum Dateien einlesen:

http://java.sun.com/docs/books/tutorial/essential/io/


da du das ganze rekursiv machen sollst - also ein ordner hat dateien und unterordner - diese unterordner wieder unterordner.... solltest du dir auch mal zu gemüte führen wie man durch so ne baumartige dateistruktur rekursiv läuft:

brauchst also ne funktion die sich selbst aufruft wenn sie nen ordner hat, jedoch falls sie ne file hat nur dessen dieses zurückgibt (oder an ne liste anhängt). am ende hast du dann alle dateien in ner liste. die wird dann abgearbeitet.

öffne die datei lies daraus - zeichenweise - dann nimmst einfach nen array [256] der dann zu jedem buchstaben (der ja nichts anderes ist, als ein zahlenwert) eins dazuzählt. sozusagen

array[buchstabe]++

so geht das wohl am schnellsten. am ende nimmst ein floatArray[256] und sagst in ner schleife einfach floatArray[x] = array[x]/256f . von mir aus kannst auch gerne doubles nehmen :)

dann haste von jedem buchstaben die wahrscheinlichkeit. wie man die entropie dann ausrechnet haben ja hier schon einige erwähnt. es geht denke ich in der übung hauptsächlich um das file handling... dann handle mal schön... ;-)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I File Uploader... Statusanzeige, Berechnung des Status etc. Java Basics - Anfänger-Themen 0
Bugs Bunny Fehlerhafte Berechnung beim erneuten Durchlaufen der Schleife Java Basics - Anfänger-Themen 5
Jamie logische Verknüpfung zur Schaltjahr-Berechnung Java Basics - Anfänger-Themen 30
Stephan_kl Reihenwert-Berechnung, Ergebnis mit vorherigem Ergebnis vergleichen Java Basics - Anfänger-Themen 11
Abraham42 Berechnung der Kühlung Java Java Basics - Anfänger-Themen 12
S Hashcode-Berechnung + ^ Java Basics - Anfänger-Themen 2
J Median-Berechnung von 2D-Teilarrays Java Basics - Anfänger-Themen 56
F Tabelle - Berechnung Rang Java Basics - Anfänger-Themen 2
B Berechnung der Position von Kinderelemente von einem Elternknoten Java Basics - Anfänger-Themen 23
S Berechnung der sleep time ist falsch Java Basics - Anfänger-Themen 46
S Switch-Case zur Berechnung der Einkommensteuer Java Basics - Anfänger-Themen 15
F Berechnung der Rektaszension und Deklination eines Sterns Java Basics - Anfänger-Themen 7
2 Taschenrechner mit GUI Problem bei der Berechnung Java Basics - Anfänger-Themen 8
V Erste Schritte Pi Berechnung Java Basics - Anfänger-Themen 47
M Berechnung der Reststrecke bei Graphen Java Basics - Anfänger-Themen 1
V Algorithmus zur fortlaufenden Berechnung des duechscjnt Java Basics - Anfänger-Themen 1
B Berechnung zu einer Schleife formen Java Basics - Anfänger-Themen 6
B Berechnung Median mit Methode Java Basics - Anfänger-Themen 7
CptK Methoden Berechnung von Anfangsgeschwindigkeit und Winkel Java Basics - Anfänger-Themen 27
K Erste Schritte Berechnung der Summe zweier Arrays Java Basics - Anfänger-Themen 15
S Erste Schritte Berechnung des Paketportos - Problem/Frage Java Basics - Anfänger-Themen 52
J Gleitkommazahlen, Berechnung von pi Java Basics - Anfänger-Themen 4
J Berechnung liefert falsches Ergebnis Java Basics - Anfänger-Themen 2
kilopack15 Verzweiflung wegen Berechnung mit Multithreading Java Basics - Anfänger-Themen 1
A Die Werte zur Berechnung müssen als Parameter übergeben werden? Java Basics - Anfänger-Themen 7
Salo Berechnung von Winkeln Java Basics - Anfänger-Themen 28
M Restbuchwert Berechnung geht nicht Java Basics - Anfänger-Themen 45
Ghostman1711 Pi berechnung Methode aufrufen Java Basics - Anfänger-Themen 2
L Rekursive Methode zur Berechnung der Potenz q hoch p Java Basics - Anfänger-Themen 17
beatles Operatoren Operatoren - Berechnung Java Basics - Anfänger-Themen 40
K Best Practice Algorithmus für Berechnung von Zahlenreihenfolge Java Basics - Anfänger-Themen 12
N Verzögerte Berechnung "Lazy" Java Basics - Anfänger-Themen 8
J Erste Schritte Rundungsproblem - Berechnung Notendurchschnitt Java Basics - Anfänger-Themen 13
S Variablen Vektor zur Berechnung verwenden Java Basics - Anfänger-Themen 4
T Java double berechnung fehler Java Basics - Anfänger-Themen 2
M Berechnung in Java Java Basics - Anfänger-Themen 4
S Berechnung der Arbeitstage in einem Zeitraum Java Basics - Anfänger-Themen 9
E Problem bei rekursiver Berechnung des Binomialkoeffizienten Java Basics - Anfänger-Themen 5
T Iterative Pi Berechnung in Rekursive Java Basics - Anfänger-Themen 2
S Double, int, Berechnung Java Basics - Anfänger-Themen 3
C Nach Berechnung runden und Wert ausgeben Java Basics - Anfänger-Themen 7
E Berechnung für Shop einbinden Java Basics - Anfänger-Themen 8
S Klassen Formel zur Berechnung .... Bitte um Hilfe Java Basics - Anfänger-Themen 7
S Euklid Algorithmus zur Berechnung des GGTs Java Basics - Anfänger-Themen 2
OnDemand Berechnung in die start und paint Methode eines Applets Java Basics - Anfänger-Themen 28
P Schleife zur Berechnung von einer Summe Java Basics - Anfänger-Themen 16
F Berechnung einer linearen Abschreibung Java Basics - Anfänger-Themen 5
E Berechnung von Punkten Java Basics - Anfänger-Themen 4
D Berechnung des Abstandes von zwei Punkten in einem Koordinatensystem Java Basics - Anfänger-Themen 14
A Methoden PI-Berechnung Java Basics - Anfänger-Themen 22
S Erste Schritte Berechnung mit Daten aus CSV und Date Objekt Java Basics - Anfänger-Themen 2
C Programm zur Berechnung der Spur einer Matrix Java Basics - Anfänger-Themen 4
P Pythagoras Baum - Berechnung der Punkte Java Basics - Anfänger-Themen 9
A Erste Schritte Steuer Berechnung, Alters Abhängig Java Basics - Anfänger-Themen 5
T Erste Schritte Berechnung von gerade und ungerade Zahlen Java Basics - Anfänger-Themen 10
J Erste Schritte Berechnung Ratten vermehrung Java Basics - Anfänger-Themen 4
P falsches ergebnis bei einfacher berechnung Java Basics - Anfänger-Themen 3
T Iterative Berechnung einer Satellitenbahn Java Basics - Anfänger-Themen 20
M Java Berechnung mit mehreren Lösungen? Java Basics - Anfänger-Themen 9
D Nullstellen-Berechnung Java Basics - Anfänger-Themen 10
L Fehlermeldung bei falscher Berechnung anzeigen Java Basics - Anfänger-Themen 31
A berechnung multiplikatives inverses Java Basics - Anfänger-Themen 5
J Berechnung des aktuellen Alters auf Basis des Geburtstags Java Basics - Anfänger-Themen 45
J Datentypen Fehler bei Berechnung mit Double und Int-Werten Java Basics - Anfänger-Themen 22
G Berechnung von Winkeln mit Cosinussatz Java Basics - Anfänger-Themen 2
B Arrays verwenden für Berechnung Java Basics - Anfänger-Themen 3
R Merkwürdige Modulo Berechnung Java Basics - Anfänger-Themen 7
B Hausaufgabe Berechnung quadratischer Funktion Java Basics - Anfänger-Themen 16
U Alter Berechnung + sortierung Java Basics - Anfänger-Themen 6
P Berechnung wird nicht durchgeführt Java Basics - Anfänger-Themen 2
D Berechnung von Ostern und Ramadan! Java Basics - Anfänger-Themen 24
N Algorithmus für Berechnung einer Quersumme Java Basics - Anfänger-Themen 9
D Berechnung von Geldausgabe Java Basics - Anfänger-Themen 22
F Berechnung von Kugeln! Java Basics - Anfänger-Themen 9
M rekursive Funktion zur Berechnung der Spiegelzahl Java Basics - Anfänger-Themen 7
S Hausaufgabe: Java-Programm schreiben zur Berechnung von x und y Java Basics - Anfänger-Themen 9
Y Ergebnis einer Berechnung an die Main Methode übergeben Java Basics - Anfänger-Themen 11
Semox Ersten Wert eines Intervalls bei Berechnung einschließen Java Basics - Anfänger-Themen 8
J Logarithmische Berechnung und Arrays Java Basics - Anfänger-Themen 2
B LinkedList - Berechnung des Produkts Java Basics - Anfänger-Themen 6
B Berechnung von Preisen per Java-Programm Java Basics - Anfänger-Themen 27
M Alters berechnung aus Geburtsjahr aus dem Buch Java Basics - Anfänger-Themen 5
O Fehler in der String-Distanz-Berechnung Java Basics - Anfänger-Themen 5
-horn- "Berechnung vorwärts, Optimierung rückwärts?" - Wie würdet ihr das machen? Java Basics - Anfänger-Themen 8
P iterative Berechnung Java Basics - Anfänger-Themen 9
1 Berechnung von PI mithilfe von Buffons Nadelproblem Java Basics - Anfänger-Themen 2
G Berechnung zwei Komplexen Zahlen Java Basics - Anfänger-Themen 34
N Rekursive Berechnung der Höhe eines binären Baumes Java Basics - Anfänger-Themen 4
J Programm für interaktive Berechnung von Temperaturverläufen Java Basics - Anfänger-Themen 9
K Annährende ganzzahlige Berechnung der Wurzel Java Basics - Anfänger-Themen 8
L Berechnung von Perioden Java Basics - Anfänger-Themen 4
D einfach berechnung einer onlinezeit Java Basics - Anfänger-Themen 25
S Euklid Klasse mit Methoden zur Berechnung des ggT Java Basics - Anfänger-Themen 23
G Frage zur Primzahlen berechnung Java Basics - Anfänger-Themen 11
G Berechnung von N-Tageslinien von Aktienkursen Java Basics - Anfänger-Themen 13
G Rekursive Berechnung von n über k schlägt fehl Java Basics - Anfänger-Themen 5
G Einfache Berechnung liefert falsches Ergebnis Java Basics - Anfänger-Themen 2
W Schaltjahr Berechnung Java Basics - Anfänger-Themen 24
A Probleme mit Programm zur Pi-Berechnung Java Basics - Anfänger-Themen 6
X Temperatur-Berechnung /Array(?) Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben