Saturday 1 July 2017

Moving Average Nan Matlab


Este tutorial discute como usar o MATLAB para processamento de imagem. Alguma familiaridade com MATLAB é assumida (você deve saber como usar matrizes e escrever um M-arquivo). É útil ter o MATLAB Image Processing Toolbox, mas, felizmente, nenhuma caixa de ferramentas é necessária para a maioria das operações. Os comandos que requerem o Image Toolbox são indicados com Image Toolbox. Representação de imagem Existem cinco tipos de imagens no MATLAB. Grayscale. Uma imagem de escala de cinza M pixels de altura e N pixels de largura é representada como uma matriz de tipo de dados duplo de tamanho M N. Os valores dos elementos (por exemplo, MyImage (m, n)) denotam as intensidades de escala de cinza de pixel em 0,1 com 0 preto e 1 branco. Truecolor RGB. Uma imagem truecolor vermelho-verde-azul (RGB) é representada como uma matriz dupla tridimensional M N 3. Cada pixel tem componentes vermelhos, verdes e azuis ao longo da terceira dimensão com valores em 0,1, por exemplo, os componentes de cor do pixel (m, n) são MyImage (m, n, 1) vermelho, MyImage (m, n, 2) verde, MyImage (m, n, 3) blue. Indexed. Imagens indexadas (paletadas) são representadas com uma matriz de índice de tamanho M N e uma matriz de mapa de cor de tamanho K 3. O mapa de cores mantém todas as cores usadas na imagem ea matriz de índice representa os pixels consultando cores no mapa de cores. Por exemplo, se a cor 22 é magenta MyColormap (22, :) 1,0,1. Então MyImage (m, n) 22 é um pixel de cor magenta. Uma imagem binária é representada por uma matriz lógica M N onde os valores de pixel são 1 (verdadeiro) ou 0 (falso).uint8. Esse tipo usa menos memória e algumas operações calculam mais rápido do que com tipos duplos. Para simplificar, este tutorial não discute mais uint8. Grayscale é geralmente o formato preferido para processamento de imagem. Em casos que requerem cor, uma imagem em cores RGB pode ser decomposta e tratada como três imagens em escala de cinza separadas. As imagens indexadas devem ser convertidas para tons de cinza ou RGB para a maioria das operações. Abaixo estão algumas manipulações e conversões comuns. Alguns comandos requerem o Image Toolbox e são indicados com Image Toolbox. Ler e gravar arquivos de imagem O MATLAB pode ler e gravar imagens com os comandos imread e imwrite. Embora um número razoável de formatos de arquivo são suportados, alguns não são. Use imformats para ver o que sua instalação suporta: Ao ler imagens, um problema lamentável é que imread retorna os dados de imagem no tipo de dados uint8, que deve ser convertido em duplo e rescaled antes de usar. Então, em vez de chamar imread diretamente, eu uso a seguinte função M-file para ler e converter imagens: Clique com o botão direito do mouse e salve getimage. m para usar esta função M. Se a imagem baboon. png está no diretório atual (ou em algum lugar no caminho de busca MATLAB), você pode lê-lo com MyImage getimage (baboon. png). Você também pode usar caminhos parciais, por exemplo, se a imagem estiver no diretório atual gtimages com getimage (imagesbaboon. png). Para gravar uma imagem em escala de cinza ou RGB, use Tome cuidado para que MyImage seja uma matriz dupla com elementos em 0,1if incorretamente dimensionado, o arquivo salvo provavelmente ficará em branco. Ao escrever arquivos de imagem, eu recomendo usar o formato de arquivo PNG. Este formato é uma escolha confiável, uma vez que é sem perdas, suporta truecolor RGB e compacta muito bem. Use outros formatos com cuidado. Operações básicas Abaixo estão algumas operações básicas em uma imagem de escala de cinza u. Os comandos que requerem o Image Toolbox são indicados com Image Toolbox. (Nota: Para qualquer matriz, a sintaxe u (:) significa desenrolar u em um vetor de coluna. Por exemplo, se u 1,50,2. Então u (:) é 1052.) Por exemplo, a potência do sinal de imagem é usada em Computando a relação sinal-ruído (SNR) ea relação pico sinal-ruído (PSNR). Dada imagem limpa uclean e ruído contaminado u imagem, Tenha cuidado com a norma. O comportamento é norma (v) no vetor v calcula sqrt (soma (v.2)). Mas a norma (A) na matriz A calcula a norma da matriz L 2 induzida, então a norma (A) certamente não é sqrt (soma (A (:) .2)). No entanto, é um erro fácil usar a norma (A) onde deveria ter sido a norma (A (:)). Filtros lineares A filtragem linear é a técnica fundamental do processamento de sinais. Para introduzir brevemente, um filtro linear é uma operação em que em cada pixel x m, n de uma imagem, uma função linear é avaliada no pixel e seus vizinhos para calcular um novo valor de pixel y m, n. Um filtro linear em duas dimensões tem a forma geral onde x é a entrada, y é a saída, e h é a resposta do impulso do filtro. Diferentes escolhas de h levam a filtros que suavizam, afiam e detectam bordas, para citar algumas aplicações. O lado direito da equação acima é denotado concisamente como h x e é chamado a convolução de h e x. Filtragem do domínio espacial A filtragem linear bidimensional é implementada no MATLAB com conv2. Infelizmente, o conv2 só pode lidar com a filtragem perto dos limites da imagem por preenchimento zero, o que significa que os resultados de filtragem são geralmente inadequados para pixels próximos ao limite. Para contornar isso, podemos preencher a imagem de entrada e usar a opção válida ao chamar conv2. A seguinte função M faz isso. Clique com o botão direito do mouse e salve conv2padded. m para usar esta função M. Aqui estão alguns exemplos: Um filtro 2D h é dito ser separável se ele pode ser expresso como o produto externo de dois filtros 1D h1 e h2. Ou seja, h h1 (:) h2 (:). É mais rápido passar h1 e h2 do que h. Como é feito acima para a janela de média móvel eo filtro Gaussiano. De fato, os filtros de Sobel hx e hy também são separáveisque são h1 e h2 Filtragem de domínio de Fourier A filtragem de domínio espacial com conv2 é facilmente uma operação computacionalmente cara. Para um filtro K K em uma imagem M N, conv2 custa O (MNK 2) adições e multiplicações, ou O (N 4) supondo M N K. Para filtros grandes, a filtragem no domínio de Fourier é mais rápida, já que o custo computacional é reduzido a O (N 2 log N). Usando a propriedade de convolução-multiplicação da transformada de Fourier, a convolução é calculada de forma equivalente por O resultado é equivalente a conv2padded (x, h), exceto próximo ao limite, onde a computação acima usa extensão de limite periódica. A filtragem baseada em Fourier também pode ser feita com a extensão de contorno simétrica, refletindo a entrada em cada direção: (Nota: Um método ainda mais eficiente é a filtragem de sobreposição de FFT. A Ferramenta de Processamento de Sinal implementa a sobreposição FFT-add em uma dimensão em fftfilt .) Filtros não-lineares Um filtro não-linear é uma operação em que cada pixel filtrado ym, n é uma função não linear de xm, n e seus vizinhos. Aqui discutimos brevemente alguns tipos de filtros não-lineares. Filtros de estatística de ordem Se você tiver o Image Toolbox, os filtros de estatística de ordem podem ser executados com ordfilt2 e medfilt2. Um filtro de estatística de ordem classifica os valores de pixel em uma vizinhança e seleciona o quinto maior valor. Os filtros min, max e mediano são casos especiais. Filtros morfológicos Se você tem o Image Toolbox, bwmorph implementa várias operações morfológicas em imagens binárias, como erosão, dilatação, abertura, fechamento e esqueleto. Existem também comandos disponíveis para morfologia em imagens em escala de cinza: imerode. Imidato e imtofato. entre outros. Crie seu próprio filtro Ocasionalmente, queremos usar um novo filtro que o MATLAB não possui. O código abaixo é um modelo para a implementação de filtros. (Nota: Uma afirmação equivocada freqüente é que os loops no MATLAB são lentos e devem ser evitados. Esta vez foi verdade, de volta no MATLAB 5 e anteriores, mas loops em versões modernas são razoavelmente rápido.) Por exemplo, o alfa-aparado médio filtro Ignora os valores mais baixos d 2 e d 2 mais altos na janela e calcula a média dos restantes valores (2 r 1) 2 d. O filtro é um equilíbrio entre um filtro mediano e um filtro médio. O filtro de médias alfa-aparadas pode ser implementado no modelo como um outro exemplo, o filtro bilateral é1.2. Tipos de dados incorporados Um tipo de dados é um conjunto de valores e um conjunto de operações definidos neles. Por exemplo, estamos familiarizados com números e com operações definidas sobre eles, como adição e multiplicação. Há oito diferentes tipos de dados internos em Java, principalmente diferentes tipos de números. Usamos o tipo de sistema para strings de caracteres com tanta freqüência que também consideramos aqui. Terminologia. Usamos o seguinte fragmento de código para introduzir alguma terminologia: A primeira linha é uma declaração de declaração que declara os nomes de três variáveis ​​usando os identificadores a. B. E c e seu tipo para ser int. As próximas três linhas são instruções de atribuição que alteram os valores das variáveis, usando os literais 1234 e 99. E a expressão a b. Com o resultado final que c tem o valor 1333. Caracteres e strings. Um char é um caractere alfanumérico ou símbolo, como os que você digita. Normalmente, não realizamos operações em caracteres diferentes de atribuir valores a variáveis. Um String é uma seqüência de caracteres. A operação mais comum que executamos em strings é conhecida como concatenação. Dado duas cordas, cadeia-los juntos para fazer uma nova corda. Por exemplo, considere o seguinte fragmento de programa Java: A primeira declaração declara três variáveis ​​para serem do tipo String. As próximas três instruções atribuem valores a elas, com o resultado final que c tem o valor Olá, Bob. Usando a concatenação de string, Ruler. java imprime os comprimentos relativos das subdivisões em uma régua. Inteiros. Um int é um inteiro (número inteiro) entre menos2 31 e 2 31 menos 1 (menos 2.147.483.648 para 2.147.483.647). Usamos int s freqüentemente não só porque ocorrem com freqüência no mundo real, mas também surgem naturalmente ao expressar algoritmos. Operadores aritméticos padrão para adição, multiplicação e divisão, para inteiros são construídos em Java, como ilustrado em IntOps. java e na tabela a seguir: Números de ponto flutuante. O tipo duplo é para representar números de ponto flutuante, e. Para aplicações científicas. A representação interna é como a notação científica, de modo que nós podemos computar com números reais em uma escala enorme. Podemos especificar um número de ponto flutuante usando uma seqüência de dígitos com um ponto decimal, p. 3.14159 para uma aproximação de seis dígitos à constante matemática pi, ou com uma notação como notação científica, p. 6.022E23 para Avogadros constante 6.022 vezes 10 23. Operadores aritméticos padrão para adição, multiplicação e divisão, para dobros são construídos em Java, como ilustrado em DoubleOps. java e na tabela a seguir: Quadratic. java mostra o uso de duplas em computação As duas raízes de uma equação quadrática usando a fórmula quadrática. Booleanos O tipo booleano tem apenas dois valores: true ou false. A aparente simplicidade é mentira enganadora, os dhobooleanos estão na base da ciência da computação. Os operadores mais importantes definidos para o booleano são para e. Ou. e não . E. A b é verdadeiro se tanto a como b forem verdadeiras, e false caso contrário. Ou. A b é verdadeiro se a ou b é verdadeiro (ou ambos são verdadeiros), e false caso contrário não. A é verdadeira se a for falsa e falsa caso contrário. Embora essas definições sejam intuitivas e fáceis de entender, vale a pena especificar totalmente cada possibilidade para cada operação em uma tabela de verdade. Comparações. Os operadores de comparação são operações de tipo misto que levam operandos de um tipo (por exemplo, int ou double) e produzem um resultado de tipo booleano. Estas operações desempenham um papel crítico no processo de desenvolvimento de programas mais sofisticados. LeapYear. java testa se um número inteiro corresponde a um ano bissexto no calendário gregoriano. Métodos de biblioteca e APIs. Muitas tarefas de programação envolvem o uso de métodos de biblioteca Java além dos operadores internos. Uma interface de programação de aplicativo é uma tabela resumindo os métodos em uma biblioteca. Imprimir strings para a janela do terminal. Conversão de strings para tipos primitivos. Funções matemáticas. Você pode chamar um método digitando seu nome seguido por argumentos. Entre parênteses e separados por vírgulas. Aqui estão alguns exemplos: Muitas vezes nos encontramos convertendo dados de um tipo para outro usando uma das seguintes abordagens. Conversão de tipo. Muitas vezes nos encontramos convertendo dados de um tipo para outro usando uma das seguintes abordagens. Conversão de tipo explícita. Métodos de chamada como Math. round (). Integer. parseInt (). E Double. parseDouble (). Conversão automática de tipos. Para tipos numéricos primitivos, o sistema executa automaticamente conversão de tipo quando usamos um valor cujo tipo tem um intervalo maior de valores do que o esperado. Moldes explícitos. O Java também possui alguns métodos de conversão de tipos embutidos para tipos primitivos que você pode usar quando estiver ciente de que pode perder informações, mas você precisa fazer sua intenção usando algo chamado um elenco. RandomInt. java lê um argumento inteiro de linha de comando n e imprime um número inteiro aleatório entre 0 e n menos1. Conversões automáticas para strings. O tipo incorporado string obedece regras especiais. Uma dessas regras especiais é que você pode facilmente converter qualquer tipo de dados para um String usando o operador. Suponha que a e b são valores int. O que faz a seqüência de instruções a seguir Solução. Define a. B. E t igual ao valor original de a. Suponha que a e b são valores int. Simplifique a seguinte expressão: ((a b)) Solução. (A b) O exclusivo ou operador para operandos booleanos é definido como verdadeiro se eles forem diferentes, false se forem iguais. Dê uma tabela de verdade para esta função. Por que 103 dão 3 e não 3.33333333. Solução. Como 10 e 3 são literais inteiros, o Java não vê necessidade de conversão de tipo e usa divisão inteira. Você deve escrever 10.03.0 se você quer dizer que os números são literais duplos. Se você escrever 103.0 ou 10.03. Java faz conversão implícita para obter o mesmo resultado. O que cada uma das seguintes impressões System. out. println (2 bc) imprime: 2bc System. out. println (2 3 bc) imprime: 5bc System. out. println ((23) bc) imprime: 5bc System. out. Println (bc (23)) imprime: bc5 System. out. println (bc 2 3) imprime: bc23 Explique cada resultado. Explique como usar Quadratic. java para localizar a raiz quadrada de um número. Solução. Para encontrar a raiz quadrada de c, encontre as raízes de x2 0x - c. Um estudante de física obtém resultados inesperados ao usar o código para calcular valores de acordo com a fórmula F G m 1 m 2 r 2. Explique o problema e corrija o código. Solução. Ele divide por r. Então multiplica por r (em vez de dividir por r r). Use parênteses: Escreva um programa Distance. java que tome dois argumentos de linha de comando inteiros xey, e imprima a distância euclidiana do ponto (x. Y) à origem (0, 0). Escreva um programa SumOfTwoDice. java que imprime a soma de dois números inteiros aleatórios entre 1 e 6 (como você pode obter ao rolar dados). Escreva um programa SpringSeason. java que leva dois valores int me da linha de comando e imprime true se o dia d do mês m estiver entre 20 de março (m 3, d 20) e 20 de junho (m 6, d 20), falso de outra forma. Exercícios criativos Chill vento. Dada a temperatura t (em Fahrenheit) e a velocidade do vento v (em milhas por hora), o Serviço Meteorológico Nacional define a temperatura efetiva (o frio do vento) como sendo: w 35.74 0.6215 t (0.4275 t - 35.75) v 0.16 Escreva a Programa WindChill. java que leva dois argumentos de linha de comando duplos t e v e imprime o frio do vento. Use Math. pow (a, b) para calcular a b. Nota: a fórmula não é válida se t for maior que 50 em valor absoluto ou se v for maior que 120 ou menor que 3 (você pode assumir que os valores obtidos estão nessa faixa). Coordenadas polares. Escreva um programa CartesianToPolar. java que converte de cartesiano para coordenadas polares. Seu programa deve levar dois números reais xey na linha de comando e imprimir as coordenadas polares r e theta. Use o método Java Math. atan2 (y, x). Que calcula o valor arctangente de yx que está na faixa de - pi para pi. Dia da semana. Escrever um programa DayOfWeek. java que leva uma data como entrada e imprime o dia da semana em que a data cai. Seu programa deve ter três argumentos de linha de comando: m (mês), d (dia) e y (ano). Para m use 1 para janeiro, 2 para fevereiro, e assim por diante. Para impressão de saída 0 para domingo, 1 para segunda-feira, 2 para terça-feira, e assim por diante. Utilize as seguintes fórmulas para o calendário gregoriano (onde denota divisão inteira): y 0 y menos (14 menos m) 12 xy 0 y 0 4 menos y 0 100 y 0 400 m 0 m 12 vezes ((14 menos m) 12 ) Menos 2 d 0 (dx 31 m 0 12) mod 7 Por exemplo, em que dia da semana era 2 de agosto de 1953 números aleatórios uniformes. Escreva um programa Stats5.java que imprima cinco valores aleatórios uniformes entre 0 e 1, seu valor médio e seu valor mínimo e máximo. Use Math. random (). Math. min (). E Math. max (). Três-classificar. Escreva um programa ThreeSort. java que leva três valores int da linha de comando e os imprime em ordem crescente. Use Math. min () e Math. max (). Curvas de dragão. Escreva um programa Dragon. java para imprimir as instruções para desenhar as curvas do dragão de ordem 0 a 5. As instruções são strings dos caracteres F. EU . E R. Onde F significa desenhar linha ao mover 1 unidade para a frente, L significa vire à esquerda e R significa virar à direita. Uma curva de dragão de ordem n é formada quando você dobra uma tira de papel em meia n vezes, então desdobrar para ângulos retos. A chave para resolver este problema é observar que uma curva de ordem n é uma curva de ordem n menos1 seguida por uma L seguida por uma curva de ordem n menos1 percorrida em ordem inversa e, em seguida, descobrir uma descrição semelhante do inverso curva. Exercícios da Web Escreva um programa Swap. java que toma dois argumentos de linha de comando inteiros a e b e troca seus valores usando o idioma de troca descrito na p. 17. Após cada instrução de atribuição, utilize System. out. println () para imprimir um rastreio das variáveis. O que a seguinte instrução faz quando grade é uma variável do tipo int. Solução. Erro de sintaxe desdeDocumentação idx kmeans (X, k) executa k-means clustering para particionar as observações da matriz de dados n-by-p X em k clusters e retorna um vetor n - by-1 (idx) contendo índices de cluster de cada observação. Linhas de X correspondem a pontos e colunas correspondem a variáveis. Por padrão, kmeans usa a medida de distância euclidiana ao quadrado e o algoritmo k-mean para a inicialização do centro de cluster. Idx kmeans (X, k, Name, Value) retorna os índices de cluster com opções adicionais especificadas por um ou mais argumentos de par Nome, Valor. Por exemplo, especifique a distância cosseno, o número de vezes para repetir o agrupamento usando novos valores iniciais ou para usar a computação paralela. Idx, C kmeans () retorna as localizações do centroide do k cluster na matriz k-by-p C. Dados de cluster usando computação paralela Agrupamento de grandes conjuntos de dados pode levar tempo, especialmente se você usar atualizações on-line (definido por padrão). Se você tem uma licença Parallel Computing Toolboxx2122 e invoca um pool de trabalhadores, o kmeans executa cada tarefa de cluster (ou replicar) em paralelo. Portanto, se Replicates gt 1, então a computação paralela diminui o tempo de convergência. Gerar aleatoriamente um grande conjunto de dados a partir de um modelo de mistura gaussiana. Mdl é um modelo de distribuição gm 30-dimensional com 20 componentes. X é uma matriz 10000-by-30 de dados gerados a partir de Mdl. Invocar um grupo paralelo de trabalhadores. Especifique opções para computação paralela. O argumento de entrada mlfg633164 de RandStream especifica usar o algoritmo multiplicativo de gerador Fibonacci retardado. É uma matriz de estrutura contendo campos que especificam opções para controlar estimativa. A Janela de Comando indica que quatro trabalhadores estão disponíveis. O número de trabalhadores pode variar em seu sistema. Agrupe os dados usando k-means agrupamento. Especifique que existem k 20 clusters nos dados e aumente o número de iterações. Normalmente, a função objetivo contém mínimos locais. Especifique 10 repetições para ajudar a encontrar um mínimo local mais baixo. A Janela de Comando exibe o número de iterações eo valor da função objetivo do terminal para cada repetição. Os argumentos de saída contêm os resultados da réplica 9 porque ele tem a menor soma total de distâncias. Argumentos Par de Nomes-Valores Especifique pares opcionais separados por vírgulas de Nomes, argumentos de Valor. Name é o nome do argumento e Value é o valor correspondente. O nome deve aparecer dentro de aspas simples (). Você pode especificar vários argumentos de par nome e valor em qualquer ordem como Name1, Value1. NameN, ValueN. Exemplo: Distância, cosseno, Replicates, 10, Opções, statset (UseParallel, 1) especifica a distância de cosseno, 10 clusters de repetição em diferentes valores iniciais e para usar computação paralela. Display 8212 Nível de saída para exibir off (padrão) final iter Nível de saída a ser exibido na Janela de Comando, especificado como o par separado por vírgulas composto por Display e uma das seguintes opções: final 8212 Exibe os resultados da iteração final iter 8212 Exibe os resultados de cada iteração desativada 8212 Exibe nada Um objeto RandStream ou matriz de células de tais objetos. Se você não especificar Streams. Kmeans usa o fluxo ou fluxos padrão. Se você especificar Streams. Use um único objeto, exceto quando: Você tem um pool paralelo aberto UseParallel é true. UseSubstreams é falso. Nesse caso, use uma matriz de células do mesmo tamanho do pool paralelo. Se um pool paralelo não estiver aberto, os Streams devem fornecer um único fluxo de números aleatórios. Se for verdade. Replica gt 1, e se um pool paralelo de trabalhadores da Parallel Computing Toolbox estiver aberto, então o software implementa k-means em cada replicação em paralelo. Se o Parallel Computing Toolbox não estiver instalado ou um conjunto paralelo de trabalhadores não estiver aberto, a computação ocorrerá no modo serial. O padrão é padrão. Significando computação em série. Defina como true para computar em paralelo de uma forma reprodutível. O padrão é false. Para calcular de forma reproduzível, defina Streams para um tipo permitindo substreams: mlfg633164 ou mrg32k3a. Para garantir resultados mais previsíveis, use parpool e crie explicitamente um pool paralelo antes de invocar kmeans e definir Options, statset (UseParallel, 1). Replicates 8212 Número de vezes para repetir clustering usando novas posições de centróide de cluster iniciais 1 (padrão) integer positivo Número de vezes para repetir clustering usando novas posições de centróide de cluster inicial, especificado como o par separado por vírgula composto de Replicates e um inteiro. Kmeans retorna a solução com o sumd mais baixo. Você pode definir Replicates implicitamente fornecendo uma matriz 3-D como o valor para o argumento par de nome-valor do par. Tipos de dados: double single Iniciar 8212 Método para escolher as posições de centróide de cluster iniciais mais (padrão) cluster sample uniforme numérico matrix numeric array Método para escolher posições de centróide de cluster iniciais (ou sementes), especificadas como o par separado por vírgula consistindo de Start e cluster. mais. amostra. uniforme. Uma matriz numérica ou uma matriz numérica. Esta tabela resume as opções disponíveis para a escolha de sementes. K-Meios Clustering k-significa agrupamento. Ou o algoritmo de Lloyds 2. é um algoritmo iterativo de particionamento de dados que atribui n observações a exatamente um de k clusters definidos por centróides, onde k é escolhido antes do algoritmo começar. O algoritmo prossegue da seguinte maneira: Escolha k centros de agrupamento iniciais (centroide). Por exemplo, escolha k observações aleatoriamente (usando Start, sample) ou use o algoritmo k-means para a inicialização do cluster center (o padrão). Calcular distâncias ponto-a-cluster-centroide de todas as observações para cada centróide. Há duas maneiras de prosseguir (especificado pelo OnlinePhase): Atualização em lote 8212 Atribuir cada observação ao cluster com o centróide mais próximo. Atualização on-line 8212 Atribuir individualmente observações a um centróide diferente se a reatribuição diminuir a soma das distâncias dentro do cluster, a soma de quadrados ponto-para-cluster-centróide. Calcule a média das observações em cada cluster para obter k novas localizações centróides. Repita as etapas de 2 a 4 até que as atribuições de cluster não sejam alteradas ou o número máximo de iterações seja atingido. K-means Algoritmo O algoritmo k-means usa uma heurística para encontrar sementes centróides para k-means agrupamento. De acordo com Arthur e Vassilvitskii 1. k-means melhora o tempo de execução do algoritmo de Lloyds ea qualidade da solução final. O algoritmo k-means escolhe as sementes como segue, assumindo que o número de aglomerados é k. Selecione uma observação uniformemente aleatória do conjunto de dados, X. A observação escolhida é o primeiro centroide, e é denotada c 1. Calcule as distâncias de cada observação para c 1. Denota a distância entre c j ea observação m como d (x m. C j). Selecione o próximo centroide, c 2 aleatoriamente de X com probabilidade d 2 (x m. C 1) x2211 j 1 n d 2 (x j. C 1). Para escolher o centro j: Calcule as distâncias de cada observação para cada centroide e atribua cada observação ao centróide mais próximo. Para m 1.n e p 1. j 8211 1, selecione o centróide j aleatoriamente de X com probabilidade d2 (xm. c p) x2211 x007B hxh x2208 Cp x007D d2 (xh. c p). Onde C p é o conjunto de todas as observações mais próximas ao centróide c p e x m pertence a C p. Isto é, selecione cada centro subseqüente com uma probabilidade proporcional à distância de si ao centro mais próximo que você já escolheu. Repita o passo 4 até k centróides são escolhidos. Arthur e Vassilvitskii 1 demonstram, usando um estudo de simulação para várias orientações de cluster, que k-means obtém convergência mais rápida para uma menor soma de distâncias dentro-do-cluster, de soma de quadrados de ponto para cluster-centróide do que o algoritmo de Lloyds. Suporte de Array Alto Esta função suporta arrays altos para dados fora de memória com algumas limitações. Somente inicialização de amostra aleatória é suportada. Sintaxes suportadas: idx kmeans (X, k) executa k-means classic clustering. Idx, C kmeans (X, k) também retorna as localizações do centroide do cluster k. Idx, C, sumd kmeans (X, k), além disso, retorna as soma de k dentro de um cluster de distâncias ponto a centroide. Kmeans (, Name, Value) especifica opções adicionais de pares nome-valor usando qualquer uma das outras sintaxes. As opções válidas são: Iniciar 8212 Método usado para escolher as posições de centróide do cluster inicial. Valor pode ser: plus (padrão) 8212 Selecionar k observações de X usando uma variante do algoritmo kmeans adaptada para dados altos. Amostra 8212 Selecione k observações de X aleatoriamente. Matriz numérica 8212 Uma matriz k-by-p para especificar explicitamente os locais de partida. Opções 8212 Uma estrutura de opções criada usando a função statset. Para arrays altos, kmeans usa os campos listados aqui e ignora todos os outros campos na estrutura de opções: Display 8212 Nível de exibição. As opções são iter (padrão), off. E final. MaxIter 8212 Número máximo de iterações. O padrão é 100. TolFun 8212 Tolerância de convergência para as somas intra-cluster de distâncias de ponto a centroide. O padrão é 1e-4. Este campo de opção só funciona com arrays altos. Para obter mais informações, consulte Arrays altos. Algoritmos kmeans usa um algoritmo iterativo de duas fases para minimizar a soma das distâncias de ponto a centroide, somadas em todos os k clusters. Esta primeira fase usa atualizações em lote. Onde cada iteração consiste em reatribuir pontos ao centroide de cluster mais próximo, tudo de uma vez, seguido pelo recálculo de centróides de cluster. Esta fase ocasionalmente não converge para a solução que é um mínimo local. Ou seja, uma partição dos dados onde mover qualquer único ponto para um cluster diferente aumenta a soma total das distâncias. Isso é mais provável para pequenos conjuntos de dados. A fase do lote é rápida, mas potencialmente apenas aproxima uma solução como ponto de partida para a segunda fase. Esta segunda fase usa atualizações on-line. Onde os pontos são reatribuídos individualmente se isso reduzir a soma das distâncias e os centróides do cluster são recalculados após cada reatribuição. Cada iteração durante esta fase consiste em uma passagem através de todos os pontos. Esta fase converge para um mínimo local, embora possa haver outros mínimos locais com menor soma total de distâncias. Em geral, encontrar o mínimo global é resolvido por uma escolha exaustiva de pontos de partida, mas usando várias réplicas com pontos de partida aleatórios normalmente resulta em uma solução que é um mínimo global. Se Replicates r gt 1 e Start for plus (o padrão), então o software seleciona r conjuntos de sementes possivelmente diferentes de acordo com o algoritmo k-means. Se você ativar a opção UseParallel em Opções e Replicates gt 1, cada trabalhador selecionará sementes e clusters em paralelo. Referências 1 Arthur, David e Sergi Vassilvitskii. K-significa: As vantagens de uma sementeira cuidadosa. SODA 821607: Procedimentos do Décimo Oitavo Simpósio ACM-SIAM Anual sobre Algoritmos Discretos. 2007, pp. 102782111035. 2 Lloyd, Stuart P. Quantificação de Mínimos Quadrados em PCM. IEEE Transactions on Information Theory. Vol. 28, 1982, p. 1298211137. 3 Seber, G. A. F. Observações multivariadas. Hoboken, NJ: John Wiley amplificador Sons, Inc. 1984. 4 Spath, H. Dissection e Análise de Cluster: Teoria, Programas FORTRAN, Exemplos. Traduzido por J. Goldschmidt. New York: Halsted Press, 1985. Selecione seu país

No comments:

Post a Comment