AttributeError: модуль 'utils' не имеет атрибута 'load_data'

На мой взгляд, вышеупомянутый ответ действительно дает некоторый «случайный» float, но ни один из них не является поистине случайным поплавком (т. е. они пропускают часть представления float). Прежде чем я буду спешить с моей реализацией, сначала рассмотрим стандартный формат ANSI / IEEE для float:

| sign (1-bit) | e (8 бит) | f (23-бит) |

число, представленное этим словом, равно (-1 * sign) * 2 ^ e * 1.f

отметить, что число «e» равно (с смещением 127), таким образом, варьируя от -127 до 126. Самая простая (и фактически самая случайная) функция состоит в том, чтобы просто записать данные случайного int в поплавок, таким образом

int tmp = rand();
float f = (float)*((float*)&tmp);

обратите внимание, что если вы сделаете float f = (float)rand();, он преобразует целое число в float (таким образом, 10 станет 10.0). Итак, если вы хотите ограничить максимальное значение, вы можете сделать что-то вроде (не уверен, что это работает)

int tmp = rand();
float f = *((float*)&tmp);
tmp = (unsigned int)f       // note float to int conversion!
tmp %= max_number;
f -= tmp;

, но если вы посмотрите на структуру поплавка, вы увидите, что максимальное значение float (приблизительно) 2 ^ 127, который больше, чем максимальное значение int (2 ^ 32), таким образом исключая значительную часть чисел, которые могут быть представлены поплавком. Это моя окончательная реализация:

/**
 * Function generates a random float using the upper_bound float to determine 
 * the upper bound for the exponent and for the fractional part.
 * @param min_exp sets the minimum number (closest to 0) to 1 * e^min_exp (min -127)
 * @param max_exp sets the maximum number to 2 * e^max_exp (max 126)
 * @param sign_flag if sign_flag = 0 the random number is always positive, if 
 *              sign_flag = 1 then the sign bit is random as well
 * @return a random float
 */
float randf(int min_exp, int max_exp, char sign_flag) {
    assert(min_exp <= max_exp);

    int min_exp_mod = min_exp + 126;

    int sign_mod = sign_flag + 1;
    int frac_mod = (1 << 23);

    int s = rand() % sign_mod;  // note x % 1 = 0
    int e = (rand() % max_exp) + min_exp_mod;
    int f = rand() % frac_mod;

    int tmp = (s << 31) | (e << 23) | f;

    float r = (float)*((float*)(&tmp));

    /** uncomment if you want to see the structure of the float. */
//    printf("%x, %x, %x, %x, %f\n", (s << 31), (e << 23), f, tmp, r);

    return r;
}

с использованием этой функции randf(0, 8, 0) вернет случайное число между 0.0 и 255.0

-1
задан Michael Titian Adinata 23 February 2019 в 12:20
поделиться

1 ответ

Для тех, кто хочет знать решение. Я полагаю, что он тестирует пакет от FeatureTools.

https://github.com/Featuretools/predict-remaining-useful-life

import utils - это не то, что вы устанавливаете с помощью conda или pip install, а утилиты Скрипт .py можно скачать со страницы gitub FeatureTools.

0
ответ дан Jake 23 February 2019 в 12:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: