SEFR: Ultra Düşük Güçlü Cihazlar için Hızlı Doğrusal Zamanlı Sınıflandırıcı

Gömülü senaryolar için mükemmel, küçük ve doğru yepyeni bir ikili sınıflandırıcı: minimum bellek ayak izi ile kolayca 90%+ doğruluk elde edin!

sefr

SEFR: Ultra Düşük Güçlü Cihazlar için Hızlı Doğrusal Zamanlı Sınıflandırıcı, yazarların ikili bir sınıflandırıcı geliştirdiği Hamidreza Keshavarz, Mohammad Saniee Abadeh, Reza Rawassizadeh’den bir makaledir:

  • Öğrenme sırasında hızlı
  • Tahmin sırasında hızlı
  • Minimum bellek gerektirir

Gömülü makine öğrenimi için özel olarak tasarlanmıştır, bu nedenle mikro denetleyicilerde çalıştırmak için herhangi bir optimizasyon gerekmez: tasarım gereği küçüktür. Kısacası, pozitif ve negatif sınıf arasında ayrım yapmak için özelliklerin ortalamalarının ağırlıklar artı bir önyargı olarak bir kombinasyonunu kullanır. Makaleyi okursanız, kesinlikle anlayacaksınız.

Nasıl Kullanılır

Yazarlar, okuyabileceğiniz Github’da hem C hem de Python uygulaması sağladı.

İşte bir Python örneği.

from sefr import SEFR
from sklearn.datasets import load_iris
from sklearn.preprocessing import normalize
from sklearn.model_selection import train_test_split

if __name__ == '__main__':
    iris = load_iris()
    X = normalize(iris.data)
    y = iris.target
    X = X[y < 2]
    y = y[y < 2]
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
    clf = SEFR()
    clf.fit(X_train, y_train)
    print('accuracy', (clf.predict(X_test) == y_test).sum() / len(y_test))

Sonuçlar:

Veri kümesiÖzellik sayısıKesinlik
İris4100%
Meme kanseri30%89
Wine13%84
Rakamlar64%99

Modelin özellik başına sadece 1 ağırlığa ihtiyaç duyduğunu düşünürsek, bu sonuçların etkileyici olduğunu düşünüyoruz.

Mikromlgen Entegrasyonu

from sefr import SEFR
from sklearn.datasets import load_iris
from micromlgen import port

if __name__ == '__main__':
    iris = load_iris()
    X = iris.data
    y = iris.target
    X = X[y < 2]
    y = y[y < 2]
    clf = SEFR()
    clf.fit(X_train, y_train)
    print(port(clf))
#pragma once
namespace Eloquent {
    namespace ML {
        namespace Port {
            class SEFR {
                public:
                    /**
                    * Predict class for features vector
                    */
                    int predict(float *x) {
                        return dot(x,   0.084993602632  , -0.106163278477  , 0.488989863684  , 0.687022900763 ) <= 2.075 ? 0 : 1;
                    }

                protected:
                    /**
                    * Compute dot product between features vector and classifier weights
                    */
                    float dot(float *x, ...) {
                        va_list w;
                        va_start(w, 4);
                        float kernel = 0.0;

                        for (uint16_t i = 0; i < 4; i++) {
                            kernel += x[i] * va_arg(w, double);
                        }

                        return kernel;
                    }
                };
            }
        }
    }

Arduino çiziminizde:

#include "IrisSEFR.h"
#include "IrisTest.h"

void setup() {
    Serial.begin(115200);
}

void loop() {
    Eloquent::ML::Port::SEFR clf;
    Eloquent::ML::Test::IrisTestSet testSet;

    testSet.test(clf);
    Serial.println(testSet.dump());
    delay(5000);
}

Kodu derlemek için Github örneğini klonlamanız gerekir.