Точечная диаграмма одномерных бимодальных данных из sklearn make_blobs ()

Вот метод получения свойства или вложенного объекта из объекта с использованием нотации пути. Это адаптация аналогичного вопроса, заданного «Prusprus» в 2014 году.

У меня есть файл конфигурации с вложенными массивами и вы хотите получить доступ к данным с веб-страницы, отправив путь в form:

"unit_cfg [2] .chn_cfg [7] .chn_type"

Эта функция вернет одно свойство или объект. Да, это можно упростить ...

function fetchFromObject(obj: Object, path: string): boolean | Object {
var dot_idx: number;
var lbkt_idx: number;
var rbkt_idx: number;
var prop: string;
var prop_idx: number;
var new_obj: Object;
var new_path: string;

// Return if no object.
if (typeof obj === 'undefined') {
    return false;
}

// Get index of first left bracket in path.
lbkt_idx = path.indexOf('[');
// If left bracket.
if (lbkt_idx > -1) {
    // Get right bracket index.
    rbkt_idx = path.indexOf(']');
}
// Get index of first dot in path.
dot_idx = path.indexOf('.');

/*
 * Most complicated situation is if there are both brackets
 * and dots in the path. This means we have a mixture of both
 * indexed and non-indexed properties:
 *
 *      x[].y --or-- x.y[]
 *
 * In this case, we must see if the indexed property is before
 * or after the non-indexed property.
 *
 * In either case, we must recurse.
 */
if ((lbkt_idx > -1) && (dot_idx > -1)) {
    // If bracket is before dot: x[].y
    if (lbkt_idx < dot_idx) {
        // Get property string.
        prop = path.substr(0, lbkt_idx);
        // Get index.
        prop_idx = Number(path.substring(lbkt_idx + 1, rbkt_idx));
        // Get path to right of dot.
        new_path = path.substr(dot_idx + 1);
        // Get new object.
        new_obj = obj[prop][prop_idx];
        // Recurse.
        return fetchFromObject(new_obj, new_path);
    }
    // Else dot before bracket: x.y[]
    else {
        // Get property string.
        prop = path.substr(0, dot_idx);
        // Get path to right of dot.
        new_path = path.substr(dot_idx + 1);
        // Get new object.
        new_obj = obj[prop];
        // Recurse.
        return fetchFromObject(new_obj, new_path);
    }
}
/*
 * Else recurse if dotted property; x.y
 */
else if (dot_idx > -1) {
    // Get property string.
    prop = path.substr(0, dot_idx);
    // Get path to right of dot.
    new_path = path.substr(dot_idx + 1);
    // Get new object.
    new_obj = obj[prop];
    // Recurse.
    return fetchFromObject(new_obj, new_path);
}
/*
 * Else done if single indexed property: x[]
 */
else if (lbkt_idx > -1) {
    // Get property string.
    prop = path.substr(0, lbkt_idx);
    // Get index.
    prop_idx = Number(path.substring(lbkt_idx + 1, rbkt_idx));
    // Return with object.
    return obj[prop][prop_idx];
}
/*
 * Else single non-indexed property.
 */
return obj[path];

}

0
задан desertnaut 25 March 2019 в 10:52
поделиться

1 ответ

Ваша проблема несколько неясна.

Я пробовал plt.hist(), что дает еще один нормальный график распределения.

Ну, не совсем; это дает бимодальную гауссову смесь график:

arr, blob_labels = make_blobs(n_samples=1000, n_features=1, 
                                centers=2, random_state=1)

a = plt.hist(arr, bins=np.arange(int(np.min(arr))-1,int(np.max(arr))+1,0.5), width = 0.3)

enter image description here

, как и ожидалось, так как теперь мы имеем [114 ].

Я понятия не имею, как использовать plt.scatter() с данными.

По определению для диаграммы рассеяния требуются двумерные данные; из документов :

Диаграмма рассеяния y против x с изменяющимся размером маркера и / или цветом.

, в то время как здесь, благодаря n_features=1, у нас на самом деле есть только x и нет y .

1D «график рассеяния» на самом деле является линией, и мы можем использовать plot для ее визуализации, как хорошо объяснено в Как построить 1-d данные при заданном значении y с помощью pylab ; в вашем случае:

val = 0. # this is the value where you want the data to appear on the y-axis.
a = plt.plot(arr, np.zeros_like(arr) + val, 'x')

enter image description here

, где, конечно, следует помнить, что вертикальная ось - это просто удобство для визуализации и ничего не говорит о наших данных, которые вообще не имеют значения y .

Хотите использовать разные цвета и / или маркеры для каждого центра?

val = 0. # this is the value where you want the data to appear on the y-axis.
plt.plot(arr[blob_labels==0], np.zeros_like(arr[blob_labels==0]) + val, 'x', color='y')
plt.plot(arr[blob_labels==1], np.zeros_like(arr[blob_labels==1]) + val, '+', color='b')
plt.show()

enter image description here

где для больших выборок начинается ситуация становится несколько интереснее; обратите внимание на перекрытие для n_samples=10000:

enter image description here

0
ответ дан desertnaut 25 March 2019 в 10:52
поделиться
Другие вопросы по тегам:

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