आवाज पहचान: "हाँ" या "नहीं"?


33

कार्य

अधिकतम सटीकता के प्रशिक्षण के आधार पर स्रोत या बाइनरी कोड के न्यूनतम बाइट्स में एक कार्यक्रम को लागू करें जो आवाज के नमूने की आवाज की पहचान करता है (मुझे "हाँ", "हाँ" या "नहीं" आवाज में या कानाफूसी, स्पष्ट या चतुराई से) नमूने पर आधारित है। ।

कार्यक्रम पढ़ना चाहिए train/yes0.wav, train/no0.wav, train/yes1.wavऔर इतने पर (400 yeses और प्रशिक्षण डाटासेट में 400 noes हैं), तो पढ़ना शुरू inputs/0.wav, inputs/1.wavजब तक यह फ़ाइल खोजने के लिए है, यह विश्लेषण और outputting "हाँ" या "नहीं" (या अन्य के लिए शब्द में विफल रहता है मध्यवर्ती उत्तर)।

यदि आप चाहते हैं, तो आप पढ़ने के बजाय कार्यक्रम को पूर्व-प्रशिक्षित कर सकते हैं train/, लेकिन परिणामी डेटा तालिका स्कोर की ओर गिना जाता है (और प्रशिक्षण नमूनों से अधिक सावधान रहना - वे परीक्षा वाले के साथ ओवरलैप नहीं करते हैं)। इस मामले में परिशिष्ट के रूप में डेटा तालिका का उत्पादन करने के लिए उपयोग किए जाने वाले कार्यक्रम को शामिल करना बेहतर है।

सभी सैंपल फाइलें केवल एंडरॉयड / शोर में कमी के बिना, लैपटॉप माइक से, थोड़ा एंडियन 16-बिट स्टीरियो WAV फाइलें हैं।

सीमाएं

निषिद्ध विशेषताएं:

  • नेटवर्क का उपयोग करना;
  • उत्तर फ़ाइल तक पहुंचने की कोशिश कर रहा है inputs/key;
  • runnerसटीकता की गणना करने वाले कार्यक्रम को प्रस्तुत करना ;
  • मौजूदा मान्यता पुस्तकालयों का उपयोग करना। एफएफटी कार्यान्वयन के लिए लिंकिंग की अनुमति नहीं है: केवल बाहरी गणित कार्यों को लगातार जानकारी लेने (जैसे sinया atan2) की अनुमति है; यदि आप FFT चाहते हैं, तो इसे अपने प्रोग्राम सोर्स कोड में लागू करें (यदि आवश्यक हो तो यह बहुभाषी हो सकता है)।

संसाधन सीमाएँ:

  • प्रोग्राम को मेरे i5 लैपटॉप पर 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;

प्रत्येक कक्षा के अंदर, स्कोर बाइट्स की संख्या है जो समाधान लेता है।

स्वीकृत उत्तर: सबसे अच्छा गैर-रिक्त वर्ग में सबसे छोटा समाधान।

लिंक

सभी नमूनों को CC-0 (सार्वजनिक डोमेन) माना जाना चाहिए, लिपियों और कार्यक्रमों को MIT माना जाना चाहिए।

उदाहरण समाधान

यह मान्यता की बहुत खराब गुणवत्ता प्रदान करता है, बस दिखाता है कि फाइलों और आउटपुट उत्तरों को कैसे पढ़ा जाए

#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

C ++ 11 (gcc; 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);}

"Ungolfed" (हालांकि 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. FFT का उपयोग करके उन्हें संसाधित करें। अब हमने टाइम डोमेन से फ़्रीक्वेंसी डोमेन पर स्विच किया। हम कह सकते हैं कि परिणामी सरणी का 0 वां सेल 0Hz समकक्ष है और 2 13 -1 वां सेल 22050Hz समकक्ष है (ऐसा इसलिए है क्योंकि मैंने L चैनल से हर दूसरे नमूने को लिया है, इसलिए मेरा नमूना WAV की आवृत्ति, 44100Hz के बजाय 22050Hz है)।
  3. ऐसे सभी संकेतों का मतलब खोजें - इसे "माध्य आवृत्ति वितरण" कहें। इस तरह के वितरण में K उच्चतम चोटियों का पता लगाएं (यहां K = 75), पहले कुछ (शायद शोर) को छोड़ दें और अपनी ताकत ढूंढें। मैंने उपयोग किया log(mean distribution)+10और फिर सामान्य किया ताकि सबसे बड़ी चोटियों का योग 1 था।
  4. हमारे पास दो "शिखर वितरण" हैं - एक हां के लिए, दूसरा नंबर के लिए। यदि हमारे पास परीक्षण करने के लिए एक WAV है, तो हम इसे उसी तरह बदल देते हैं जैसे पहले (चरण 1, 2, 3) और वितरण डी प्राप्त करते हैं। जाँच करें कि कौन सा वितरण (Y / N) D के समान है। मैंने निम्नलिखित दृष्टिकोण का उपयोग किया: वाई / एन में प्रत्येक चोटी के लिए, इसे डी में खोजने की कोशिश करें। अगर हम इसे (लगभग) पाते हैं, तो इस चोटी का स्कोर वाई / एन और डी की ताकत के बीच पूर्ण अंतर है; विपरीत स्थिति में, यह वाई / एन की ताकत है (हम मानते हैं कि यह हमेशा सकारात्मक है)। बेहतर (छोटे) स्कोर जीतता है। यदि परिणाम बहुत करीब हैं (मैंने 0.01 पूर्ण अंतर का उपयोग किया है), आउटपुट dunno

जैसा कि मैंने कहा, शायद अंतिम परीक्षणों पर इसे "यादृच्छिक से भी बदतर" के रूप में वर्गीकृत किया जाएगा। बेशक, मुझे आशा है कि यह नहीं होगा: डी

संपादित करें: फिक्स्ड बग (फाइलों को बंद करना भूल गया)।


1
आप भाग्य में हैं अगर यह प्रदर्शन करता है worse than random। आपको सचमुच केवल एक बाइट को बदलने की आवश्यकता है - distYes > distNoऔर यह करेगा better than random। या इसे दूसरे तरीके से रखने के लिए, यह काफी आश्चर्यजनक होगा यदि आप एक पंक्ति में गलत तरीके से 100 बार सिक्का फ्लिप के परिणाम का अनुमान लगा सकते हैं! और यह उस सरल एल्गोरिदम से अनसुना नहीं है जो अधिक जटिल लोगों की तुलना में प्रदर्शन करते हैं, इसलिए +1 और मैं आपको शुभकामनाएं देता हूं।
ब्लटोरांगे 16

परीक्षण ... यह समय से पहले समाप्त हो जाता है EMFILE (Too many open files)... ठीक करने की कोशिश कर रहा है ...
वीआई।

अधिकतम खुली हुई फ़ाइल काउंटर से टकराया, अब यह काम करता है। परिणाम: प्रशिक्षण डाटासेट Accuracy: 983 ‰; Time: 0m27.570s;:; परीक्षा डेटासेट Accuracy: 960 ‰; Time: 0m32.957s:। बहुत बढ़िया।
वि।

ठीक है, मैंने यह तय किया। 10 बाइट्स अधिक। :)
mnbvmar

इनक्रेडिबल एस का उपयोग #define: पी
क्यूर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.