计算不同文件扩展名的熵以发现数据的随机性?

2024-04-26 10:29:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有不同的文件类型,包括JPEG和jpg、mp3、GIF、MP4、FLV、M4V、exe、zip等

  1. 以块为单位获取数据,比如4k块大小,找出随机性

  2. 生成介于0和1之间的随机性分数

  3. 试着根据随机性得分来安排课程

我们如何找到上面提到的不同类型文件的熵,并将每个文件的分数在0到1之间进行缩放


Tags: 文件单位zipgifexemp3分数课程
1条回答
网友
1楼 · 发布于 2024-04-26 10:29:21

+1个非常有趣的问题这里有几个未经验证的想法现在就在我脑海中:

  1. 如何使用correlation coefficient

    是否使用相同大小(4K)的均匀随机数据?和/或先使用FFT,然后关联

  2. 或计算统计特性并从中推断…

    我知道这是一个模糊的描述,但可能值得深入研究

  3. 使用压缩

    例如,使用Huffman coding压缩4K数据,并从未压缩和压缩大小之间的比率推断系数,可能使用对数刻度

我认为最容易实现和最合理的结果将来自第三种方法,因为Huffman coding和熵密切相关

[edit1]使用香农信息熵

您的建议甚至比Hufman编码更好(即使这两种编码密切相关)。使用以二进制数字为基数的Shannon information entropyH将返回表示数据所需的数据的平均每字位数(在Hufman编码之后)。因此,从这里开始得分<0..1>只需除以每个字的位数

这里是字节熵计算的小型C++/VCL示例:

//$$   Form CPP   
//                                     -
#include <vcl.h>
#include <math.h>
#pragma hdrstop
#include "Unit1.h"
//                                     -
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//                                     -
char txt0[]="text Text bla bla bla ..."; 
char txt1[]="abcdefghijklmnopqrstuvwxy";
char txt2[]="AAAAAAAbbbbbccccddddeeeff";
//                                     -
double entropy(BYTE *dat,int siz)
    {
    if ((siz<=0)||(dat==NULL)) return 0.0;
    int i; double H=0.0,P[256],dp=1.0/siz,base=1.0/log(2.0);
    for (i=0;i<256;i++) P[i]=0.0;
    for (i=0;i<siz;i++) P[dat[i]]+=dp;
    for (i=0;i<256;i++)
        {
        if (P[i]==0.0) continue;    // skip non existing items
        if (P[i]==1.0) return 0.0;  // this means only 1 item type is present in data
        H-=P[i]*log(P[i])*base;     // shanon entropy (binary bits base)
        }
    return H;
    }
//                                     -
__fastcall TForm1::TForm1(TComponent* Owner):TForm(Owner)
    {
    mm_log->Lines->Clear();
    mm_log->Lines->Add(AnsiString().sprintf("txt = \"%s\" , H = %.6lf , H/8 = %.6lf",txt0,entropy(txt0,sizeof(txt0)),entropy(txt0,sizeof(txt0))/8.0));
    mm_log->Lines->Add(AnsiString().sprintf("txt = \"%s\" , H = %.6lf , H/8 = %.6lf",txt1,entropy(txt1,sizeof(txt1)),entropy(txt1,sizeof(txt1))/8.0));
    mm_log->Lines->Add(AnsiString().sprintf("txt = \"%s\" , H = %.6lf , H/8 = %.6lf",txt2,entropy(txt2,sizeof(txt2)),entropy(txt2,sizeof(txt2))/8.0));
    }
//                                    -

和结果:

txt = "text Text bla bla bla ..." , H = 3.185667 , H/8 = 0.398208
txt = "abcdefghijklmnopqrstuvwxy" , H = 4.700440 , H/8 = 0.587555
txt = "AAAAAAAbbbbbccccddddeeeff" , H = 2.622901 , H/8 = 0.327863

相关问题 更多 >