Моля, коригирайте ентропийния ми код

Пиша код за изчисляване на ентропията на низ с ентропията на Шанън.

 Dim entropytext As String = Result.Text

    Dim theresult = entropytext.GroupBy(Function(o) o) _
        .Select(Function(o) New With {.Count = o.Count(), .Character = o.Key}) _
        .GroupBy(Function(o) o.Count, Function(o) o.Character) _
        .OrderByDescending(Function(o) o.Key)

    Dim totalEntropy As Double = 0
    Dim partialEntropy As Double
    Dim partialP As Double

    For Each item In theresult
        Console.Write(item.Key & " of chars: ")

        For Each character In item
            Console.Write(character)
        Next

        partialP = item.Key / entropytext.Count
        Console.Write(". p of each " & partialP & ", total p = " & item.Count * partialP)
        partialEntropy = partialP * Math.Log(partialP) * item.Count
        totalEntropy += partialEntropy
        Console.WriteLine()
    Next

    totalEntropy *= -1
    TextBox1.Text = totalEntropy & " Bits"
End Sub

математика:

Entropy = -∑(P_xlog(P_x))
P_x = N_x/∑(N_x)

където P_x е вероятността за буквата x,

и N_x е номерът на буквата x.

So,

textbox1 ='AATC'

Entropy (textbox1)=-([2/4 log(2/4)]+[1/4 log (1/4)]+[1/4 log (1/4)])
= 1.0397

Но това е твърде ниско... според (http://www.shannonentropy.netmark.pl/) трябва да е "1,5". какво правя грешно Благодаря ви предварително!!

По същество би трябвало да работи така... но не съм компетентен с диез...

public static double ShannonEntropy(string s)
{
var map = new Dictionary<char, int>();
foreach (char c in s)
{
    if (!map.ContainsKey(c))
        map.Add(c, 1);
    else
        map[c] += 1;
}

double result = 0.0;
int len = s.Length;
foreach (var item in map)
{
    var frequency = (double)item.Value / len;
    result -= frequency * (Math.Log(frequency) / Math.Log(2));
}

return result;
}

person Ashtopher    schedule 09.02.2014    source източник
comment
Искате ли да превърнете C# кода във VB или търсите помощ по-конкретно с вашия VB код? Извинете за евентуалното объркване там..   -  person txtechhelp    schedule 10.02.2014
comment
О, съвсем не. Извинете за неорганизирания ми въпрос. Или наистина, тъй като кодът с диез е това, към което се стремя. Опитах да използвам varycode.com/converter.html, но не съм сигурен колко е надеждно ...   -  person Ashtopher    schedule 10.02.2014
comment
developerfusion.com/tools/convert/csharp-to-vb .. друг уеб C#-›VB конвертор   -  person txtechhelp    schedule 10.02.2014


Отговори (1)


Ето директен порт на C# кода във VB.NET:

Public Shared Function ShannonEntropy(s As String) As Double
    Dim map = New Dictionary(Of Char, Integer)()
    For Each c As Char In s
        If Not map.ContainsKey(c) Then
            map.Add(c, 1)
        Else
            map(c) += 1
        End If
    Next

    Dim result As Double = 0.0
    Dim len As Integer = s.Length
    For Each item As var In map
        Dim frequency = CDbl(item.Value) / len
        result -= frequency * (Math.Log(frequency) / Math.Log(2))
    Next

    Return result
End Function

Ако кодът на C# дава резултатите, които търсите, този код ще даде същите резултати.

person txtechhelp    schedule 09.02.2014
comment
Много благодаря. Трябваше да променя някои неща тук и там, но се получи! :Д - person Ashtopher; 10.02.2014