ভয়েস স্বীকৃতি: "হ্যাঁ" বা "না"?


33

কার্য

সর্বাধিক নির্ভুলতার সাথে প্রশিক্ষণের নমুনাগুলির উপর ভিত্তি করে নূন্যতম বাইটস উত্স বা বাইনারি কোডে একটি ভয়েস নমুনার স্বীকৃতি দেয় (আমি "হ্যাঁ", "হ্যাঁ" বা "না" বলেছি) ।

প্রোগ্রাম পড়া উচিত train/yes0.wav, train/no0.wav, train/yes1.wavইত্যাদি (সেখানে 400 yeses ও প্রশিক্ষণ ডেটাসেটে 400 প্রস্তাবের বিরূদ্ধে ভোট হয়), তারপর পড়া শুরু inputs/0.wav, inputs/1.wavযতক্ষণ না এটি ফাইল খুঁজতে, এটা বিশ্লেষণ এবং outputting "হ্যাঁ" অথবা "না" (অথবা অন্যান্য জন্য শব্দ ব্যর্থ মধ্যবর্তী উত্তর)।

আপনি যদি চান, আপনি পড়ার পরিবর্তে প্রোগ্রামটিকে প্রাক প্রশিক্ষণ দিতে পারেন train/, তবে ফলাফলের টেবিলটি স্কোরের দিকে গন্য হবে (এবং প্রশিক্ষণের নমুনাগুলিতে অতিমাত্রায় সাবধান থাকুন - তারা পরীক্ষার সাথে ওভারল্যাপ করে না)। এক্ষেত্রে সংযোজন হিসাবে ডেটা টেবিল উত্পাদন করতে ব্যবহৃত প্রোগ্রামটি অন্তর্ভুক্ত করা ভাল।

সমস্ত নমুনা ফাইল হ'ল ফিল্টারিং / শব্দ হ্রাস ছাড়াই, ল্যাপটপ মাইক থেকে 16-বিট স্টেরিও ডাব্লুএইভি ফাইলগুলি সামান্য এন্ডিয়ান are

সীমা

নিষিদ্ধ বৈশিষ্ট্য:

  • নেটওয়ার্ক ব্যবহার;
  • উত্তর ফাইলে পৌঁছানোর চেষ্টা করা inputs/key;
  • runnerনির্ভুলতার গণনা করে এমন প্রোগ্রামটি সাবভার্ট করা ;
  • বিদ্যমান স্বীকৃতি লাইব্রেরি ব্যবহার করে। এফএফটি বাস্তবায়নের সাথে সংযোগ স্থাপনের অনুমতি নেই: ধ্রুব পরিমাণ তথ্যের (যেমন sinবা atan2) গ্রহণকারী কেবলমাত্র বাহ্যিক গণিত ক্রিয়াকলাপ অনুমোদিত; আপনি যদি এফএফটি চান, কেবল এটি আপনার প্রোগ্রামের সোর্স কোডে প্রয়োগ করুন (এটি প্রয়োজনে বহুভাষিক হতে পারে)।

সংস্থান সীমা:

  • প্রোগ্রামটি আমার আই 5 ল্যাপটপে 30 মিনিটের বেশি সিপিইউ সময় নেবে না। যদি এটি আরও বেশি নেয় তবে কেবলমাত্র 30 মিনিটের মধ্যে উত্পাদিত আউটপুট গণনা করা হয় এবং অন্য কিছুকে অর্ধেক ম্যাচ ধরে নেওয়া হয়;
  • স্মৃতি সীমা: 1 জিবি (কোনও অস্থায়ী ফাইল সহ);

সরঞ্জামসমূহ

tools/runnerপ্রোগ্রাম স্বয়ংক্রিয়ভাবে আপনার সমাধান রান এবং নির্ভুলতার হিসাব করে।

$ tools/runner solutions/example train train/key 
Accuracy: 548 ‰

এটি প্রশিক্ষণের ডেটা ব্যবহার করে বা প্রকৃত পরীক্ষার ডেটা ব্যবহার করে প্রোগ্রামটি পরীক্ষা করতে পারে। আমি পরীক্ষার ডেটাসেটে জমা দেওয়া উত্তরগুলি চেষ্টা করতে যাচ্ছি এবং ফলাফল প্রকাশ করতে (নির্ভুলতা শতাংশ) না হওয়া পর্যন্ত আমি ডেটাसेटকে সর্বজনীন না করি।

