дискретизация

Сгруппировать данные в интервалы или категории

Синтаксис

Y = discretize(X,edges)
[Y,E] = discretize(X,N)
[Y,E] = discretize(X,dur)
[___] = discretize(___,values)
[___] = discretize(___,'categorical')
[___] = discretize(___,'categorical',displayFormat)
[___] = discretize(___,'categorical',categoryNames)
[___] = discretize(___,'IncludedEdge',side)

Описание

пример

Y = discretize(X,edges) возвращает индексы интервалов, которые содержат элементы X. j th интервал содержит элемент X(i), если edges(j) <= X(i) < edges(j+1) для 1 <= j < N, где N является количеством интервалов и length(edges) = N+1. Последний интервал содержит оба ребра, таким образом что edges(N) <= X(i) <= edges(N+1).

пример

[Y,E] = discretize(X,N) делит область значений X в универсальные интервалы N, и также возвращает ребра интервала E.

пример

[Y,E] = discretize(X,dur), то, где X является datetime или массивом длительности, делит X на универсальные интервалы отрезка времени dur. dur может быть скалярный duration или calendarDuration или модуль времени. Например, [Y,E] = discretize(X,'hour') делит X на интервалы с универсальной длительностью 1 часа.

пример

[___] = discretize(___,values) возвращает соответствующий элемент в values, а не номере интервала, с помощью любой из предыдущих комбинаций аргументов ввода или вывода. Например, если X(1) находится в интервале 5, то Y(1) является values(5), а не 5. values должен быть вектором с длиной, равной количеству интервалов.

пример

[___] = discretize(___,'categorical') создает категориальный массив, где каждый интервал является категорией. В большинстве случаев названия категории по умолчанию имеют форму “[A,B)” (или “[A,B]” для последнего интервала), где A и B являются последовательными ребрами интервала. Если вы задаете dur как вектор символов, то названия категории по умолчанию могут иметь специальные форматы. Смотрите Y для списка форматов отображения.

пример

[___] = discretize(___,'categorical',displayFormat), для datetime или входных параметров длительности массивов, использует заданный datetime или формат отображения длительности в названиях категории вывода.

пример

[___] = discretize(___,'categorical',categoryNames) также называет категории в Y с помощью массива ячеек из символьных векторов, categoryNames. Длина categoryNames должна быть равна количеству интервалов.

пример

[___] = discretize(___,'IncludedEdge',side), то, где side является 'left' или 'right', задает, включает ли каждый интервал свое правильное или левое ребро интервала. Например, если side является 'right', то каждый интервал включает правильное ребро интервала, за исключением первого интервала, который включает оба ребра. В этом случае j th интервал содержит элемент X(i), если edges(j) < X(i) <= edges(j+1), где 1 < j <= N и N являются количеством интервалов. Первый интервал включает левый край, таким образом, что это содержит edges(1) <= X(i) <= edges(2). Значением по умолчанию для side является 'left'.

Примеры

свернуть все

Используйте discretize, чтобы сгруппировать числовые значения в дискретные интервалы. edges задает пять ребер интервала, таким образом, существует четыре интервала.

data = [1 1 2 3 6 5 8 10 4 4]
data = 1×10

     1     1     2     3     6     5     8    10     4     4

edges = 2:2:10
edges = 1×5

     2     4     6     8    10

Y = discretize(data,edges)
Y = 1×10

   NaN   NaN     1     1     3     2     4     4     2     2

Y указывает, какому интервалу каждый элемент данных принадлежит. Начиная со значения 1 выходит за пределы области значений интервалов, Y содержит значения NaN для тех элементов.

Группа случайные данные в три интервала. Задайте второй вывод, чтобы возвратить ребра интервала, вычисленные discretize.

X = randn(10,1);
[Y,E] = discretize(X,3)
Y = 10×1

     2
     2
     1
     2
     2
     1
     1
     2
     3
     2

E = 1×4

    -3     0     3     6

Создайте вектор datetime 10 на 1 со случайными датами в году 2016. Затем сгруппируйте значения datetime к месяцу и возвратите результат как категориальный массив.

X = datetime(2016,1,randi(365,10,1))
X = 10x1 datetime array
   24-Oct-2016
   26-Nov-2016
   16-Feb-2016
   29-Nov-2016
   18-Aug-2016
   05-Feb-2016
   11-Apr-2016
   18-Jul-2016
   15-Dec-2016
   18-Dec-2016

Y = discretize(X,'month','categorical')
Y = 10x1 categorical array
     Oct-2016 
     Nov-2016 
     Feb-2016 
     Nov-2016 
     Aug-2016 
     Feb-2016 
     Apr-2016 
     Jul-2016 
     Dec-2016 
     Dec-2016 

Значения длительности группы к часу и возвращают результат во множестве форматов отображения.

Группа некоторые случайные значения длительности к часу и возвращает результаты как категориальный массив.

X = hours(abs(randn(1,10)))'
X = 10x1 duration array
   0.53767 hr
    1.8339 hr
    2.2588 hr
   0.86217 hr
   0.31877 hr
    1.3077 hr
   0.43359 hr
   0.34262 hr
    3.5784 hr
    2.7694 hr

