O Simple Log Service usa o recurso de detecção de anomalias para identificar automaticamente estados anormais em sistemas de serviço e suas causas raiz. Esse recurso combina aprendizado de máquina com o padrão atual de uma métrica para detectar desvios do comportamento normal. As funções de identificação de padrões multivariados permitem a detecção de anomalias multidimensionais em métricas correlacionadas.
Lista de funções de reconhecimento de padrões multivariados
|
Nome da função |
Sintaxe |
Descrição |
Tipo de dados do valor de retorno |
|
Identifica e retorna um padrão multivariado com base nas amostras e nos pesos especificados. Os pesos das amostras são opcionais. Os padrões estatísticos abrangem diversas estatísticas e estatísticas conjuntas, como média, desvio padrão e matriz de covariância. |
varchar |
|
|
Mescla padrões multivariados retornados pela função summarize. Esses padrões podem ser obtidos por aprendizado do mesmo conjunto de dados em etapas diferentes ou de dois conjuntos de dados independentes. Para mais informações, consulte função summarize. |
varchar |
|
|
normalize_vector(varchar summary, array(double) x_vector) |
Normaliza um novo vetor de amostra especificado pelo parâmetro |
array(double) |
|
|
standardize_vector(varchar summary, array(double) x_vector) |
Padroniza um novo vetor de amostra especificado pelo parâmetro |
array(double) |
|
|
mah_distance(varchar summary, array(double) x_vector) |
Calcula a distância de Mahalanobis para um novo vetor de amostra especificado pelo parâmetro |
double |
|
|
standard_distance(varchar summary, double metric_value, int element_index) |
Calcula a distância padronizada para uma métrica especificada pelo parâmetro |
double |
|
|
Calcula a distância de Mahalanobis para um novo vetor de amostra especificado pelo parâmetro Se |
array(double) |
Função summarize
A função summarize identifica e retorna um padrão multivariado com base nas amostras e nos pesos especificados. Os pesos das amostras são opcionais. Os padrões estatísticos abrangem diversas estatísticas e estatísticas conjuntas, como média, desvio padrão e matriz de covariância.
varchar summarize(array(array(double)) data_samples)
Ou
varchar summarize(array(array(double)) data_samples, array(double) weights)
|
Parâmetro |
Descrição |
|
|
Array bidimensional utilizável como tabela de duas dimensões. Cada coluna representa uma variável e cada linha representa os valores das variáveis de uma amostra. |
|
|
Opcional. Array unidimensional com o mesmo comprimento da primeira dimensão de |
Exemplo
-
Instrução de consulta
* | with data_table as ( select 1 as entity_id, 'A' as entity_group, cast(array[1, 2, 3, 0] as array(double)) as features union all select 2 as entity_id, 'A' as entity_group, cast(array[4, 5, 6, 0] as array(double)) as features union all select 3 as entity_id, 'A' as entity_group, cast(array[7, 8, 9, 0] as array(double)) as features union all select 4 as entity_id, 'A' as entity_group, cast(array[10, 11, 1, 0] as array(double)) as features union all select 5 as entity_id, 'A' as entity_group, cast(array[13, 14, 15, 0] as array(double)) as features union all select 6 as entity_id, 'A' as entity_group, cast(array[16, 17, 18, 0] as array(double)) as features union all select 7 as entity_id, 'A' as entity_group, cast(array[19, 20, 21, 0] as array(double)) as features union all select 8 as entity_id, 'A' as entity_group, cast(array[22, 23, 1, 0] as array(double)) as features ) select entity_group, summarize(array_agg(features)) as statistical_summary from data_table group by entity_group -
Valor de retorno
entity_group
statistical_summary
A
{ "sampleCount": 8, "vectorSize": 4, "means": [ 11.5, 12.5, 9.25, 0.0 ], "stdDevs": [ 6.87386354243376, 6.87386354243376, 7.361215932167728, 0.0 ], "variances": [ 47.25, 47.25, 54.1875, 0.0 ], "mins": [ 1.0, 2.0, 1.0, 0.0 ], "maxs": [ 22.0, 23.0, 21.0, 0.0 ], "covariance": [ [ 47.25, 47.25, 19.125, 0.0 ], [ 47.25, 47.25, 19.125, 0.0 ], [ 19.125, 19.125, 54.1875, 0.0 ], [ 0.0, 0.0, 0.0, 0.0 ] ], "correlations": [ [ 1.0, 1.0, 0.37796447300922725, 0.0 ], [ 1.0, 1.0, 0.37796447300922725, 0.0 ], [ 0.37796447300922725, 0.37796447300922725, 1.0, 0.0 ], [ 0.0, 0.0, 0.0, 1.0 ] ], "sums": [ 92.0, 100.0, 74.0, 0.0 ], "weightSum": 8.0, "sumProducts": [ [ 1436.0, 1528.0, 1004.0, 0.0 ], [ 1528.0, 1628.0, 1078.0, 0.0 ], [ 1004.0, 1078.0, 1118.0, 0.0 ], [ 0.0, 0.0, 0.0, 0.0 ] ], "isSummarized": true }Parâmetros de resposta
Parâmetro
Descrição
sampleCountNúmero de amostras.
vectorSizeComprimento do vetor.
meansValor médio de cada componente em todos os vetores.
stdDevsDesvio padrão de cada componente em todos os vetores.
variancesVariância de cada componente em todos os vetores.
minsValor mínimo de cada componente em todos os vetores.
maxsValor máximo de cada componente em todos os vetores.
covarianceMatriz de covariância entre os componentes de todos os vetores.
correlationsMatriz de coeficientes de correlação entre os componentes de todos os vetores.
sumsSoma de cada componente em todos os vetores.
weightSumSoma de todos os pesos das amostras.
sumProductsResultado intermediário usado na mesclagem de padrões estatísticos.
isSummarizedIndica se o cálculo do padrão estatístico foi concluído normalmente.
-
true: A solicitação foi bem-sucedida.
-
false: A solicitação falhou.
-
Função merge_summary
Use a função summarize para mesclar padrões aprendidos em diferentes etapas, como padrões obtidos do mesmo conjunto de dados em momentos distintos ou padrões provenientes de dois conjuntos de dados independentes.
varchar merge_summary(varchar summary1, varchar summary2)
Ou
varchar merge_summary(varchar summary1, double weight1, varchar summary2, double weight2)
|
Parâmetro |
Descrição |
|
|
Padrão multivariado retornado pela função summarize. Para mais informações, consulte função summarize. |
|
|
Peso global para o padrão summary1. |
|
|
Padrão derivado da função summarize. |
|
|
Define o peso global para o padrão summary2. |
Exemplo
-
Instrução de consulta
* | with data_table_01 as ( select 1 as entity_id, 'A' as entity_group, cast(array[1, 2, 3, 0] as array(double)) as features union all select 2 as entity_id, 'A' as entity_group, cast(array[4, 5, 6, 0] as array(double)) as features union all select 3 as entity_id, 'A' as entity_group, cast(array[7, 8, 9, 0] as array(double)) as features union all select 4 as entity_id, 'A' as entity_group, cast(array[10, 11, 1, 0] as array(double)) as features ), summaries_01 as ( select entity_group, summarize(array_agg(features)) as statistical_summary from data_table_01 group by entity_group ), data_table_02 as ( select 5 as entity_id, 'A' as entity_group, cast(array[13, 14, 15, 0] as array(double)) as features union all select 6 as entity_id, 'A' as entity_group, cast(array[16, 17, 18, 0] as array(double)) as features union all select 7 as entity_id, 'A' as entity_group, cast(array[19, 20, 21, 0] as array(double)) as features union all select 8 as entity_id, 'A' as entity_group, cast(array[22, 23, 1, 0] as array(double)) as features ), summaries_02 as ( select entity_group, summarize(array_agg(features)) as statistical_summary from data_table_02 group by entity_group ) select s1.entity_group, merge_summary(s1.statistical_summary, s2.statistical_summary) as statistical_summary from summaries_01 as s1 join summaries_02 as s2 on s1.entity_group = s2.entity_group -
Resultados da consulta e análise
statistical_summaryrepresenta o padrão agregado.entity_group
statistical_summary
2
{ "sampleCount": 8, "vectorSize": 4, "means": [ 11.5, 12.5, 9.25, 0.0 ], "stdDevs": [ 6.87386354243376, 6.87386354243376, 7.361215932167728, 0.0 ], "variances": [ 47.25, 47.25, 54.1875, 0.0 ], "mins": [ 1.0, 2.0, 1.0, 0.0 ], "maxs": [ 22.0, 23.0, 21.0, 0.0 ], "covariance": [ [ 47.25, 47.25, 19.125, 0.0 ], [ 47.25, 47.25, 19.125, 0.0 ], [ 19.125, 19.125, 54.1875, 0.0 ], [ 0.0, 0.0, 0.0, 0.0 ] ], "correlations": [ [ 1.0, 1.0, 0.37796447300922725, 0.0 ], [ 1.0, 1.0, 0.37796447300922725, 0.0 ], [ 0.37796447300922725, 0.37796447300922725, 1.0, 0.0 ], [ 0.0, 0.0, 0.0, 1.0 ] ], "sums": [ 92.0, 100.0, 74.0, 0.0 ], "weightSum": 8.0, "sumProducts": [ [ 1436.0, 1528.0, 1004.0, 0.0 ], [ 1528.0, 1628.0, 1078.0, 0.0 ], [ 1004.0, 1078.0, 1118.0, 0.0 ], [ 0.0, 0.0, 0.0, 0.0 ] ], "isSummarized": true }Parâmetros de retorno:
Parâmetro
Descrição
sampleCountNúmero de amostras.
vectorSizeComprimento do vetor.
meansValor médio de cada componente em todos os vetores.
stdDevsDesvio padrão de cada componente em todos os vetores.
variancesVariância de cada componente em todos os vetores.
minsValor mínimo de cada componente em todos os vetores.
maxsValor máximo de cada componente em todos os vetores.
covarianceMatriz de covariância entre os componentes de todos os vetores.
correlationsMatriz de coeficientes de correlação entre os componentes de todos os vetores.
sumsSoma de cada componente em todos os vetores.
weightSumSoma de todos os pesos das amostras.
sumProductsResultado intermediário usado na mesclagem de padrões estatísticos.
isSummarizedIndica se o cálculo do padrão estatístico foi concluído normalmente.
-
true: A solicitação foi bem-sucedida.
-
false: A solicitação falhou.
-
Função normalize_vector
Use o resumo de padrão multivariado obtido pela função summarize para normalizar o novo vetor de amostra x_vector, mapeando cada um de seus componentes para o intervalo [0, 1].
array(double) normalize_vector(varchar summary, array(double) x_vector)
|
Parâmetro |
Descrição |
|
|
Padrão derivado do processo de aprendizado da função summarize. |
|
|
Novos dados de amostra. |
Exemplo
-
Instrução de consulta
* | with data_table as ( select 1 as entity_id, 'A' as entity_group, cast(array[1, 2, 3, 0] as array(double)) as features union all select 2 as entity_id, 'A' as entity_group, cast(array[4, 5, 6, 0] as array(double)) as features union all select 3 as entity_id, 'A' as entity_group, cast(array[7, 8, 9, 0] as array(double)) as features union all select 4 as entity_id, 'A' as entity_group, cast(array[10, 11, 1, 0] as array(double)) as features union all select 5 as entity_id, 'A' as entity_group, cast(array[13, 14, 15, 0] as array(double)) as features union all select 6 as entity_id, 'A' as entity_group, cast(array[16, 17, 18, 0] as array(double)) as features union all select 7 as entity_id, 'A' as entity_group, cast(array[19, 20, 21, 0] as array(double)) as features union all select 8 as entity_id, 'A' as entity_group, cast(array[22, 23, 1, 0] as array(double)) as features ), summaries as ( select entity_group, summarize(array_agg(features)) as statistical_summary from data_table group by entity_group ) select t1.entity_id, t1.entity_group, normalize_vector(t2.statistical_summary, t1.features) as normalized_features from data_table as t1 join summaries as t2 on t1.entity_group = t2.entity_group -
Resultados da consulta e análise
O parâmetro
normalized_featuresindica os resultados da normalização do vetor de amostra especificado pelo parâmetrox_vector.entity_id
entity_group
normalized_features
2
A
[0.14285714285714286,0.14285714285714286,0.25,0.5]
4
A
[0.42857142857142857,0.42857142857142857,0.0,0.5]
3
A
[0.2857142857142857,0.2857142857142857,0.4,0.5]
...
...
...
Função standardize_vector
Use o resumo de padrão multivariado da função summarize para padronizar o novo vetor de amostra x_vector, de modo que seus componentes tenham média 0 e desvio padrão 1.
array(double) standardize_vector(varchar summary, array(double) x_vector)
|
Parâmetro |
Descrição |
|
|
Padrão derivado do processo de aprendizado da função summarize. |
|
|
Novos dados de amostra. |
Exemplo
-
Instrução de consulta
* | with data_table as ( select 1 as entity_id, 'A' as entity_group, cast(array[1, 2, 3, 0] as array(double)) as features union all select 2 as entity_id, 'A' as entity_group, cast(array[4, 5, 6, 0] as array(double)) as features union all select 3 as entity_id, 'A' as entity_group, cast(array[7, 8, 9, 0] as array(double)) as features union all select 4 as entity_id, 'A' as entity_group, cast(array[10, 11, 1, 0] as array(double)) as features union all select 5 as entity_id, 'A' as entity_group, cast(array[13, 14, 15, 0] as array(double)) as features union all select 6 as entity_id, 'A' as entity_group, cast(array[16, 17, 18, 0] as array(double)) as features union all select 7 as entity_id, 'A' as entity_group, cast(array[19, 20, 21, 0] as array(double)) as features union all select 8 as entity_id, 'A' as entity_group, cast(array[22, 23, 1, 0] as array(double)) as features ), summaries as ( select entity_group, summarize(array_agg(features)) as statistical_summary from data_table group by entity_group ) select t1.entity_id, t1.entity_group, standardize_vector(t2.statistical_summary, t1.features) as standardized_features from data_table as t1 join summaries as t2 on t1.entity_group = t2.entity_group -
Resultados da consulta e análise
O parâmetro
standardized_featuresindica os resultados da padronização do vetor de amostra especificado pelo parâmetrox_vector.entity_id
entity_group
standardized_features
2
A
[-1.0910894511799619,-1.0910894511799619,-0.4415031470273609,0.0]
4
A
[-0.21821789023599237,-0.21821789023599237,-1.1207387578386854,0.0]
3
A
[-0.6546536707079771,-0.6546536707079771,-0.03396178054056622,0.0]
...
...
...
Função mah_distance
A função mah_distance calcula a distância de Mahalanobis para um novo vetor de amostra especificado pelo parâmetro x_vector com base em um padrão definido pelo parâmetro summary. Defina o parâmetro summary como um padrão retornado pela função summarize. Para mais informações, consulte função summarize. A distância de Mahalanobis considera as diferenças de escala entre variáveis e mede a distância entre o vetor de amostra padronizado e o centroide. Uma distância de Mahalanobis igual a 1 significa que o vetor de amostra está à distância média do centroide em relação a todos os vetores.
double mah_distance(varchar summary, array(double) x_vector)
|
Parâmetro |
Descrição |
|
|
Padrão derivado do processo de aprendizado da função summarize. |
|
|
Novos dados de amostra. |
Exemplo
-
Instrução de consulta
* | with data_table as ( select 1 as entity_id, 'A' as entity_group, cast(array[1, 2, 3, 0] as array(double)) as features union all select 2 as entity_id, 'A' as entity_group, cast(array[4, 5, 6, 0] as array(double)) as features union all select 3 as entity_id, 'A' as entity_group, cast(array[7, 8, 9, 0] as array(double)) as features union all select 4 as entity_id, 'A' as entity_group, cast(array[10, 11, 1, 0] as array(double)) as features union all select 5 as entity_id, 'A' as entity_group, cast(array[13, 14, 15, 0] as array(double)) as features union all select 6 as entity_id, 'A' as entity_group, cast(array[16, 17, 18, 0] as array(double)) as features union all select 7 as entity_id, 'A' as entity_group, cast(array[19, 20, 21, 0] as array(double)) as features union all select 8 as entity_id, 'A' as entity_group, cast(array[22, 23, 1, 0] as array(double)) as features ), summaries as ( select entity_group, summarize(array_agg(features)) as statistical_summary from data_table group by entity_group ) select t1.entity_id, t1.entity_group, mah_distance(t2.statistical_summary, t1.features) as std_distance from data_table as t1 join summaries as t2 on t1.entity_group = t2.entity_group -
Valor de retorno
O parâmetro
std_distanceindica a distância de Mahalanobis do vetor de amostra especificado pelo parâmetrox_vector.entity_id
entity_group
std_distance
8
A
2.386927730244857
7
A
1.6809080087793125
1
A
1.5554594371997328
...
...
...
Função standard_distance
A função standard_distance calcula a distância padronizada para uma métrica especificada pelo parâmetro metric_value com base em um padrão definido pelo parâmetro summary. Defina o parâmetro summary como um padrão retornado pela função summarize. Para mais informações, consulte função summarize. Diferentemente da distância de Mahalanobis, que mede a distância padronizada entre um vetor multimétrico e seu centroide, a distância padronizada mede a distância para uma única métrica dentro do vetor. O parâmetro element_index especifica o índice da métrica (começando em 0). O parâmetro metric_value especifica o valor da métrica.
double standard_distance(varchar summary, double metric_value, int element_index)
|
Parâmetro |
Descrição |
|
|
Padrão aprendido pela função summarize. |
|
|
Novos dados de amostra |
|
|
Índice de um elemento específico no array |
Exemplo
-
Instrução de consulta
* | with data_table as ( select 1 as entity_id, 'A' as entity_group, cast(array[1, 2, 3, 0] as array(double)) as features union all select 2 as entity_id, 'A' as entity_group, cast(array[4, 5, 6, 0] as array(double)) as features union all select 3 as entity_id, 'A' as entity_group, cast(array[7, 8, 9, 0] as array(double)) as features union all select 4 as entity_id, 'A' as entity_group, cast(array[10, 11, 1, 0] as array(double)) as features union all select 5 as entity_id, 'A' as entity_group, cast(array[13, 14, 15, 0] as array(double)) as features union all select 6 as entity_id, 'A' as entity_group, cast(array[16, 17, 18, 0] as array(double)) as features union all select 7 as entity_id, 'A' as entity_group, cast(array[19, 20, 21, 0] as array(double)) as features union all select 8 as entity_id, 'A' as entity_group, cast(array[22, 23, 1, 0] as array(double)) as features ), summaries as ( select entity_group, summarize(array_agg(features)) as statistical_summary from data_table group by entity_group ) select t1.entity_id, t1.entity_group, standard_distance(t2.statistical_summary, 30, 1) as std_distance from data_table as t1 join summaries as t2 on t1.entity_group = t2.entity_group -
Resultados da consulta e análise
std_distancerepresenta a distância padronizada da amostra de entradametric_valueno índice especificado.entity_id
entity_group
std_distance
8
A
2.386927730244857
7
A
1.6809080087793125
1
A
1.5554594371997328
...
...
...
Função anomaly_level
A função anomaly_level calcula a distância de Mahalanobis para um novo vetor de amostra especificado pelo parâmetro x_vector com base em um padrão definido pelo parâmetro summary e arredonda cada valor de distância para baixo, obtendo diferentes níveis de probabilidade de anomalia. Defina o parâmetro summary como um padrão retornado pela função summarize. Para mais informações, consulte função summarize. Um valor de retorno de 0.1 indica 10% de probabilidade de anomalia (primeiro nível). Um valor de 0.01 indica 1% (segundo nível). Um valor de 0.001 indica 0.1% (terceiro nível). Um valor de 0.0001 indica 0.01% (quarto nível). Níveis de anomalia mais altos correspondem a probabilidades menores e maior suspeita de anomalias. Configure um limiar para filtrar resultados, por exemplo, retendo apenas anomalias de quarto nível e superiores.
Se você especificar o parâmetro element_index, a função calcula a probabilidade de anomalia apenas para o componente nesse índice. Caso contrário, ela calcula a probabilidade de anomalia para todo o vetor.
double anomaly_level(varchar summary, array(double) x_vector)
Ou
double anomaly_level(varchar summary, array(double) x_vector, int element_index)
|
Parâmetro |
Descrição |
|
|
A função summarize usa um processo de aprendizado para gerar um padrão. |
|
|
Novos dados de amostra. |
|
|
Opcional. Elemento no índice especificado do array |
Exemplo
-
Instrução de consulta
* | with dummy as ( select sequence(1, 1000) as seq_data, count(*) as record_count from log ), sample_data as ( select 'G1' as group_id, s.seq_num, -- Generate 1,000 two-dimensional random vectors that are distributed around the (100, 5000) range. The standard deviation values of two components are 20 and 500. inverse_normal_cdf(100, 20, random()) as x1, inverse_normal_cdf(5000, 500, rand()) as x2 from dummy, unnest(seq_data) as s(seq_num) ), data_summary as ( select group_id, summarize(array_agg(array[x1, x2])) as metric_summary from sample_data group by group_id ), new_data as ( select 'G1' as group_id, 1001 as object_id, 100.0 as x1, 5000.0 as x2 union all select 'G1' as group_id, 1002 as object_id, 118.0 as x1, 5450.0 as x2 union all select 'G1' as group_id, 1003 as object_id, 138.0 as x1, 5950.0 as x2 union all select 'G1' as group_id, 1004 as object_id, 158.0 as x1, 6450.0 as x2 union all select 'G1' as group_id, 1005 as object_id, 178.0 as x1, 6950.0 as x2 union all select 'G1' as group_id, 1006 as object_id, 198.0 as x1, 7450.0 as x2 union all select 'G1' as group_id, 1007 as object_id, 318.0 as x1, 10000.0 as x2 ) select n.group_id, json_extract(s.metric_summary, '$.means') as metric_vector_mean, json_extract(s.metric_summary, '$.covariance') as metric_covariance, n.object_id, n.x1, n.x2, anomaly_level(s.metric_summary, array[x1, x2]) as anomaly_level from data_summary as s join new_data as n on s.group_id = n.group_id order by n.group_id, n.object_id limit 100000 -
Resultados da consulta e análise
O parâmetro
anomaly_levelindica a probabilidade de anomalia do vetor de amostra especificado pelo parâmetrox_vector.group_id
object_id
anomaly_level
G1
1007
13.0
G1
1006
5.0
G1
1005
4.0
...
...
...