স্কোরিং

নির্ভুলতার উপর নির্ভর করে সমাধানের 5 টি শ্রেণি রয়েছে:

  • সমস্ত নমুনা সঠিকভাবে অনুমান করা হয়েছে: ক্লাস 0;
  • নির্ভুলতা 950-999: ক্লাস 1;
  • যথার্থতা 835-950: ক্লাস 2;
  • যথার্থতা 720-834: ক্লাস 3;
  • নির্ভুলতা 615-719: ক্লাস 4;

প্রতিটি শ্রেণীর অভ্যন্তরে, স্কোরটি হল সমাধানগুলির দ্বারা নেওয়া বাইটের সংখ্যা।

গৃহীত উত্তর: সেরা Nompty ক্লাসে ক্ষুদ্রতম সমাধান।

লিংক

  • সরঞ্জাম সহ গিথুব প্রকল্প: https://github.com/vi/codegolf-jein
  • প্রশিক্ষণ ডেটাসেট: http://vi-server.org/pub/codegolf-jein-train.tar.xz
  • পরীক্ষার ডেটাসেটটি এতক্ষণ ব্যক্তিগত রাখা হয়েছে, গিথুব সংগ্রহস্থলে চেকসাম (এইচএমএসি) উপলব্ধ রয়েছে।

সমস্ত নমুনা সিসি -0 (পাবলিক ডোমেন) হিসাবে বিবেচনা করা উচিত, স্ক্রিপ্ট এবং প্রোগ্রামগুলি এমআইটি হিসাবে বিবেচনা করা উচিত।

উদাহরণ সমাধান

এটি স্বীকৃতির খুব নিম্নমানের সরবরাহ করে, কেবল ফাইল এবং আউটপুট উত্তর কীভাবে পড়তে হয় তা দেখায়

#define _BSD_SOURCE
#include <stdio.h>
#include <assert.h>
#include <endian.h>


#define Nvols 30

#define BASS_WINDOW 60
#define MID_WINDOW 4

struct training_info {
    double bass_volumes[Nvols];
    double mid_volumes[Nvols];
    double treble_volumes[Nvols];
    int n;
};


struct training_info yes;
struct training_info no;

static int __attribute__((const)) mod(int n, int d) {
    int m = n % d;
    if (m < 0) m+=d;
    return m;
}

// harccoded to 2 channel s16le
int get_file_info(const char* name, struct training_info *inf) {
    FILE* in = fopen(name, "rb");

    if (!in) return -1;

    setvbuf(in, NULL, _IOFBF, 65536);

    inf->n = 1;

    fseek(in, 0, SEEK_END);
    long filesize = ftell(in);
    fseek(in, 128, SEEK_SET);
    filesize -= 128; // exclude header and some initial samples

    int nsamples = filesize / 4; 

    double bass_a=0, mid_a=0;
    const int HISTSIZE  = 101;
    double xhistory[HISTSIZE];
    int histpointer=0;
    int histsize = 0;

    //FILE* out = fopen("debug.raw", "wb");

    int i;
    for (i=0; i<Nvols; ++i) {
        int j;

        double total_vol = 0;
        double bass_vol = 0;
        double mid_vol = 0;
        double treble_vol = 0;

        for (j=0; j<nsamples / Nvols; ++j) {
            signed short int l, r; // a sample
            if(fread(&l, 2, 1, in)!=1) break;
            if(fread(&r, 2, 1, in)!=1) break;
            double x = 1/65536.0 * ( le16toh(l) + le16toh(r) );


            bass_a += x;
            mid_a  += x;


            if (histsize == HISTSIZE-1) bass_a   -= xhistory[mod(histpointer-BASS_WINDOW,HISTSIZE)];
            if (histsize == HISTSIZE-1) mid_a    -= xhistory[mod(histpointer-MID_WINDOW ,HISTSIZE)];

            double bass = bass_a / BASS_WINDOW;
            double mid = mid_a / MID_WINDOW - bass;
            double treble = x - mid_a/MID_WINDOW;

            xhistory[histpointer++] = x;
            if(histpointer>=HISTSIZE) histpointer=0;
            if(histsize < HISTSIZE-1) ++histsize;

            total_vol  += bass*bass + mid*mid + treble*treble;
            bass_vol   += bass*bass;
            mid_vol    += mid*mid;
            treble_vol += treble*treble;


            /*
            signed short int y;
            y = 65536 * bass;

            y = htole16(y);
            fwrite(&y, 2, 1, out);
            fwrite(&y, 2, 1, out);
            */
        }

        inf->bass_volumes[i] = bass_vol / total_vol;
        inf->mid_volumes[i] = mid_vol / total_vol;
        inf->treble_volumes[i] = treble_vol / total_vol;

        //fprintf(stderr, "%lf %lf %lf    %s\n", inf->bass_volumes[i], inf->mid_volumes[i], inf->treble_volumes[i], name);
    }
    fclose(in);

    return 0;
}

