Giter VIP home page Giter VIP logo

libuaic's Introduction

libuaic

uAIC is a small machine learning library for C.

Features

  • Designed to be easy to use and integrate into your C projects.
  • Provides a range of functionalities for data preprocessing, model training, and prediction.
  • Supports supervised learning tasks.
  • Offers high-performance capabilities to handle large datasets.
  • Includes comprehensive documentation and examples to help you get started quickly.

Installation

To use uAIC in your C projects, follow these steps:

  1. Clone the repository: git clone https://github.com/CodenameSource/libuaic.git
  2. Navigate to the project directory: cd libuaic
  3. Compile the library: make lib
  4. Link the library with your project: gcc -o myproject myproject.c -I./include -L./lib -luaic
  5. Run your project: ./myproject

Usage

Once you have linked the library with your project, you can start using uAIC. Here's a simple example to demonstrate how to train a linear regression model:

int main()
{
    DataFrame test = {0}, X = {0}, Y = {0};
    UAI_MUST(df_load_csv(&test, "csv/houses.csv", ','));
    df_set_header(&test, true);

    df_to_double(&test, DATACELL_CONVERT_STRICT);
    df_normalize(&test);

    srand(time(NULL));

    UAI_MUST(df_create_vsplit(&test, &Y, 1, DATAFRAME_SAMPLE_SEQ));
    UAI_MUST(df_create_vsplit(&test, &X, 4, DATAFRAME_SAMPLE_SEQ));

    LinearRegressor *reg = lr_init();
    lr_fit(reg, &X, &Y, 2000, 0.015);

    for (size_t r=0; r < Y.rows; ++r)
        printf("%lf\n", uai_denormalize_value(lr_predict(reg, X.data[r], X.cols), Y.data[0][0].min, Y.data[0][0].delta));

    lr_destroy(reg);

    df_destroy(&test);
    df_destroy(&X);
    df_destroy(&Y);
}

For more detailed information on the available functionalities and how to use them, refer to the documentation.

Example code

Extensive example code is provided in the examples/ directory. You can build and run the examples using:

$ make

All the binaries will be built in ./examples/*.out.

The following examples are available:

  • dataframe/load_csv
  • dataframe/convert
  • dataframe/export_csv
  • dataframe/split
  • dataframe/fill
  • dataframe/resize
  • dataframe/scale_data
  • logistic_regression/logistic_regression
  • classification/decision_tree
  • linear_regression/linear_regression

Contributing

Contributions are welcome! If you would like to contribute to uAIC, please follow the guidelines outlined in CONTRIBUTING.md.

License

This project is licensed under the GPL License.

libuaic's People

Contributors

bvpav avatar codenamesource avatar

Watchers

 avatar

libuaic's Issues

Linear Regression

Имплементиране на множествена линейна регресия

Структура на линейната регресия

  • image
    x - Матрица с feature променливите, w - Матрица с коефициентите, b - отклонение

  • Структура с коефициенти

  • Loss function, фунцкия калкулираща грешката на предсказания, от алгоритъма, резултат от реалния (За едно поле от тренировъчните данни)
    image
    Minimum squared error

  • Optimizer function - Gradient descent, оптимизираща функция

  • Fit function, функция която тренира алгоритъма върху въведените данни

  • Predict function, функция която взима коефициентите и връща предсказания резултат спрямо въведените данни на базата на тренираните коефициенти

Ресурси

Support Vector Regression

Имплементиране на регресия с помощен вектор(SVR)

Структура на SVR

  • Структура с коефициенти и указатели към методите на алгоритъма
  • Loss function, фунцкия калкулираща грешката на предсказания, от алгоритъма, резултат от реалния (За едно поле от тренировъчните данни)
  • Optimizer function - Gradient descent, оптимизираща функция
  • Fit function, функция която тренира алгоритъма върху въведените данни
  • Predict function, функция която взима коефициентите и връща предсказания резултат спрямо въведените данни на базата на тренираните коефициенти

Ресурси

Parse-ване на числа от клетки за данни

Нужно е библиотеката да може да превръща низовете, заредени в DataFrame, в числа.

Така предлагам да работи:

Типове данни

Трябва да поддържа следните типове

  • double
  • int/long long не съм сигурен дали е нужно

Псевдокод на интерфейса

  • Ако имаме DataFrame:
DataFrame df = ...;
// df.data[0][0].type == DATA_CELL_STR
//     => е валидно да се прочете стойността на низа:
df.as_str;
//        и е невалидно да се достъпват:
df.as_double; // (примерно)
  • Можем да преобразуваме цяла колона в double:
df_col_to_double(&df, /* колона: */ 0);
// вече:
df.data[0][0].type == DATA_CELL_DOUBLE;
// но все още:
df.data[0][1].type == DATA_CELL_STR;
// и вече е валидно:
df.data[0][0].as_double;
// и .as_str е недефинирано
  • Или можем да преобразуваме цялата DataFrame таблица:
df_all_to_double(&df);
  • Ако някой низ не е валидно число:
df.data[0][0] = "invalid";
df_col_to_double(&df, 0);
// тогава то става not a number:
df.data[0][0].type == DATA_CELL_NAN;
// достъпването на всичко .as_* е невалидно
  • Ако при преобразуването срещнем клетка, чийто тип не е DATA_CELL_STR, я игнорираме
    • Ако решим, че поддържаме int, в този случай ще правим преобразование от int -> double, или обратно.

Бележка: DATA_CELL_NAN означава, че символният низ не е бил валидно число. Не е същото като NaN стойността на double типа. Възможно е DataCell.type == DATA_CELL_DOUBLE и as_double да има NaN стойност.

Начин на преобразование от низ в double

Става със стандартната strtod(). Това означава, че приема същите формати, които приема тя; тоест можем да преобразуваме шестнайсетични числа, ако те имат представка 0x, безкрайност и NaN стойност. Можем да включим допълнителни проверки, ако решим, че не искаме да допускаме това.

Предложение: възможно е да прави строги или нестроги преобразования:

  • пример за строго преобразование:
"12" -> 12.0
"12 km" -> DATA_CELL_NAN
  • пример за нестрого преобразование:
"12" -> 12.0
"12 km" -> 12.0 (остатък: " km", игнориран)

изборът става с отделен параметър на функцията:

df_all_to_double(&df, DATA_CELL_CONVERT_STRICT); // строго
df_all_to_double(&df, DATA_CELL_CONVERT_LAX); // нестрого

ПС: Алтернативно представяне на DATA_CELL_NAN случая

Премахваме DATA_CELL_NAN. Ако има низ, който не може да бъде преобразуван в число - строго или нестрого (в зависимост от параметъра), тогава DataCell.type става DATA_CELL_DOUBLE и стойността на .as_double приема NaN стойност, която в последствие може да бъде проверена от isnan().

Въпроси

  • Всичките ли описани функционалности са необходими за първи release на библиотеката?
    • Кои от тях не са необходими?
    • Пропускам ли нещо, което е?
  • Нужно ли е да поддържаме целочислени типове?
    • От една страна, ни усложняват, но от друга, може да са необходими понякога
  • Добра идея ли е да поддържаме преобразование на "INFINITY" / "NAN" / "0x..." в double?
    • Ако го забраняваме, би ни усложнило.
  • double или long double?
  • Необходимо ли е да продължаваме да съхраняваме стойността на низа след като сме го преобразували в число?
  • Добри ли са предложените имена за функции?
    • Кое е по-добре за имената на константите: DATA_CELL_*, или DC_* (пр. DC_STR, DC_CONVERT_LAX)

Decision trees

Имплементиране на Decision tree модел за класификация

Структура на модела

  • Структура на Decision tree модела
  • Структура на отделния възел от дървото
    Псевдо код:
struct Node {
    size_t feature_index; // Индексът на feature-а който се проверява от възела
    double threshold;     // Стойността спрямо която възела проверява съответния feature
    struct Node *left, *right; 
    size_t class_prediction; // Класът който се връща ако възела е листо на дървото
};
  • Loss function, пресмятa IG(information gain)-а при сплит-а
    Изваждаме сумата на ентропията на по-долните възли от ентропията на корена
    image
    Формула за пресмятане на ентропията за отделния node
  • Функция за оценяване на потенциалните разклонения на дървото
  • Функция за обхождане на дървото
  • Fit function
  • Predict function

Ресурси

Logistic Regression

Имплементиране на методите и функциите за логистична регресия

Структура на логистичната регресия

  • Структура с коефициенти и указатели към методите на алгоритъма

  • Сигмоидна функция приемаща за вход резултат от линейна регресия
    image
    Сигмоидна функция
    image
    Енкапсулирана линейна регресия(В случая множествена линейна регресия)

  • Loss function, фунцкия калкулираща грешката на предсказания, от алгоритъма, резултат от реалния (За едно поле от тренировъчните данни)
    image
    ->
    image

  • Cost function, функция калкулираща грешката на модела върху целите тренировъчни данни
    image

  • Optimizer function - Gradient descent, оптимизираща функция
    image
    Gradient descent, very scary math

  • Fit function, функция която тренира алгоритъма върху въведените данни

  • Predict function, функция която взима коефициентите и връща предсказания резултат спрямо въведените данни на базата на тренираните коефициенти

Ресурси за справка:

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.