Y = discretize(X,'hour','categorical')
Y = 10x1 categorical array
     [0 hr, 1 hr) 
     [1 hr, 2 hr) 
     [2 hr, 3 hr) 
     [0 hr, 1 hr) 
     [0 hr, 1 hr) 
     [1 hr, 2 hr) 
     [0 hr, 1 hr) 
     [0 hr, 1 hr) 
     [3 hr, 4 hr] 
     [2 hr, 3 hr) 

Измените отображение результатов быть многими минутами.

Y = discretize(X,'hour','categorical','m')
Y = 10x1 categorical array
     [0 min, 60 min) 
     [60 min, 120 min) 
     [120 min, 180 min) 
     [0 min, 60 min) 
     [0 min, 60 min) 
     [60 min, 120 min) 
     [0 min, 60 min) 
     [0 min, 60 min) 
     [180 min, 240 min] 
     [120 min, 180 min) 

Измените формат снова, чтобы отобразиться как много часов, минут и секунд.

Y = discretize(X,'hour','categorical','hh:mm:ss')
Y = 10x1 categorical array
     [00:00:00, 01:00:00) 
     [01:00:00, 02:00:00) 
     [02:00:00, 03:00:00) 
     [00:00:00, 01:00:00) 
     [00:00:00, 01:00:00) 
     [01:00:00, 02:00:00) 
     [00:00:00, 01:00:00) 
     [00:00:00, 01:00:00) 
     [03:00:00, 04:00:00] 
     [02:00:00, 03:00:00) 

Используйте правый край каждого интервала как вход values. Значения элементов в каждом интервале всегда являются меньше, чем значение интервала.

X = randi(100,1,10);
edges = 0:25:100;
values = edges(2:end);
Y = discretize(X,edges,values)
Y = 1×10

   100   100    25   100    75    25    50    75   100   100

Используйте вход 'IncludedEdge', чтобы указать, что каждый интервал включает свое правильное ребро интервала. Первый интервал включает оба ребра. Сравните результат с включением по умолчанию левых ребер интервала.

X = 1:2:11;
edges = [1 3 4 7 10 11];
Y = discretize(X,edges,'IncludedEdge','right')
Y = 1×6

     1     1     3     3     4     5

Z = discretize(X,edges)
Z = 1×6

     1     2     3     4     4     5

Числовые данные группы в категориальный массив. Используйте результат подтвердить объем данных, который находится в пределах 1 стандартного отклонения среднего значения.

Группа нормально распределенные данные в интервалы согласно расстоянию от среднего значения, измеренного в стандартных отклонениях.

X = randn(1000,1);
edges = std(X)*(-3:3);
Y = discretize(X,edges, 'categorical', ...
    {'-3sigma', '-2sigma', '-sigma', 'sigma', '2sigma', '3sigma'});

Y содержит неопределенные категориальные значения для элементов в X, которые более далеки, чем 3 стандартных отклонения от среднего значения.

Предварительно просмотрите значения в Y.

Y(1:15)
ans = 15x1 categorical array
     sigma 
     2sigma 
     -3sigma 
     sigma 
     sigma 
     -2sigma 
     -sigma 
     sigma 
     <undefined> 
     3sigma 
     -2sigma 
     <undefined> 
     sigma 
     -sigma 
     sigma 

Подтвердите, что приблизительно 68% данных находятся в пределах одного стандартного отклонения среднего значения.

nnz(Y=='-sigma' | Y=='sigma')/numel(Y)
ans = 0.6910

Входные параметры

свернуть все

Входной массив, заданный как векторный, матричный или многомерный массив. X содержит данные, которые вы хотите распределить в интервалы.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | datetime | duration

Ребра интервала, заданные как монотонно увеличивающийся числовой вектор. Последовательные элементы в edges формируют дискретные интервалы, который использование discretize разделить данные в X. По умолчанию каждый интервал включает левое ребро интервала, за исключением последнего интервала, который включает оба ребра интервала.

edges должен иметь по крайней мере два элемента, поскольку edges(1) является левым краем первого интервала, и edges(end) является правым краем последнего интервала.

Пример: Y = discretize([1 3 5],[0 2 4 6]) распределяет значения 1, 3 и 5 в три интервала, которые имеют ребра [0,2), [2,4) и [4,6].

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | datetime | duration

Количество интервалов, заданных как скалярное целое число. discretize делит область значений данных в универсальные интервалы N. Если данные неравномерно распределяются, то некоторые промежуточные интервалы могут быть пустыми. Однако первый и последний интервал всегда включает по крайней мере одну часть данных.

Пример: [Y,E] = discretize(X,5) распределяет данные в X в 5 интервалов с универсальной шириной.

Универсальная длительность интервала, заданная как скалярный duration или calendarDuration, или как одно из значений в таблице.

Если вы задаете dur, то discretize может использовать максимум 65 536 интервалов (или 216). Если заданная длительность интервала требует большего количества интервалов, то discretize использует большую ширину интервала, соответствующую максимальному количеству интервалов.

ЗначениеРаботы с...Описание
'second'

Datetime или значения длительности

Каждый интервал составляет 1 секунду.

'minute'

Datetime или значения длительности

Каждый интервал составляет 1 минуту.

'hour'

Datetime или значения длительности

Каждый интервал составляет 1 час.

'day'

Datetime или значения длительности

  • Для входных параметров datetime каждый интервал составляет 1 календарный день. Это значение составляет сдвиги Летнего времени.

  • Для входных параметров длительности каждый интервал составляет 1 день фиксированной длины (24 часа).

'week'

Значения datetime

Каждый интервал составляет 1 календарную неделю.
'month'

Значения datetime

Каждый интервал составляет 1 календарный месяц.
'quarter'

Значения datetime

Каждый интервал составляет 1 календарный квартал.
'year'

Datetime или значения длительности

  • Для входных параметров datetime каждый интервал составляет 1 календарный год. Это значение считает в течение дней прыжка.

  • Для входных параметров длительности каждый интервал составляет 1 год фиксированной длины (365,2425 дней).

'decade'

Значения datetime

Каждый интервал составляет 1 десятилетие (10 календарных лет).
'century'

Значения datetime

Каждый интервал является 1-м веком (100 календарных лет).

Пример: [Y,E] = discretize(X,'hour') делит X на интервалы с универсальной длительностью 1 часа.

Типы данных: char | duration | calendarDuration

Значения интервала, заданные как вектор любого типа данных. values должен иметь ту же длину как количество интервалов, length(edges)-1. Элементы в values заменяют нормальный индекс интервала в выводе. Таким образом, если X(1) попадает в интервал 2, то discretize возвращает Y(1) как values(2), а не 2.

Если values является массивом ячеек, то все входные данные должны принадлежать интервалу.

Пример: Y = discretize(randi(5,10,1),[1 1.5 3 5],diff([1 1.5 3 5])) возвращает ширины интервалов, а не индексы в пределах от 1 - 3.

Datetime и формат отображения длительности, заданный как вектор символов. Значение displayFormat не изменяет значения в Y, только их отображение. Можно задать displayFormat с помощью любого допустимого формата отображения для массивов длительности и datetime. Для получения дополнительной информации о доступных параметрах, смотрите Формат отображения Даты и времени Набора.

Пример: discretize(X,'day','categorical','h') задает формат отображения для массива длительности.

Пример: discretize(X,'day','categorical','yyyy-MM-dd') задает формат отображения для массива datetime.

Типы данных: char

Названия категории категориального массива, заданные как массив ячеек из символьных векторов. categoryNames должен иметь длину, равную количеству интервалов.

Пример: Y = discretize(randi(5,10,1),[1 1.5 3 5],'categorical',{'A' 'B' 'C'}) распределяет данные в три категории, A, B и C.

Типы данных: cell

Ребра, чтобы включать в каждый интервал, заданный как одно из этих значений:

  • 'left' — Все интервалы включают левое ребро интервала, за исключением последнего интервала, который включает оба ребра. Это значение по умолчанию.

  • 'right' — Все интервалы включают правильное ребро интервала, за исключением первого интервала, который включает оба ребра.

Пример: Y = discretize(randi(11,10,1),1:2:11,'IncludedEdge','right') включает правильное ребро интервала в каждый интервал.

Выходные аргументы

свернуть все

Интервалы, возвращенные как числовой вектор, матрица, многомерный массив или порядковый категориальный массив. Y одного размера как X, и каждый элемент описывает размещение интервала для соответствующего элемента в X. Если values задан, то тип данных Y совпадает с values. Элементы из области значений выражаются по-другому в зависимости от типа данных вывода:

  • Для числовых выходных параметров Y содержит значения NaN для элементов из области значений в X (где X(i) < edges(1) или X(i) > edges(end)), или где X содержит NaN.

  • Если Y является категориальным массивом, то он содержит неопределенные элементы для входных параметров NaN или из области значений.

  • Если values является вектором целочисленного типа данных, то Y содержит 0 для входных параметров NaN или из области значений.

Форматы названия категории по умолчанию в Y для синтаксиса discretize(X,dur,'categorical'):

Значение durФормат названия категории по умолчаниюПример формата
'second'

глобальный формат по умолчанию

28-Jan-2016 10:32:06

'minute'
'hour'
'day'

глобальный формат даты по умолчанию

28-Jan-2016

'week'

[global_default_date_format, global_default_date_format)

[24-Jan-2016, 30-Jan-2016)

'month'

'MMM-uuuu'

Jun-2016

'quarter'

'QQQ uuuu'

Q4 2015

'year'

'uuuu'

2016

'decade'

'[uuuu, uuuu)'

[2010, 2020)

'century'

Ребра интервала, возвращенные как вектор. Задайте этот вывод, чтобы видеть ребра интервала, которые discretize вычисляет в случаях, куда вы явным образом не передаете в ребрах интервала.

Советы

  • Поведение discretize подобно той из функции histcounts. Используйте histcounts, чтобы найти число элементов в каждом интервале. С другой стороны, используйте discretize, чтобы найти, какой интервал каждый элемент принадлежит (не считая).

Расширенные возможности

Представленный в R2015a