static void zerotrdata(struct training_info *inf) {
    int i;
    inf->n = 0;
    for (i=0; i<Nvols; ++i) {
        inf->bass_volumes[i] = 0;
        inf->mid_volumes[i] = 0;
        inf->treble_volumes[i] = 0;
    }
}

static void train1(const char* prefix, struct training_info *inf) 
{
    char buf[50];

    int i;

    for(i=0;; ++i) {
        sprintf(buf, "%s%d.wav", prefix, i);
        struct training_info ti;
        if(get_file_info(buf, &ti)) break;

        ++inf->n;

        int j;
        for (j=0; j<Nvols; ++j) {
            inf->bass_volumes[j]   += ti.bass_volumes[j];
            inf->mid_volumes[j]    += ti.mid_volumes[j];
            inf->treble_volumes[j] += ti.treble_volumes[j];
        }
    }

    int j;
    for (j=0; j<Nvols; ++j) {
        inf->bass_volumes[j]   /= inf->n;
        inf->mid_volumes[j]    /= inf->n;
        inf->treble_volumes[j] /= inf->n;
    }
}

static void print_part(struct training_info *inf, FILE* f) {
    fprintf(f, "%d\n", inf->n);
    int j;
    for (j=0; j<Nvols; ++j) {
        fprintf(f, "%lf %lf %lf\n", inf->bass_volumes[j], inf->mid_volumes[j], inf->treble_volumes[j]);
    }
}

static void train() {
    zerotrdata(&yes);
    zerotrdata(&no);

    fprintf(stderr, "Training...\n");

    train1("train/yes", &yes);
    train1("train/no", &no);

    fprintf(stderr, "Training completed.\n");

    //print_part(&yes, stderr);
    //print_part(&no, stderr);

    int j;
    for (j=0; j<Nvols; ++j) {
        if (yes.bass_volumes[j]   > no.bass_volumes[j]) {   yes.bass_volumes[j] = 1;   no.bass_volumes[j] = 0; }
        if (yes.mid_volumes[j]    > no.mid_volumes[j]) {    yes.mid_volumes[j] = 1;    no.mid_volumes[j] = 0; }
        if (yes.treble_volumes[j] > no.treble_volumes[j]) { yes.treble_volumes[j] = 1; no.treble_volumes[j] = 0; }
    }
}


double delta(struct training_info *t1, struct training_info *t2) {
    int j;
    double d = 0;
    for (j=0; j<Nvols; ++j) {
        double rb = t1->bass_volumes[j] - t2->bass_volumes[j];
        double rm = t1->mid_volumes[j] - t2->mid_volumes[j];
        double rt = t1->treble_volumes[j] - t2->treble_volumes[j];
        d += rb*rb + rm*rm + rt*rt;
    }
    return d;
}

int main(int argc, char* argv[])
{
    (void)argc; (void)argv;

    train();


    int i;

    int yes_count = 0;
    int no_count = 0;

    for (i=0;; ++i) {
        char buf[60];
        sprintf(buf, "inputs/%d.wav", i);

        struct training_info ti;

        if(get_file_info(buf, &ti)) break;

        double dyes = delta(&yes, &ti);
        double dno = delta(&no, &ti);

        //printf("%lf %lf %s ", dyes, dno, buf);

        if (dyes > dno) {
            printf("no\n");
            ++no_count;
        } else  {
            printf("yes\n");
            ++yes_count;
        }
    }

    fprintf(stderr, "yeses: %d noes: %d\n", yes_count, no_count);

}

5
কোন ফিট লাইব্রেরি নেই? কেন?
জন ডিভোরাক

1
অন্তর্নির্মিত এফএফটি ফাংশন সম্পর্কে কী? বাহ্যিক হিসাবে গণনা ঠিক কি? এছাড়াও, গণিত গ্রন্থাগার ফাংশন হিসাবে কি গণনা করা হয়? আমাদের কি ব্যবহারের অনুমতি দেওয়া হচ্ছে sum, বা আমাদের ব্যবহারের প্রয়োজন foldl (+) 0(ভাঁজগুলি গণিত-নির্দিষ্ট নয়, এবং +বৈচিত্র্যময় নয়)?
জন ডিভোরাক

1
এখনও ... আপনি কার্যকরভাবে নিষেধ করছেন sum। আমার ধারণা এটা আপনার উদ্দেশ্য নয়?
জন ডিভোরাক

1
গণিত ফাংশনের সঠিক সংজ্ঞা কি? যারা সংখ্যার উপর পরিচালিত বিশেষায়িত হয়? সংখ্যার জন্য সংযোজন, কিন্তু স্ট্রিংগুলির জন্য সংমিশ্রণ ব্যবহার করে এমন জেনেরিক "যোগ" ফাংশন সম্পর্কে কী? এই যোগফল কি এখন অনুমোদিত?
জন ডিভোরাক

1
জে এর ভেক্টর অপারেশন সম্পর্কে কি? তাদের কি অনুমতি দেওয়া হচ্ছে না?
জন ডিভোরাক

উত্তর:


27

সি ++ 11 (জিসিসি; 1639 1625 1635 বাইট, ক্লাস 1, স্কোর = 983, 960)

এটা শুরু করা যাক. এটি সম্ভবত আমি দীর্ঘতম কোডটি দীর্ঘতম ...

#include <bits/stdc++.h>
#define $ complex<double>
#define C vector<$>
#define I int
#define D double
#define P pair<D,I>
#define Q pair<D,D>
#define E vector<D>
#define V vector<P>
#define W vector<Q>
#define S char*
#define Z(x)if(fread(&x,2,1,y)!=1)break;
#define B push_back
#define F(i,f,t)for(I i=f;i<t;i++)
#define _ return
#define J first
#define L second
const I K=75,O=16384;using namespace std;C R(C&i,I s,I o=0,I d=1){if(!s)_ C(1,i[o]);C l=R(i,s/2,o,d*2),h=R(i,s/2,o+d,d*2);C r(s*2);$ b=exp($(0,-M_PI/s)),f=1;F(k,0,s){r[k]=l[k]+f*h[k];r[k+s]=l[k]-f*h[k];f*=b;}_ r;}C T(C&i){_ R(i,i.size()/2);}char b[O];E U(S m){FILE*y;if(!(y=fopen(m,"r")))_ E();setvbuf(y,b,0,O);fseek(y,0,2);I z=ftell(y)/4-32;fseek(y,128,0);C p;F(i,0,z){short l,r;Z(l);Z(r);if(i&1)p.B($(0.5/O*le16toh(l),0));}p.resize(O);E h(O),n(O);p=T(p);F(j,0,O)h[j]=norm(p[j])/O;F(i,1,O-1)n[i]=(h[i-1]+h[i+1]+h[i]*8)/10;fclose(y);_ n;}W G(E&d){V p;F(i,3,O/2-3)if(d[i]==*max_element(d.begin()+i-3,d.begin()+i+4))p.B({d[i],i});sort(p.begin(),p.end(),greater<P>());W r;F(i,3,K+3)r.B({D(p[i].L)/O*22050,log(p[i].J)+10});D s=0;F(i,0,K)s+=r[i].L;F(i,0,K)r[i].L/=s;_ r;}char m[O];I X(S p,W&r){E t(O),h(t);I f=0;while(1){sprintf(m,"%s%d.wav",p,f++);h=U(m);if(!h.size())break;F(j,0,O)t[j]+=h[j];}F(j,0,O)t[j]/=f;r=G(t);}D Y(W&a,W&b){D r=0;F(i,0,K){D d=b[i].L;F(j,0,K)if(abs((b[i].J-a[j].J)/b[i].J)<0.015)d=min(d,abs(b[i].L-a[j].L));r+=d;}_ r;}I H(S p,W&y,W&n){I f=0;while(1){sprintf(m,"%s%d.wav",p,f++);E h=U(m);if(!h.size())break;W p=G(h);D q=Y(p,y),r=Y(p,n);printf(abs(q-r)<=0.01?"?\n":q<r?"yes\n":"no\n");}}I main(){W y,n;X("train/yes",y);X("train/no",n);H("inputs/",y,n);}

"অবহেলিত" (যদিও এটি 1.5K এর বেশি উত্স কোডটি গল্ফ করা কল করা শক্ত):

#include <iostream>
#include <stdio.h>
#include <string>
#include <algorithm>
#include <vector>
#include <math.h>
#include <complex>
#include <endian.h>
#include <functional>

using namespace std;

typedef complex<double> CD;

vector<CD> run_fft(vector<CD>& input, int offset, int size, int dist){
    if(size == 1){
        return vector<CD>(1, input[offset]);
    }
    vector<CD> partLow = run_fft(input, offset, size/2, dist*2),
               partHi  = run_fft(input, offset+dist, size/2, dist*2);

    vector<CD> result(size);
    CD factorBase = exp(CD(0, (inv?2:-2)*M_PI/size)), factor = 1;

    for(int k = 0; k < size/2; k++){
        result[k] = partLow[k] + factor*partHi[k];
        result[k+size/2] = partLow[k] - factor*partHi[k];
        factor *= factorBase;
    }
    return result;
}

vector<CD> fft(vector<CD>& input){
    int N = input.size();
    return run_fft(input, 0, N, 1);
}



const int MAX_BUF = 65536;
const int PWR_TWO = 16384;
const int NUM_CHECK = 75;
int sampling;

char buf[MAX_BUF];
vector<double> read_data(char* filenam){
    FILE* fp = fopen(filenam, "r");
    if(!fp)
        return vector<double>();
    setvbuf(fp, buf, _IOFBF, MAX_BUF);

    fseek(fp, 0, SEEK_END);
    int filesiz = ftell(fp);
    fseek(fp, 128, SEEK_SET);
    filesiz -= 128;

    int insamp = filesiz / 4;
    int freqsamp = 2,
        act_mod = 0;
    sampling = 44100 / freqsamp;
    int inputSize;

    vector<CD> input;

    for(int i = 0; i < insamp; i++){
        signed short int l, r;
        if(fread(&l, 2, 1, fp) != 1) break;
        if(fread(&r, 2, 1, fp) != 1) break;

        double act = 1/32768.0 * (le16toh(l));

        if((++act_mod) == freqsamp){
            inputSize++;
            input.push_back(CD(act,0));
            act_mod = 0;
        }
    }
    inputSize = input.size();

    //printf("%s\n", filenam);
    int numParts = (inputSize+PWR_TWO-1)/PWR_TWO;
    double partDelta = (double)inputSize / numParts, actDelta = 0;
    vector<CD> ndata(PWR_TWO);
    for(int i = 0; i < numParts; i++){
        vector<CD> partInput(PWR_TWO);
        int from = floor(actDelta),
            to = floor(actDelta)+PWR_TWO;

        for(int j = from; j < to; j++)
            partInput[j-from] = input[j];

        vector<CD> partData = fft(partInput);
        for(int j = 0; j < PWR_TWO; j++)
            ndata[j] += partData[j]*(1.0/numParts);
    }


    vector<double> height(PWR_TWO);
    for(int i = 0; i < PWR_TWO; i++)
        height[i] = norm(ndata[i])/PWR_TWO;

    vector<double> nheight(height);
    nheight[0] = (height[0]*0.8 + height[1]*0.1)/0.9;
    nheight[PWR_TWO-1] = (height[PWR_TWO]*0.8 + height[PWR_TWO-1]*0.1)/0.9;
    for(int i = 1; i < PWR_TWO-1; i++)
        nheight[i] = height[i-1]*0.1 + height[i]*0.8 + height[i+1]*0.1;

    fclose(fp);

    return nheight;
}


vector< pair<double,double> > get_highest_peaks(vector<double>& freqData){
    vector< pair<double,int> > peaks;

    for(int i = 3; i < PWR_TWO/2-3; i++){
        if(freqData[i] == *max_element(freqData.begin()+i-3, freqData.begin()+i+4)){
            peaks.push_back(make_pair(freqData[i], i));
        }
    }

    sort(peaks.begin(), peaks.end(), greater< pair<double,int> >());

    vector< pair<double,double> > res;
    for(int i = 3; i < NUM_CHECK+3; i++){
        res.push_back(make_pair((double)(peaks[i].second)/PWR_TWO*sampling, log(peaks[i].first)+10));
    }

    double sum_res = 0;
    for(int i = 0; i < NUM_CHECK; i++)
        sum_res += res[i].second;
    for(int i = 0; i < NUM_CHECK; i++)
        res[i].second /= sum_res;

    /*for(int i = 0; i < NUM_CHECK; i++)
        printf("%12lf %12lf\n", res[i].first, res[i].second);
    printf("\n");*/

    return res;
}


void train(char* dir, const char* type, vector< pair<double,double> >& res){
    vector<double> result(PWR_TWO), height(PWR_TWO);

    int numFile = 0;
    while(true){
        char filenam[256];
        snprintf(filenam, 255, "%s/%s%d.wav", dir, type, numFile);
        height = read_data(filenam);

        if(height.size() == 0)
            break;

        for(int j = 0; j < PWR_TWO; j++)
            result[j] += height[j];

        numFile++;
    }
    fprintf(stderr, "trained %s on %d files\n", type, numFile);

    for(int j = 0; j < PWR_TWO; j++)
        result[j] /= numFile;

    res = get_highest_peaks(result);
}


double dist_ab(vector< pair<double,double> >& A, vector< pair<double,double> >& B){
    double result = 0;
    for(int i = 0; i < NUM_CHECK; i++){
        double add = B[i].second;

        for(int j = 0; j < NUM_CHECK; j++){
            double dist = (B[i].first-A[j].first)/B[i].first;
            if(abs(dist) < 0.015)
                add = min(add, abs(B[i].second - A[j].second));
        }
        result += add;
    }
    return result;
}


void trial(char* dir, const char* pref, vector< pair<double,double> >& yes,
                                        vector< pair<double,double> >& no){
    int numFile = 0;
    int numYes = 0, numDunno = 0, numNo = 0;
    while(true){
        char filenam[256];
        snprintf(filenam, 255, "%s/%s%d.wav", dir, pref, numFile);

        vector<double> height = read_data(filenam);
        if(height.size() == 0)
            break;

        vector< pair<double,double> > peaks = get_highest_peaks(height);


        double distYes = dist_ab(peaks, yes),
               distNo = dist_ab(peaks, no);

        if(abs(distYes-distNo) <= 0.01){
            printf("dunno\n");
            numDunno++;
        } else if(distYes < distNo){
            printf("yes\n");
            numYes++;
        } else {
            printf("no\n");
            numNo++;
        }
        //printf(" (%lf %lf)\n", distYes, distNo);

        numFile++;
    }
}


int main(int argc, char** argv){
    vector< pair<double,double> > yes, no;


    train("train", "yes", yes);
    train("train", "no", no);

    trial("inputs", "", yes, no);
}

সত্যিকারের ডেটা সেটটিতে এটি সঠিকভাবে কাজ করবে কিনা আমার কাছে কোন প্রবণতা ধারণা নেই (আমি বাজি ধরেছি এটি হবে না, তবে আমার অবশ্যই চেষ্টা করা উচিত)।

কিভাবে এটা কাজ করে:

  1. বাম চ্যানেল থেকে এন = 2 14 নমুনা নিন , প্রতিটি সমান সময়সীমার মধ্যে। এগুলিকে সাধারণ করুন যাতে ন্যূনতম মান = 0 এবং সর্বোচ্চ মান = 1।
  2. এফএফটি ব্যবহার করে তাদের প্রক্রিয়া করুন। এখন আমরা সময় ডোমেন থেকে ফ্রিকোয়েন্সি ডোমেনে স্যুইচ করেছি। আমরা বলতে পারি যে ফলস্বরূপ অ্যারের 0 তম সেল 0Hz সমতুল্য এবং 2 13 -1st সেল 22050Hz সমতুল্য (এটি কারণ আমি এল চ্যানেল থেকে অন্যান্য প্রতিটি নমুনা নিয়েছি, সুতরাং আমার নমুনাটি WAV এর ফ্রিকোয়েন্সিটির পরিবর্তে 22050Hz, 44100Hz)।
  3. এই জাতীয় সমস্ত সংকেতের গড়টি আবিষ্কার করুন - এটিকে "ফ্রিকোয়েন্সি বিতরণের অর্থ" বলুন। প্রথম কয়েকটি (সম্ভবত শব্দ) বাদ দিয়ে কে এই ধরণের বিতরণে কে সর্বাধিক শিখর (এখানে কে = 75) সন্ধান করুন এবং তাদের শক্তি সন্ধান করুন। আমি ব্যবহার করেছিলাম log(mean distribution)+10এবং তারপরে নরমালাইজ করি যাতে বৃহত্তম চূড়ার সমষ্টি 1 হয়।
  4. আমাদের দুটি "শিখর বিতরণ" রয়েছে - একটি হ্যাঁর জন্য দ্বিতীয়, নংয়ের জন্য দ্বিতীয় যদি আমাদের পরীক্ষার জন্য ডাব্লুএইভি থাকে তবে আমরা এটিকে আগের মতোই রূপান্তরিত করব (পদক্ষেপ 1, 2, 3) এবং ডি ডিস্ট্রিবিশন পেয়ে যাব তারপর আমাদের কোন বিতরণ (Y / N) ডি এর সাথে আরও মিল রয়েছে তা পরীক্ষা করুন। আমি নিম্নলিখিত পদ্ধতির ব্যবহার করেছি: ওয়াই / এন এর প্রতিটি শিখরের জন্য, এটি ডি তে সন্ধান করার চেষ্টা করুন যদি আমরা এটি (প্রায়) খুঁজে পাই তবে এই শিখরের স্কোরটি ওয়াই / এন এবং ডি এর শক্তির মধ্যে পরম পার্থক্য; বিপরীত ক্ষেত্রে, এটি ওয়াই / এন এর শক্তি (আমরা ধরে নিই এটি সর্বদা ইতিবাচক)। আরও ভাল (ছোট) স্কোর জেতে ফলাফলগুলি খুব কাছাকাছি থাকলে (আমি 0.01 পরম পার্থক্য ব্যবহার করেছি), আউটপুট dunno

আমি যেমন বলেছি, সম্ভবত চূড়ান্ত পরীক্ষায় এটি "এলোমেলো থেকেও খারাপ" হিসাবে শ্রেণিবদ্ধ করা হবে। অবশ্যই, আমি আশা করি এটি হবে না: ডি

সম্পাদনা: স্থির বাগ (ফাইলগুলি বন্ধ করতে ভুলে গেছেন)।


1
যদি এটা সঞ্চালিত আপনি ভাগ্য হয় worse than random। আপনাকে আক্ষরিকভাবে কেবল একটি বাইট পরিবর্তন করতে distYes > distNoহবে - এবং এটি করবে better than random। অথবা এটিকে অন্যভাবে বলতে গেলে, আপনি যদি এক মুদ্রার ফলকে ভুলভাবে একটানা 100 বার উল্টাতে অনুমান করতে পারেন তবে এটি অবাক করে দেওয়া হবে! এবং এটি সাধারণ জটিল অ্যালগরিদমগুলি আরও জটিলগুলির চেয়ে কার্যকর নয় বলে শোনা যায় না, সুতরাং +1 এবং আমি আপনাকে শুভকামনা জানাচ্ছি।
ব্লুটোরেঞ্জ

পরীক্ষা করা হচ্ছে ... এর কারণে এটি অকালে শেষ হয়ে যায় EMFILE (Too many open files)... ঠিক করার চেষ্টা করা হচ্ছে ...
vi।

বাম্পড সর্বাধিক উন্মুক্ত ফাইলের কাউন্টার, এখন এটি কাজ করে। ফলাফল: প্রশিক্ষণ ডেটা সেটটি: Accuracy: 983 ‰; Time: 0m27.570s;; পরীক্ষা ডেটা সেটটি: Accuracy: 960 ‰; Time: 0m32.957s। ভাল করেছ.
vi।

ঠিক আছে, আমি এটি ঠিক করেছি। আরও 10 বাইট। :)
mnbvmar

#defineS এর অবিশ্বাস্য ব্যবহার : পি
Qwr
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.