Transcrições
1. K-Means Clustering Introdução Vídeo: Todos e bem-vindos
aos meus núcleos mais recentes de aprendizado de máquina com
agrupamento k-means em Python. Então, quem sou eu e por que você
deveria me ouvir? Bem, meu nome é o
programador preguiçoso e sou autor de mais de 30
cursos on-line em ciência de dados, aprendizado
de máquina em análise
financeira. Tenho dois mestrados em engenharia e estatística. Minha carreira neste campo se
estende por mais de 15 anos. Trabalhei em várias
empresas que agora chamamos Big Tech e em várias startups. Usando a ciência de dados,
aumentei as receitas milhões de dólares
com as equipes que liderei. Mas o mais importante é
que eu sou muito
apaixonado por trazer essa tecnologia
fundamental para você. Então, sobre o que é esse curso? Este curso tem como objetivo
ensinar a você um
dos algoritmos fundamentais
e o aprendizado de máquina, conhecido como agrupamento k-means. Este é um exemplo de um algoritmo de
aprendizado de máquina
não supervisionado. Isso significa que ele deve
ser usado em conjuntos de dados que
não têm rótulos. Este curso se
concentra em ensinar como o algoritmo
funciona e
ajudá-lo a obter um
entendimento sólido implementando você mesmo em
k-means. Essas habilidades são essenciais
se você quiser fazer ciência de
dados e
aprendizado de máquina no mundo real. Então, quem deve fazer esse curso e como você deve se preparar? Este curso foi desenvolvido
para estudantes interessados em
ciência de dados e
aprendizado de máquina e já têm
alguma experiência com bibliotecas de computação
numérica, como NumPy e Matplotlib. Observe que isso também
implica que você tenha alguma experiência com matemática
vetorial e matricial, que será usada
neste curso. A segunda habilidade que você precisará
é de uma programação básica. Qualquer linguagem é boa, mas como esse
curso usa Python, isso seria o ideal. Felizmente, o Python é uma linguagem muito
fácil de aprender. Portanto, se você já conhece
outro idioma, não deve ter
problemas em se atualizar. E para esses dois tópicos,
a
compreensão do ensino médio deve ser suficiente e uma compreensão de graduação
seria ainda melhor. Então, em termos de recursos, o que você precisará
para fazer este curso? Felizmente, não muito. Você precisará de um computador, um navegador da web e a
conexão com a Internet. E se você está
assistindo a este vídeo, então você já atende a
essas condições. Agora, vamos falar sobre
por que você deve fazer este curso e o que você deve
esperar obter dele. Bem, simplificando, o
agrupamento K-means é um
dos principais algoritmos abordados em qualquer currículo de
aprendizado de máquina. É fundamental, se
você trabalha em finanças, biologia ou qualquer outro campo
que envolva a análise de dados. agrupamento K-means
será uma ferramenta útil. Ao final deste curso, você terá aprendido o suficiente
para usar o que aprendeu em conjuntos de dados
do mundo real. Então, espero que você esteja
tão empolgado quanto
eu para aprender sobre esse algoritmo
incrível. Obrigado por ouvir, e nos
vemos na próxima palestra.
2. Uma introdução fácil para o clusters de K-Means: Nesta palestra,
vou apresentar a você a intuição por trás
do agrupamento de
K-means e como ele funciona. Então, em primeiro lugar, sabemos
que , como esse é um algoritmo de
aprendizado de máquina, vamos
trabalhar com dados. Então, vamos tentar visualizar
alguns dados que podemos obter. A primeira coisa que você
notará sobre esses dados é que todos esses pontos
são da mesma cor. Isso ocorre porque estamos fazendo um aprendizado
sem supervisão. Portanto, não há classes
dadas a esses pontos. Cada ponto é apenas o vetor, e isso é tudo o que sabemos
sobre cada ponto. Não sabemos se deveria
ser vermelho, azul ou não. Mas há uma
característica importante desse conjunto de dados. O que você nota sobre isso? Bem, nossas habilidades de
reconhecimento de padrões humanos nos permitem ver
imediatamente que
parecem haver três
grupos de dados aqui. Em outras palavras, não
precisamos que o conjunto nos
diga que esses três
grupos são distintos. Nossas próprias habilidades de
reconhecimento de padrões nos
permitem ver
isso com muita clareza. Isso é o que queremos dizer
com aprendizado não supervisionado. Não é supervisionado porque ninguém precisa nos dizer a resposta. Esse também é um conceito-chave por trás da inteligência
artificial geral. Se vamos construir uma IA que possa navegar
no mundo real. Praticamente falando,
provavelmente deve ter alguma intuição geral e capacidade de reconhecimento de
padrões,
pois seria inviável fornecer
dados de treinamento para todas as situações
possíveis. encontro. Então, esse é um ponto muito
importante. Estamos usando nossas próprias habilidades de
reconhecimento de padrões para diferenciar esses clusters. Não está nos dados em si. Mas agora você deve ter notado
que o que acabamos de ver foi uma situação muito única e
muito específica. A primeira limitação desses dados
é que eles
eram bidimensionais. Obviamente, isso é necessário
porque se tivéssemos, digamos, um conjunto de dados de 100 dimensões, você não conseguiria vê-lo. O universo em si tem apenas
três dimensões de espaço. Então isso é tudo que você pode ver. Às vezes, recebo estudantes que não
estão convencidos desse fato. Então, se você está convencido de que pode ver além das três dimensões, tente desenhar um
cubo de dez dimensões e veja o que acontece. Agora. Por que eu menciono isso? Bem, a maioria dos conjuntos de dados
do mundo real não é bidimensional. Portanto, você não pode ver a
maioria dos dados do mundo real. E, portanto, suas próprias habilidades de reconhecimento de
padrões não
são úteis nesse cenário. Seria bom se tivéssemos algum algoritmo para descobrir que
clusters são grupos de dados que poderiam funcionar
independentemente da dimensionalidade
dos dados. Claro, é disso que trata
todo esse curso. Portanto,
você pode ter certeza de que saberá a resposta
para essa pergunta até o final deste curso. Aqui está outro problema. Nos
dados originais que mostrei a você. Eu o gerei para
que mostrasse três
clusters distintos com muita clareza. Mas e se nossos dados tiverem essa
aparência? Ou se nossos dados tiverem essa
aparência? Agora você pode ver que os clusters não
estão tão bem definidos. Em geral, gostaríamos de saber
se o cluster que
achei bom ou não? Neste curso, também responderemos a
essa pergunta. Então, como primeiro passo para
entender o agrupamento k-means, vamos considerar dois tipos de verdades
fundamentais sobre os
clusters no conjunto de dados. Suponha que me digam que
esses pontos amarelos, roxos e verdes são os
centros de alguns aglomerados. E eu gostaria de saber a qual centro esse
novo ponto azul pertence? E acho que faz sentido
intuitivo que esse ponto, é claro, pertença ao centro
mais próximo. Então, para decidir a qual cluster
um ponto de dados pertence, eu escolho o centro de
agrupamento mais próximo. Muito intuitivo. Vamos agora considerar o segundo
fato fundamental sobre clusters. Suponha que me digam que
esses pontos de dados que você vê aqui pertencem
ao mesmo cluster. Vamos chamá-los de X1 a X C. Gostaríamos de saber qual é
o centro desse cluster. Obviamente, essa é apenas a
média de todos esses pontos de dados. Isso também é chamado
de centróide, se você estiver pensando
geometricamente. E, como você sabe, a maneira de
encontrar a média de um conjunto de vetores é somá-los e dividi-los pelo
número de vetores. É assim que você encontra
o centro do cluster. A grande questão é que temos esses dois
fatos fundamentais sobre clusters. Existe alguma maneira de
combinarmos essas duas ideias para nos dar
um algoritmo de agrupamento. Agora, acredite ou não, esses dois fatos fundamentais são tudo o que você precisa para implementar o agrupamento
K-Means. Acontece que, se eu inicializar os
centros de agrupamento aleatoriamente
, se eu repetir essas
duas etapas repetidamente, convergirei para uma resposta. Então, só para recapitular, começamos escolhendo alguns pontos aleatórios à medida que
nosso cluster se centra. Em seguida, posso usar o fato de
que cada ponto no meu conjunto de dados pertence apenas
ao cluster cujo
centro está mais próximo. Então, atribuo todos os meus pontos de dados ao centro de agrupamento mais próximo. Então, agora que sei que cada ponto de dados
pertence a um cluster, posso calcular novos centros de
agrupamento com base em todos os pontos
que pertencem a ele. Em seguida, volto
à primeira etapa, que é atribuir pontos de dados aos novos centros de agrupamento. Novamente. Mais adiante nesta seção, veremos
demonstrações visuais de como as atribuições e os centros de
agrupamento
evoluem em cada iteração. Vamos recapitular essa palestra. Já que era
certo que
algumas
ideias muito importantes foram introduzidas. Primeiro, falamos
sobre o fato de que às vezes é muito fácil
ver clusters. Não precisamos que o conjunto nos
informe o rótulo
de cada ponto de dados. Podemos ver facilmente
qual ponto de dados pertence a qual cluster. Isso significa que
aprendemos a entender os dados de forma não supervisionada. Em segundo lugar, é importante
entender como
esse exemplo foi limitado. Às vezes, os limites entre os dados podem não estar
tão claramente definidos. E, na maioria das vezes, não poderemos
analisar nossos dados porque eles não
serão bidimensionais. Então, o que gostaríamos de ter é um algoritmo automático que possa encontrar clusters para nós,
considerando qualquer conjunto de dados arbitrário. Finalmente, analisamos dois fatos fundamentais
sobre clusters. O fato de que cada ponto deve ser atribuído ao
agrupamento ao qual está mais próximo. E o fato de que cada centro de
agrupamento deve
ser apenas o centro de cada
ponto que pertence a ele. Vimos que, quando combinamos
esses dois fatos, obtemos o algoritmo de
agrupamento k-means.
3. K-Means alerta de exercícios 1: Nesta palestra,
vamos começar a exercitar
suas habilidades de codificação. Este curso foi desenvolvido
para ser um curso prático. Então, para cada tópico sobre o qual
você aprenderá, você o implementará em código. Como diz meu ditado, se você pode implementá-lo, então você não o entende. Na verdade, descobri recentemente que o famoso físico
Richard Feynman disse algo muito parecido. Ele disse: O que eu não posso criar, eu não entendo. Então, se você não concorda comigo, também
discorda de um
dos físicos mais famosos de todos os tempos. Ok, então como você pode praticar
o que acabou de aprender? Bem, nesta palestra, seu exercício será
implementar uma parte do agrupamento
K-means. Então, aqui está o exercício. Primeiro, você vai gerar um
conjunto de dados sintéticos aleatório chamado x. Como você lembra, para o
aprendizado de máquina, x deve ser bidimensional, n por d como o número de amostras e d é o
número de recursos. Você também criará uma matriz unidimensional de identidades de cluster
chamada “por quê”. Por que também deve ser do tamanho n, o número de amostras. Isso ocorre porque, para
cada uma das amostras, você atribuirá a
ela uma identidade de cluster. Lembre-se de que eles
devem ser números inteiros de zero a k menos
um, inclusive, indicando que você tem K
clusters no total. Então, por exemplo o primeiro X pode
pertencer ao cluster zero, o segundo X pode pertencer
ao Cluster um e assim por diante. Agora, a forma de criar esses
dados depende totalmente de você. Você pode criar os dados
aleatoriamente ou pode tentar gerar dados
apropriados para agrupamento. Pessoalmente, eu optaria pelo último, pois o
resultado fará mais sentido e, no final, será visualmente
mais
agradável. Digamos, para nosso exemplo,
que n seja igual a 300, d seja igual a dois e k seja igual a três. Isso significa que suas identidades de
cluster assumirão os valores 01.2. Eu sugeriria
que seus dados fossem divididos uniformemente entre
os três clusters. Portanto, você terá 100 pontos de
dados pertencentes ao cluster 1100 pontos de dados pertencentes ao cluster 2.100 pontos de
dados pertencentes
ao cluster três. Ok? Então, depois de
gerar os dados, o que você faz com eles? Então, recapitulando, o que
temos até agora é x, que é do tamanho n por d, e y, que é do tamanho n. A próxima etapa, que é a
peça central deste exercício, é calcular a
média de cada agrupamento. Então, o que isso implica? Bem, vamos supor que eu
tenha três agrupamentos, então k é igual a três. Então, o que você precisa
fazer é percorrer cada um dos
valores do cluster. Isso é 0.1.2. Para cada um desses clusters, encontre cada ponto de dados que
pertence a esse cluster. Então, neste exemplo, suponha que você escolha o cluster zero. Então, você quer encontrar
todos os pontos de dados em x que pertencem ao cluster zero. Como você se lembra, essas
informações são armazenadas em y, então você deseja encontrar a média
de todos esses pontos de dados. Como exercício, pense
no tamanho do resultado. Vou te dar um minuto para
pensar sobre isso ou você pode pausar este vídeo até
ter a resposta. Ok, então qual é o tamanho
do vetor médio de todos os pontos de dados que
pertencem a um cluster específico? Bem, lembre-se
de que todos os nossos pontos de dados são vetores de
características que vivem
em um espaço d-dimensional. Em nosso exemplo, d
é igual a simplificar, a média de um grupo de vetores
d-dimensionais ainda
é d-dimensional. Em outras palavras, isso significa
simplesmente que você tem vários pontos de
dados e
deseja encontrar o
ponto de dados que está
no centróide ou no
centro de massa. E, claro, fazer isso é
apenas uma questão de somar todos os vetores e dividir pelo número total de vetores. Ok? Então, agora vamos
supor que, para cada um dos clusters k, você calcule os vetores médios da
dimensão d. Isso significa que você tem k
vetores, cada um com tamanho d. Obviamente, você pode armazená-los em uma
matriz bidimensional de tamanho k por d. Portanto, esse deve ser o
resultado deste exercício. Uma matriz k por d que contém
os
vetores médios da dimensão d para cada um dos
clusters k é nossa saída desejada. Vamos pensar
nesse problema de uma maneira diferente, caso
você não tenha
entendido da primeira vez. Ok, então suponha
que temos n pontos de dados, X1, X2, até x n. Cada um desses eixos é um vetor
d-dimensional. Além disso, temos n, as identidades de
cluster correspondentes Y1 e Y2, até YN. Cada um desses y's é um número inteiro que pode ser zero
até k exclusivo. Lembre-se de que se
combinarmos todos esses x em uma única matriz, um grande X, essa era a matriz n por d à qual eu estava me
referindo anteriormente. Podemos fazer a mesma
coisa com todos os y's para obter um grande vetor
y de comprimento n. Vamos tornar este exemplo
um pouco mais concreto. Suponha que Y
assuma os valores que você vê aqui. Então Y1 é igual a zero, Y2 é igual a um, Y3 é igual
a y quatro é igual a um, y é igual a dois, y é igual a zero, Y sete é igual a zero, y é igual a um e
y nove é igual a dois. Deve ficar claro que
n é igual a nove. Agora, seu trabalho é encontrar
a média de todos os x que pertencem a
cada um dos agrupamentos. Para o cluster zero,
você precisa encontrar a média de X1, X6, X7. Isso porque E1, E6 e E7 são zero. Para o cluster um, você
precisa encontrar a média de x2, x4 anexo oito. Isso porque Y2, y quatro e y são iguais a um. Para o cluster dois, você precisa
encontrar a média de X3, x5, X9. Isso porque Y3, Y cinco
e Y nove ou igual a dois. Vamos chamar esses
meios de m1, m2 e m3. Logicamente,
todos esses devem ser vetores de comprimento d, já que eles são apenas a
média dos vetores de comprimento D. Finalmente, você deve combinar esses três vetores médios em uma única matriz de tamanho k por d, onde neste exemplo, k é igual a três. E lembre-se de que os
dados que usaremos para este exercício serão gerados
aleatoriamente por você. Conforme mencionado anteriormente,
você pode torná-lo completamente aleatório ou fazer com que pareça com dados, o que é apropriado
para agrupamento. Agora você pode perguntar: por que não podemos usar dados reais para este exercício? Essa é uma
pergunta importante para iniciantes. Lembre-se de que todos os
dados são iguais. Portanto, esse
exercício seria o mesmo, independentemente do
tipo de dados que usamos. Gerar os dados você
mesmo garante que você entenda a forma
e a natureza dos dados, vez de simplesmente
carregá-los em algum CSV. Portanto, isso requer maior compreensão,
o que é bom. Além disso, já que temos muitos conjuntos de dados
práticos do mundo real usados em outras partes do curso. Agora não é a hora para isso. Agora, quero deixar
claro que ainda não estamos fazendo nenhum aprendizado
de máquina. Este é apenas um exercício de
programação muito simples para você se aquecer. Tudo o que estamos fazendo é
um pouco de geometria, e espero que você
concorde comigo sobre isso. Estamos dizendo: Aqui está um
monte de pontos de dados, e cada um deles
pertence a um grupo diferente. Agora encontre a média de cada ponto de dados
em cada grupo. Ok, então espero que você
concorde comigo que este é apenas um simples exercício de
programação geométrica. E não há nada a
temer neste momento. Como bônus, como nossos
dados são bidimensionais, também
podemos traçá-los em
uma grade bidimensional. Então, seu segundo emprego é esse. Primeiro gráfico, todos os dados em uma grade bidimensional
usando o gráfico de dispersão. Neste gráfico de dispersão, você também deve codificar por cores
cada ponto de dados acordo com
as identidades de agrupamento armazenadas
na matriz y. Não importa quais
sejam as cores reais, só isso cada ponto de dados no mesmo cluster deve
ter a mesma cor. Finalmente, agora que você tem
as médias de cada agrupamento, você também deve
traçar os centros de cada agrupamento no
mesmo gráfico de dispersão. Você deve usar um
estilo diferente para poder diferenciar os centros de agrupamento
dos pontos de dados reais. Como você pode ver neste
gráfico, eu usei estrelas. Ok, então esse é o exercício número um para agrupamento de k-means. Boa sorte, e nos
vemos na próxima palestra.
4. Solução de exercícios K-Means 1 (encontrando centros de cluster): Nesta palestra,
veremos a solução para o exercício
anterior,
k-means, o exercício número um. Observe que atualmente não
fornecerei o código para este exercício,
pois ele é muito curto. E como seu trabalho
neste curso é
aprender a programar sozinho, isso inclui digitar, criar e obter a sintaxe correta. No mínimo, você deve
poder copiar o que eu faço, embora eu não
recomende fazer isso. Se você estiver fazendo os
exercícios conforme as instruções, não
precisará de um arquivo de código contendo as soluções
para esses exercícios. Digitar no teclado
aumenta a memória muscular, que é uma
habilidade inestimável ao codificar. Se você tiver um motivo
legítimo para não poder digitar
o código sozinho, informe-me e
farei possível para acomodá-lo. Ok, então vamos começar. Primeiro, vamos
importar o numpy e matplotlib para bibliotecas padrão para
computação numérica em Python. Em seguida, vamos definir nossos parâmetros
de configuração. Conforme mencionado anteriormente. Isso significa que a
dimensionalidade dos dados é igual ao número de
clusters é três e o número de pontos de
dados é 300. Em seguida, criaremos
os dados. Essa talvez seja a parte mais
desafiadora do roteiro. Então, vamos falar sobre o que
queremos fazer em alto nível. Primeiro, a ideia básica é
que eu quero ter três nuvens de pontos de dados para que cada nuvem possa ser considerada
um cluster diferente. Essa é a imagem
que você deve ter em mente quando
pensa em agrupamento. Então, como podemos
gerar essas nuvens? Bem, uma
ideia possível é extrair amostras de três distribuições
gaussianas diferentes, cada uma com uma média diferente. Como você lembra, uma distribuição
gaussiana é caracterizada por sua
média e covariância. A média nos dirá onde
o gaussiano está localizado. E a covariância nos
dirá como os pontos de dados do
Gaussiano seriam distribuídos. Então, vamos começar
definindo três médias correspondentes aos
três gaussianos. Vou dizer que mu um é 00, que está na origem, dirá que mu dois é 55. E diremos que
meu três é 05. Em seguida, vou criar
uma matriz N por D chamada x. É aqui que armazenaremos
os dados para preencher x, começaremos com os
primeiros 100 pontos, como você lembra, os dois pontos. E então o 100 significa selecionar os índices de zero a 100. Então, no lado direito, eu digo gerar uma matriz de tamanho 100 por d a partir do normal
padrão, e então eu adiciono um mu1. Isso resulta em 100
pontos de dados com a dimensão dois centrada em mu um com covariância de
identidade. Em seguida, vou
fazer a mesma coisa. Mas para os próximos
100 pontos de dados, desta vez os índices
serão de 100 a 200. E no
lado direito, os pontos de dados serão centrados em mu dois. Finalmente, faremos a mesma coisa para os últimos 100 pontos de dados, para os índices, 200, 300. Esses pontos de dados
serão centrados em mu três. Em seguida,
criarei a matriz y, que nos informa a identidade do
cluster correspondente a
cada um dos eixos. Como acabamos de criar o eixo
e eles estão todos em ordem, a estrutura de
Y é muito simples. São apenas 100 zeros seguidos por 100 1's seguidos por 100 dois. Como você se lembra, se você criar uma lista e
multiplicá-la por um número inteiro, ela simplesmente
repetirá esse elemento
da lista várias vezes. Então, quando usamos a
operação plus nessas listas, o resultado é a
concatenação das listas. E, por fim, convertemos o
resultado em uma matriz NumPy. Como é mais fácil trabalhar com matrizes
NumPy, compare duas listas. Observe que, embora nossos dados tenham uma estrutura especial com
todos os clusters em ordem, o código subsequente
não assume isso. Em outras palavras, o código
que estamos prestes a escrever funcionará
com dados de qualquer estrutura. Ok, então a próxima etapa é
visualizar os dados
que acabamos de criar. Para fazer isso, criaremos um gráfico de dispersão chamando
a função de dispersão. O primeiro argumento que passamos
na primeira coluna de x. No segundo argumento, passamos na
segunda coluna de x. No terceiro argumento nomeado, especificamos a cor correspondente ao nosso
pontos de dados e passamos y. Note que y é apenas um monte
de zeros, uns e dois. Usando esse esquema, o
matplotlib decidirá quais cores reais
atribuir aos nossos pontos de dados. Obviamente, você pode ter
mais controle de granulação fina se quiser escolher
as cores sozinho. Mas isso é bom o suficiente para nós. Ok, então espero que isso seja
o que você esperava ver. Podemos ver que temos
três nuvens de pontos de dados, e cada uma delas é
colorida de acordo com y. Em seguida, vamos
considerar a questão, dada uma
matriz bidimensional de tamanho n por d, por convenção, como
faço para obter o tamanho D, esse vetor médio dessa matriz? Ou seja, eu
queria obter a média de cada uma das n amostras. Agora você tem que ter cuidado aqui, porque se você chamar apenas a média de
pontos por si só, você obterá
um único escalar, que é a média de cada
elemento de X. Não
queremos isso, já que
o que deve acabar com é um
vetor médio, não um escalar. Para conseguir o que queremos, temos que passar o eixo do
argumento igual a zero, que diz obter a média
ao longo da dimensão n. Se você passar um eixo igual a um, obterá a média
ao longo da dimensão d. Como sempre, você é incentivado
a experimentar essas coisas por si mesmo para ter uma
ideia melhor de como elas funcionam. Não acredite apenas na minha palavra. Ok, então quando executamos isso e verificamos a
forma do resultado, obtemos dois conforme o esperado. Em seguida, usaremos o que
acabamos de descobrir para
calcular a média de cada cluster usando as identidades de
cluster fornecidas na matriz y. Para começar,
criaremos uma matriz de tamanho K por D chamou meios. Em seguida, calcularemos a média de cada agrupamento, um por um, começando com o agrupamento zero. Ok, então esse código
é bastante compacto, mas na verdade, há muitas
coisas acontecendo ao mesmo tempo. Se você não entender
isso à primeira vista, espero que tenha feito
o exercício de
uma forma que não fez sentido para você. Portanto, você nunca
precisará encontrar
a mesma solução que eu fiz. Você só precisa encontrar
a mesma resposta. Seu código pode ser completamente
diferente do meu. Então, como você sabe, o código pode ser
lido de dentro para fora. Então, vamos começar com
a coisa mais interna, que é y igual a zero. Se você não sabe
o que isso faz, eu recomendaria isolar
isso e
imprimi-lo sozinho para que você tenha
um melhor entendimento. Essencialmente, o que isso
retorna é uma matriz booleana. Como você sabe, iguais, iguais devem retornar
verdadeiro ou falso. Mas como o estamos usando
em uma matriz, é por isso que o resultado também
será uma matriz. Como dizemos igual a zero, matriz resultante
será verdadeira em
todos os locais em que y é igual a zero e
falsa caso contrário. Ok, então o que acontece
quando indexamos x com essa matriz booleana? Bem, como você deve ter adivinhado, dado o exercício que estamos fazendo, isso seleciona todos os elementos de X onde o índice é verdadeiro. Ok, então espero
que isso faça sentido. Como você lembra, X é
uma matriz com n linhas. Por que também há uma matriz
com n elementos? Quando dizemos que y
é igual a zero, isso retorna uma
matriz booleana com n elementos. Então, ao indexar x com
essa matriz booleana, recuperamos apenas as partes de
X onde o índice era verdadeiro. Ou seja,
obtemos apenas as linhas de x correspondentes a quando
y é igual a zero. Equivalentemente, obtemos
apenas as linhas de X que pertencem ao cluster zero. Finalmente, tomamos a média
usando a função média, passando um eixo igual a zero. Em seguida, atribuímos o vetor médio
resultante à nossa matriz de médias no lado
esquerdo no índice zero. Em seguida, fazemos a mesma
coisa para calcular as médias do agrupamento
um e do agrupamento dois. Ok, então, tecnicamente, esse
é o fim do exercício. Embora
fosse bom se pudéssemos visualizar o que acabamos de encontrar. Então, o próximo passo é
redesenhar nosso gráfico de dispersão. Mas com o cluster significa que
calculamos anteriormente. Primeiro, começaremos desenhando o mesmo gráfico de
dispersão que tínhamos antes. Em seguida, chamamos de dispersão novamente, mas desta vez usando
a matriz de médias que
acabamos de criar. Como antes. O primeiro argumento é a
primeira coluna de médias, que se refere à
primeira dimensão. E o segundo argumento é
a segunda coluna de médias, que se refere à
segunda dimensão. Em seguida, vou passar alguns argumentos adicionais para facilitar a visualização do enredo. Primeiro,
passarei S igual a 500, que controla o tamanho
dos pontos de dados. Isso fará com que a média seja
muito maior do que os dados. Em segundo lugar, passarei e C é igual a
vermelho para tornar cada um dos centros do
agrupamento vermelho. Isso diferenciará ainda mais
esses pontos dos meus dados. Como nota lateral, este é um
exemplo de como podemos definir a cor dos pontos de dados
no gráfico de dispersão manualmente, enquanto não escolhemos as cores no gráfico de dispersão
anterior. Finalmente, definiremos um
marcador igual a estrela, para
que, em vez de
aparecer apenas como um círculo, as médias pareçam estrelas, o que facilitará ainda mais a visualização. Ok, então vamos executar isso. Ok, então espero
que seja isso que você espera que ele veja. Cada vetor médio aparece aproximadamente no centro
de cada agrupamento. Conforme mencionado, eles
representam os centros de massa ou os centróides
de cada agrupamento. Além disso, podemos ver
que eles estão
aproximadamente nos centros
gaussianos originais. Uma das estrelas está em 00, outra está em 05,
outra está em 55.
5. K-Means alerta de exercícios 2: Nesta palestra,
vamos
direto para o segundo exercício
desta seção. Anteriormente, seu exercício
era pegar um conjunto de pontos de dados e um conjunto
de identidades de cluster. Em seguida, você tinha que encontrar a média
dos pontos de dados
para cada cluster. Desta vez, você vai
na direção oposta. Agora, você receberá um conjunto de médias junto com um
conjunto de pontos de dados. Seu trabalho será
pegar esses meios e
esses pontos de dados
e descobrir a qual cluster cada
ponto de dados pertence. Portanto, lembre-se de que isso é feito acordo com a distância euclidiana, ou equivalentemente a distância
euclidiana quadrada. Observe que, como os quadrados da função de
aumento monotônico, independentemente de você pegar
o quadrado ou não, não alteram a resposta. Ou seja, se você estiver
comparando distâncias, digamos 2,4, se você
as quadrar, obterá 4,16. Portanto, a relação de que
dois é menor que quatro é preservada porque quatro também
é menor que 16. E são apenas as
distâncias relativas que importam, porque tudo o que você está tentando fazer
é encontrar a média mais próxima. A distância real em si não aparece na resposta. Ok, então, como antes, vamos pensar em um exemplo
muito simples de como isso funcionará. Suponha que tenhamos três médias, m ,
zero, M1 e M2. Também temos nove pontos de dados, x1, x2, x3, até X9. Então, o que podemos ver? O que podemos ver é que X1, X2 e X3 estão todos mais próximos de zero
do que de M1 e M2. Portanto, X1, X2 e X3
pertencem ao cluster zero. De forma semelhante,
podemos ver que X4, X5 e X6 estão mais próximos de M1 do
que de zero ou M2. Portanto, X4, X5 e X6
pertenciam ao cluster um. Finalmente, X7, X8 e X9 estão mais próximos de M2 do que
de m zero ou m1. Portanto, X7, X8, X9
pertencem ao cluster dois. Então, espero que isso faça sentido. O desafio é colocar essa intuição visual
no código. Veja como seu código deve
funcionar em alto nível. Primeiro, você vai
gerar um conjunto de médias em uma matriz
de tamanho k por d, assim como no exercício
anterior. Além disso, você pode usar
os mesmos valores para n, d e k como
fizemos anteriormente. Então n é igual a 300, d é igual a dois e k é igual a três. Lembre-se de que d é igual a dois é útil porque
podemos vê-lo visualmente. Segundo, você também gerará
uma matriz
de dados de tamanho n por d. Como antes, você pode criar essas
matrizes aleatoriamente, mas pode ser útil
gerá-las de uma forma que faça sentido a partir de um
agrupamento perspectiva. De qualquer forma
, você decide fazer isso. Pessoalmente. Acho que é mais útil
gerar os dados forma
estruturada para que,
depois de encontrar a resposta, você possa traçar os resultados
como uma verificação de sanidade. Falando nisso como um bônus, eu encorajaria você
a traçar os resultados com o resultado do exercício. Como saída, você deve
ter um vetor de comprimento n, que nos informa a identidade
do
cluster de cada ponto de dados. Então, por exemplo se o primeiro x pertence
ao cluster zero, então o primeiro valor de sua matriz de
saída deve ser zero. Finalmente, quero
observar que existem muitas maneiras de fazer esse exercício. Você já deve ter ouvido falar que
quando você está usando o NumPy, não é bom usá-lo para loops
porque é lento ou para loops. Em vez disso, você pode ter sido
informado de que é melhor usar operações vetorizadas. Ou seja, normalmente
você gostaria de encontrar uma função numpy que possa fazer o que quiser ao
mesmo tempo. Pessoalmente, acho
que, para este exercício, é mais instrutivo
fazê-lo com for-loops porque ele faz você pensar sobre o que está acontecendo algorítmicamente. Em última análise, se
você decidir usar para loops ou não, depende de você. Por fim, quero reiterar que, assim como o
exercício número um, isso ainda não é exatamente o
aprendizado de máquina. Na verdade, é apenas mais um
simples
aquecimento de programação em geometria. O que estamos fazendo é
pegar vários pontos de dados e
vários centros. E estamos apenas tentando descobrir
para cada ponto de dados qual
centro está mais próximo. Então, espero que você concorde
comigo que este exercício é apenas mais um exercício simples de
programação geométrica. Ok, então boa sorte no
exercício número dois, e nos vemos
na próxima palestra.
6. Solução de exercício K-Means 2 (encontrando tarefas de cluster): Nesta palestra,
veremos a solução para o
exercício número dois de k-means. Como antes,
certifique-se de ter concluído o exercício antes de
assistir a esta palestra. Observe que atualmente não
fornecerei o código para este exercício,
pois ele é muito curto. E porque seu trabalho
neste curso é aprender
a programar sozinho. Isso inclui digitar, criar e obter a sintaxe correta. No mínimo, você deve
poder copiar o que eu faço, embora eu não
recomende fazer isso. Se você estiver fazendo os
exercícios conforme as instruções, não
precisará de um arquivo de código contendo as soluções
para esses exercícios. Digitar no teclado
aumenta a memória muscular, que é uma
habilidade inestimável ao codificar. Se você tiver um motivo
legítimo para não poder digitar
o código sozinho, informe-me e
farei o possível para acomodá-lo. Ok, então vamos começar. Então, primeiro vamos
começar importando numpy e o matplotlib
, como antes. Em seguida, inicializamos nossos parâmetros
de configuração. Isso é n, o número de
amostras igual a 300, d, o número do recurso
é igual a dois e k, o número de
agrupamentos igual a três. Em seguida, inicializamos três meios pelos quais definiremos
nossos centros de agrupamento. Por conveniência, usei os mesmos meios que
usávamos anteriormente. Em seguida, vamos
gerar os dados. Começamos inicializando uma
matriz de todos os zeros chamada
X da forma N por D. Em seguida, definimos os primeiros 100
pontos a serem normalmente distribuídos centrados
na média com covariância de
identidade. Então, eles irão nos
índices de zero até 100. Em seguida, definimos os
próximos 100 pontos de dados para serem normalmente distribuídos
centrados na segunda média, também com covariância de identidade. Eles irão para os
índices de 100 a 200. Finalmente, definimos os
últimos 100 pontos de dados para serem normalmente distribuídos
centrados na terceira média, também com covariância de identidade. Eles irão nos
índices de 200 a 300. Em seguida, temos nosso circuito principal, que é o cerne
desse exercício. Esse é o loop em que
atribuiremos as identidades do cluster. Começaremos criando
uma matriz chamada Y preenchida com todos
os zeros de tamanho n. É
claro que ela deve
ter tamanho n porque
precisamos de uma identidade de cluster para cada um dos nossos N pontos de
dados em x. Então y é a matriz que
armazenará nossa identidade de cluster. Em seguida, percorremos
todos os n pontos de dados. Conforme mencionado no prompt de exercício
anterior, há muitas maneiras de fazer isso, mesmo sem que você mesmo precise
escrever nenhum for-loops. No entanto, isso não é realmente útil neste
exercício, pois escrever as coisas
dessa maneira ajuda você a pensar sobre o
algoritmo com mais clareza. Ok, então deve
ficar claro que, como estamos examinando
todos os n pontos de dados, vamos encontrar a
melhor identidade de cluster uma por uma, para cada ponto de dados. A ideia básica é essa. Para cada ponto de dados,
x abaixo do pequeno n, vamos percorrer
cada uma das médias do cluster. Para cada um desses meios, vamos verificar a
distância de x do pequeno n dois. Isso significa. Vamos acompanhar
todas essas distâncias para que possamos encontrar a
que é mínima. Então, se significa que zero é o mais próximo, isso significa que a identidade do
cluster é zero. Se a média for a mais próxima, isso significa que a
identidade do cluster é uma e assim por diante. Ok, então vamos começar
inicializando uma variável chamada k mais próxima de menos um. Usamos menos
um como valor sentinela. Isso será sobrescrito à medida que iteramos
no loop interno. Da mesma forma,
inicializamos uma variável chamada min dist para o infinito. Claramente, essa variável armazenará a distância mínima de
x de n a todas as médias. Ao inicializá-lo até o infinito, qualquer distância que encontrarmos dentro
do loop será menor. Ok, então, em seguida, percorremos pequeno k é igual a
zero até o grande K. Ou seja, vamos
percorrer cada centro do agrupamento. Dentro do loop, encontramos a distância quadrada entre x do pequeno n e as médias de k, a média k eth. Se você não
reconhece por que essa é a fórmula da distância quadrada, eu recomendaria revisar a definição de distância
euclidiana quadrada. Chamaremos essa
variável D. Em seguida, verificaremos se
d é menor ou não que min dist. Obviamente, na primeira vez que
iteramos nesse loop, é garantido que
isso seja
verdade, pois Mendez começa como infinito e qualquer
número finito é menor que infinito. Se essa condição for verdadeira, fazemos duas coisas. Primeiro, atualizamos min dist para
ser a distância atual d. Ou seja, min dist é a menor distância que
encontramos até agora. Em seguida, atribuímos o
k mais próximo ao k atual. E, novamente, isso significa
que k mais próximo é o índice do centro de agrupamento
mais próximo que
encontramos até agora. Você deve estar convencido de que,
ao final desse loop, K
mais próximo
armazenará o índice do centro
do agrupamento mais próximo e Min dist armazenará a distância
correspondente. Assim, nesse ponto, podemos atribuir o k mais próximo a y,
indexar esse pequeno
n. Em outras palavras, k
mais próximo é a identidade do
cluster para o ponto de dados
x de uma pequena terra. Quando o loop externo estiver concluído, teremos encontrado as identidades do
cluster para todos os grandes pontos de dados N. Então, como uma verificação de sanidade, gostaríamos de
traçar nossos resultados. Felizmente, você já
sabe como fazer isso porque fizemos isso
na palestra anterior. Vamos executar isso. Ok, então espero que seja isso que
você espera que ele veja. Podemos ver que todos
os pontos de dados são atribuídos
na cor correta, acordo com qual dos
meios eles estão mais próximos. Esses são todos os pontos
mais próximos de 00 ou uma cor, que parece ser roxa. Todos os pontos mais próximos de 05, ou uma cor diferente,
que parece ser verde. Finalmente, todos os
pontos de dados mais próximos de 55, ou outra cor, que
parece ser amarela.
7. K-Means alerta de exercícios 3: Nesta palestra,
continuaremos nossa discussão sobre o agrupamento de
K-means. Um fato surpreendente que
você aprenderá é que, ao fazer os dois exercícios
anteriores, você
realizou essencialmente 90% do trabalho. Você deve se lembrar de mim dizendo que
os dois exercícios anteriores eram apenas aquecimentos muito simples. Eles não passavam de
simples exercícios de programação para fazer alguma geometria. E, ao mesmo tempo, o que você verá é que o agrupamento
k-significa nada além desses dois exercícios geométricos
simples repetidos repetidamente. Mais cedo. No início desta seção, declaramos duas
intuições fundamentais sobre clusters. Vamos relembrar o que são. fato número um é que
a identidade do cluster de cada ponto de dados deve ser do centro do
cluster mais próximo. Quero dizer, isso simplesmente faz sentido. Por exemplo, suponha que tenhamos
dois grupos de estudantes, aqueles que são muito altos, digamos, 6 pés em média, aqueles que são muito baixos, digamos 5 pés em média. Se sua altura é de
cinco pés e 10 “, então deve ser óbvio
que você pertence ao grupo alto e não
ao aglomerado curto.
Por quê? Porque você está mais perto de
6 pés, então você está a 5 pés. Então, espero que isso seja intuitivo. Então, aqui está o fato número dois. O centro do cluster é
simplesmente a média ou
média de todos os pontos de dados
pertencentes a esse cluster. Isso também faz sentido se tivermos cinco pessoas
em nosso grupo o chamado centro seria a altura média de
todos em nosso grupo. Espero que isso seja tão
intuitivo quanto o fator número um. Além disso, você deve
reconhecer que esses dois fatos
nada mais são do que os dois exercícios anteriores. Anteriormente, eu disse que agrupamento
k-means
simplesmente é um loop que simplesmente repete essas duas operações
repetidamente. Então, qual é a
implicação disso? Bem, isso significa que, ao fazer
os dois exercícios anteriores, você já implementou
essencialmente o agrupamento k-means. A única coisa que resta é
colocá-los juntos. Por outro lado,
parece haver um pequeno problema. O que se pode considerar um problema
de galinha e ovo. Você vê que cada uma das duas etapas parece depender dos
resultados da outra. Para encontrar os meios, você precisa
das identidades do cluster. Mas para encontrar as identidades do
cluster, você precisa dos meios
que vieram primeiro, a galinha ou o ovo. A resposta para isso é chamada
de etapa de inicialização. Nesse caso,
k-means fornece uma resposta para saber se a galinha ou o ovo
vem primeiro. Basicamente, o que fazemos é atribuir os centros de agrupamento a pontos de dados
escolhidos aleatoriamente em x. Portanto, essa é uma etapa
que executamos antes repetirmos as duas etapas
que discutimos anteriormente. Então, o resultado final é esse. Para inicializar K-means,
começamos escolhendo k pontos aleatórios em x e atribuindo-os a
centros de agrupamento. Em seguida, entramos em um loop. Dentro do circuito,
empregamos o fax número um. Atribuímos cada ponto de dados em x aos nossos centros de
agrupamento atuais. Na primeira vez em que isso for executado, esses
centros de agrupamento
serão simplesmente um subconjunto dos pontos em x. A saída dessa etapa é um novo conjunto de identidades de agrupamento. Em seguida, empregamos os fatos
e, número dois, recalculamos cada um
dos centros de agrupamento de
acordo com as identidades mais recentes do
cluster. Portanto, o resultado dessa etapa é um novo conjunto de centros de agrupamento. Em seguida, repetimos esse
processo várias vezes até que o
algoritmo converja. Então, como sabemos quando
o algoritmo converge? Bem, é quando as
identidades do cluster param de mudar. Quando as
identidades do cluster pararem de mudar
, obviamente os centros do
cluster também
pararão de mudar. E não adianta continuar
executando o loop, pois a resposta
não mudará mais. Um detalhe crucial
que você precisa saber sobre o
agrupamento K-means é esse. Embora o processo que acabei descrever pareça bastante
simples, ele não resulta
na mesma resposta toda
vez que você o executa. Ou seja, k-means nunca encontra uma solução globalmente
ideal. Em vez disso, só é possível
encontrar uma ótima local. Uma solução simples para
isso é simplesmente executar
k-means várias vezes e
, em seguida, escolher a melhor resposta. Definiremos o que melhor significa
mais adiante nesta seção. Praticamente falando, isso é
praticamente tudo que você pode fazer. E no mundo real, isso é ótimo. Então, espero que o próximo
exercício não seja uma surpresa. Seu trabalho, antes de passar para a próxima palestra, será
implementar k-means no código. Lembre-se de que você já
fez a maior parte do trabalho nos exercícios 1.2
desta seção. Tudo o que você realmente precisa fazer é colocar essas duas coisas em um loop. O esboço básico do seu
código deve ser o seguinte. Primeiro, você vai
gerar um conjunto de dados chamado X da forma n por d. Desta vez, você realmente deseja
gerar um conjunto que seja apropriado para o agrupamento
k-means. Ou seja, não
gere um conjunto de dados a partir de apenas um único gaussiano
sem clusters claramente discerníveis. Mais adiante nesta seção,
veremos os conjuntos de dados do mundo real. Mas, por enquanto, só
queremos garantir que sua versão do k-means faça
o que deveria fazer. Em seguida, você inicializará os centros do agrupamento
selecionando k
pontos selecionados aleatoriamente de x. Como você mesmo criou
os dados, você pode escolher os
valores de N, D, E, e K. Eu ainda
recomendaria usar d igual a dois para que você
possa visualizar os resultados. Em seguida, você inserirá
um loop que executa as duas etapas que
discutimos anteriormente. Dentro do loop, você
deve verificar a convergência. Ou seja, quando as identidades do
cluster pararem de mudar nesse ponto, você deverá sair do loop. Finalmente, se você
escolher D igual a dois, você deve visualizar
os resultados. Você pode fazer isso
desenhando um gráfico de dispersão dos dados junto com as identidades de
agrupamento que você encontrou. Além disso, você também
deve desenhar os centros de
agrupamento correspondentes. Como você já
aprendeu como fazer
isso, não deve ser
muito difícil fazê-lo novamente. Ok, então boa sorte
neste exercício, e nos vemos
na próxima palestra.
8. Solução de exercício 3 K-Means na totalidade): Nesta palestra, vamos
implementar o agrupamento e o código k-means. Como sempre, espero que você tenha
tido a chance de concluir esse exercício antes de
assistir a esta palestra. Caso contrário, eu
recomendaria interromper este vídeo agora até que você
conclua o exercício. Lembre-se de que isso é um
benefício para você estar aprendendo. Então, espero que você tenha passado
algum tempo de qualidade implementando esse código. Na verdade, o terceiro
exercício deveria ter sido muito
mais fácil do que os dois primeiros. Já que o terceiro
exercício é, na verdade, apenas juntar os dois primeiros
exercícios. Então, espero que você
tenha descoberto que esse é o caso. Ok, então vamos
começar. Primeiro. Vamos importar novamente o
numpy e o matplotlib. Agora, você já está familiarizado com a
forma como usamos
essas bibliotecas. Em seguida, definimos novamente os parâmetros
de configuração R. Isso é d igual a k é igual a
três e n é igual a 300. Portanto, a
dimensionalidade dos dados é dois, o número de agrupamentos é três e o número de
amostras é 300. Em seguida, criamos os dados. Começamos criando primeiro
os verdadeiros meios mu um, mu dois e mu 31. Um fator importante a ser
lembrado é que essas verdadeiras médias são desconhecidas
pelo algoritmo K-means. Eles são conhecidos por
nós porque os estamos usando para criar os dados. Mas k-means não faz
uso deles de jeito nenhum. Talvez você queira
revisar o código sozinho para verificar esse fato. Então, como antes, vamos
usar as médias 0,055,05. Em seguida, criamos nossa matriz X
de tamanho n por d. Definimos os primeiros 100 pontos
para serem gaussianos centrados na covariância de
identidade mu um. Definimos os próximos 100 pontos um gaussiano
centrado em mu dois, novamente com covariância de identidade. Finalmente, definimos os
últimos 100 pontos um gaussiano
centrado em mu três, novamente com covariância de identidade. Então, espero que você
se lembre
de tudo isso dos exercícios anteriores. Agora, você pode perguntar: agora que estamos fazendo o código de agrupamento
real do K-means, por que ainda não estamos
usando dados reais? Portanto, essa é uma boa pergunta para iniciantes e todos os
iniciantes devem ser capazes de responder a essa pergunta até o final deste curso,
se ainda não estiverem. Ok, então, número um, lembre-se de que fizemos um
bom número de exemplos sobre dados
do mundo real fora
desta palestra. O foco desta palestra
é implementar o K-Means. O tipo de dados que
usamos é irrelevante. Por que isso é irrelevante? Bem, lembre-se de que não
importa quais sejam os dados, esse código para o
agrupamento k-means não mudaria. Portanto,
não há nenhuma vantagem real usar dados reais neste
momento. Na verdade, há apenas uma
desvantagem. Então, por que isso? Bem, isso nos leva
ao ponto número dois, que é que o uso de dados
sintéticos nos permite testar se nosso
código funciona ou não conforme o esperado. Isso é importante
e o aprendizado de máquina, quando você escreve código, precisa testar se ele funciona ou não. Mas você não pode fazer isso
se usar seu código em algum conjunto de dados
de alta dimensão desconhecido. Por outro lado, esse
é um conjunto de dados que
nós mesmos criamos e é
bidimensional, então podemos vê-lo. Mais importante ainda, sabemos
qual deve ser a resposta. Portanto, é uma boa maneira de
testar se
nosso código está funcionando ou não. Então, espero que agora você tenha um bom entendimento sobre por que dados sintéticos são importantes. Além disso, você entende
que ainda
analisaremos dados reais em
outras partes do curso. Portanto, você não perdeu
nenhuma
oportunidade de analisar dados reais. Ok, então, neste momento, vamos traçar nossos dados para
que possamos nos
lembrar de como eles se parecem. Desta vez,
traçaremos apenas x porque essa é a única coisa dada ao
nosso algoritmo k-means, como você verá em breve. Anteriormente, em nossas
duas primeiras tarefas de aquecimento, presumimos que recebemos os centros do cluster ou que
recebemos as identidades do
cluster. Agora, estamos em um cenário mais
realista que não sabemos
nenhum dos dois,
só conhecemos x. No entanto, mesmo apenas
traçando x por si só, podemos ver intuitivamente onde
os agrupamentos deveriam estar. Ok, então vamos desenhar nosso enredo. Então, espero que você concorde que os agrupamentos de clusters
são muito intuitivos. Posteriormente, ao aprender técnicas
mais avançadas, você entenderá por que
gerar nossos dados a partir de nuvens
gaussianas é, na verdade,
o caso de uso ideal. Em seguida, começamos o código
para o agrupamento k-means. Começaremos fazendo
a inicialização. Como você se lembra, isso
envolve atribuir aleatoriamente os centros do agrupamento usando pontos escolhidos
aleatoriamente de x. Então, primeiro, começamos criando uma matriz de centros de agrupamento de forma K por D. Isso
porque são k centros de agrupamento, cada dimensão de largura B. Em seguida, fazemos um loop, k vezes. Dentro do loop, escolhemos um índice aleatório de
zero até n menos um. Se você estiver interessado,
você pode verificar se eles são escolhidos a partir de uma distribuição
uniforme. Chamamos os resultados disso
de I e I é um número inteiro de zero
até n menos um. Em seguida, atribuímos x sub I como o
centro do cluster KF. Então pegamos nossa matriz de
centros de agrupamento e
a indexamos em k. Em seguida, fazemos nosso loop k-means. Como você se lembra, isso envolve duas etapas repetidas
repetidamente. E essas duas etapas são simplesmente os dois exercícios anteriores que
você já fez. Então, primeiro vamos começar definindo uma variável chamada
max iterates como 20. Isso definirá um limite máximo de quantas vezes nosso
loop itera. Normalmente, k-means
converge bem rápido. Então, você descobrirá que nem
todas as iterações são necessárias. Em seguida, criamos uma matriz vazia para armazenar as identidades do cluster. Como antes, essa será
uma matriz de comprimento n, que armazena números inteiros de zero a k menos
um inclusive. Em seguida, para fins de depuração, iniciarei uma lista vazia
chamada
identidades de cluster salvas para nos ajudar a visualizar o que k-means
está fazendo em cada etapa, vamos salvar
as identidades do cluster em cada iteração do loop. Em seguida, entramos em nosso loop. Então eu vou do zero ao
máximo, o litro é exclusivo. Dentro do loop,
primeiro fazemos uma cópia
da matriz de identidades do cluster chamando a função copy. Vamos atribuir isso a uma variável chamada identidades antigas do cluster. Lembre-se de que
é assim que verificaremos se o K-means
convergiu ou não. Se
as identidades do cluster não mudado de uma
iteração para a próxima
, não
adianta continuar porque se
as identidades do cluster forem as mesmas, as médias
também serão mesmo. Portanto, as duas etapas resultariam em nenhuma alteração. Em seguida, também salvamos as identidades antigas do cluster em
nossa lista de
identidades para salvar o cluster. Em seguida, executamos a primeira etapa. Como você lembra, isso
é para determinar se as identidades do cluster, dadas
as centrais atuais do cluster. Observe que na primeira
vez que você executa esse loop, os centros do agrupamento são
apenas pontos aleatórios em X. Isso é Y. Nos exercícios anteriores, não era
necessário fazer os dados tivessem uma boa
aparência do jeito que eu fiz. K-significa que em algum momento, calcularemos identidades de
agrupamento para as quais as médias do agrupamento
estão no lugar errado. É por isso que eu dei a instrução de que
você poderia criar qualquer x e qualquer conjunto
de médias de agrupamento. O objetivo era apenas
escrever um código funcional. Ok, então, basicamente, você
deve reconhecer que todo
esse ciclo é exatamente o mesmo
que tínhamos antes. Vou passar por isso mais
rápido desta vez, já que você já viu. Primeiro, examinamos
todos os n pontos de dados. Dentro desse loop, inicializamos o mais próximo k de menos
um, um valor sentinela. Em seguida, inicializamos
min dist até o infinito. Isso é para que qualquer distância
finita calculamos seja menor. Em seguida, analisamos
todas as médias do cluster k. Isso ocorre porque queremos
descobrir qual
deles está mais próximo
do enésimo ponto de dados. Dentro do loop, calculamos a
distância euclidiana quadrada entre x sub n e o centro do
agrupamento KF. Chamaremos isso de D. Em seguida, verificaremos se d é
menor que o destino mínimo atual. Se for, salvamos o
B atual como nosso novo men dist e salvamos k como nosso k mais próximo. Quando estamos
fora do loop,
atribuímos o k mais próximo como
a enésima identidade do cluster. Em seguida, temos a segunda etapa, que foi o outro
exercício que fizemos. Isso é para calcular
as novas
médias de agrupamento com base nas
identidades de cluster que acabamos de encontrar. Então, novamente, você deve
reconhecer esse código
anterior com alguns ajustes de nomenclatura. Como você se lembra, trabalhamos
de dentro para fora. Primeiro, usamos igual a igual para obter uma matriz booleana
nos dizendo quais dos pontos de dados
pertencem ao cluster 01 ou dois. Em seguida, usamos essa
matriz booleana como um índice em x. Em seguida, chamamos a função média para obter a média de todos
esses pontos de dados. E passamos um
eixo igual a zero, modo que tomamos a
média ao longo das linhas. Em seguida, atribuímos
isso à nossa matriz, que contém os centros do
agrupamento. Quando terminarmos, as etapas
um e dois, podemos verificar a convergência. Novamente, você pode ver que
usamos iguais a iguais. Queremos saber se nossas identidades de
cluster antigas ou iguais às novas identidades de cluster que
acabamos de encontrar como antes, já que os operandos para iguais são iguais nossas matrizes NumPy, isso retornará
uma matriz NumPy de booleanos contendo
somente verdadeiros e falsos, verdadeiros quando os dois lados são
iguais e falsos caso contrário. Observe que nosso algoritmo só convergiu se todos os
valores forem verdadeiros. Basicamente, estamos fazendo
uma grande declaração. Então, estamos dizendo se a
primeira posição é verdadeira, e se a segunda
posição é verdadeira, e se a terceira posição
é verdadeira e assim por diante. Um atalho para
fazer isso é
chamar a função np dot all. Isso retornará verdadeiro se
a matriz que você passar contiver todas as verdadeiras
dentro da instrução if, que só ocorre se
a condição for verdadeira. Imprimimos em qual
iteração convergimos e,
em seguida, chamamos break
para finalizar o loop externo. Ok, então vamos executar isso. Tudo bem, como você pode ver, K-means convergiu em
muito menos de 20 etapas. Em seguida, assim como em
nosso exercício anterior, faremos um gráfico do
resultado do nosso algoritmo. Então, vamos pensar
nisso em alto nível. Começando, tudo o
que tínhamos era a matriz x. Sim, tínhamos as
verdadeiras médias de agrupamento, mas estamos fingindo que
não as conhecemos. E, de fato, quando
você pensa sobre o que você teria
com um conjunto de dados real, você não os conheceria. Portanto, nosso
gráfico original era um gráfico
apenas dos dados,
sem cores e
sem centros de agrupamento. Agora, depois de executar o K-means, temos mais informações. Agora temos identidades de agrupamento, o que nos permitirá
dar a cada ponto em cada agrupamento uma cor diferente. Além disso, também temos
os centros de agrupamento, para que também possamos desenhá-los
em nosso gráfico. Como você se lembra, nós as
desenhamos anteriormente como grandes estrelas vermelhas. Ok, então espero que você possa reconhecer esse
código anterior. A primeira linha faz um
gráfico de dispersão dos dados, colorindo cada ponto de dados
pelas identidades do agrupamento. Então, todos os pontos
pertencentes ao agrupamento zero, teremos uma cor, todos os pontos pertencentes
ao agrupamento um, teremos outra
cor e assim por diante. Em seguida, chamamos a função
de dispersão. Mas desta vez nas
médias, como antes, passamos em S igual a 500, aumentamos esses
pontos de dados e
passamos em Z igual
a vermelho para torná-los vermelhos. E definimos um marcador igual a estrela, então eles aparecem como estrelas. Ok, então vamos executar isso. Tudo bem, então espero
que seja isso que você espera que ele veja. Esses são os mesmos dados de antes, mas agora eles têm
cores de acordo
com as identidades de cluster
encontradas por K-means. Além disso, marcamos centros
dos aglomerados
com estrelas vermelhas. Essas são todas as informações
que não tínhamos antes de executar o K-means, onde só
temos os dados em si. Em seguida, temos um pequeno loop para visualizar o processo
de treinamento. Como você se lembra, salvamos as identidades do cluster
em cada etapa do k-means. Então, ao traçar os
dados de acordo com as identidades
do cluster
em cada etapa, podemos ver como os clusters evoluem à medida que o algoritmo aprende. Ok, então, se você quiser
entender esse código, eu o examinarei
muito rapidamente. Primeiro, pegamos o número de identidades de cluster que armazenamos. Observe que isso é variável, já que não sabemos quantas vezes o ciclo de treinamento durará, atribuiremos isso a uma
variável chamada m. Em seguida, chamaremos a função em plt.plot subplots para definir o
tamanho da parcela. O primeiro argumento
define a largura e o segundo argumento
diz a altura. Eu escolhi o número
de cinco arbitrariamente, o que é grande o suficiente para mim. Mas o importante
é definir a altura, que é m, vezes o
tamanho da largura. Isso ocorre porque
vamos transformá-los em subtramas e
queremos que todos se encaixem. Cada uma das
subparcelas individuais será de cinco por cinco. Ok, então, em seguida,
fazemos um loop m vezes. Dentro do loop,
chamamos plt.show subplot. Há três argumentos
para essa função. primeiro é o número
de linhas em nosso gráfico e o segundo é o número
de colunas em nosso gráfico. Então, vamos ter
m linhas e uma coluna. Ou seja,
vamos fazer tramas e elas
estarão todas em cima umas das outras. O terceiro argumento
especifica qual está fora
do m por um gráfico. Basicamente, isso é
apenas eu mais um, já que o primeiro valor
de i será zero. Em seguida, obtemos y, que
será atribuído às identidades do cluster
na iteração i. Em seguida, chamamos plt.show
scatter transmitindo nossos dados e por que as configurações de cores
atuais. Ok, então vamos executar isso. Tudo bem, então espero que
esse gráfico seja útil para você ver a
progressão de k-means. Você pode ver que começamos com tudo da mesma
cor porque
inicializamos as identidades do
cluster para serem uma matriz de todos os zeros. Então, podemos ver que gradualmente a
separação de agrupamentos melhora. Eventualmente, acabamos com
as identidades finais do cluster, momento em que
paramos de treinar. O importante é
observar como as identidades do cluster
melhoram lentamente em cada etapa. Ao definir as identidades
do cluster de forma inteligente, as identidades do cluster
não pioram, apenas melhoram. Em palestras posteriores,
quantificaremos essa ideia.
9. K-Means Objective (teoria): Nesta palestra,
falaremos
sobre a função
objetiva k-means. Para introduzir essa ideia, é útil primeiro ter alguma experiência com outros modelos de
aprendizado de máquina, como regressão linear
e regressão logística. Então, se você fizer isso, isso
será muito útil. Mas se você não fizer isso, tente
o seu melhor para acompanhar. Então, essencialmente, regressão
linear, regressão
logística e agrupamento de
K-means são todos exemplos
de aprendizado de máquina. A palavra-chave dessa
frase é aprender. Portanto, a
pergunta importante a ser feita é o que queremos dizer com aprender? De um modo geral, nosso modelo
geralmente tem algum objetivo. Sim, você pode dizer que nosso
objetivo é aprender, mas queremos ser mais
específicos e específicos. O objetivo é um número. No aprendizado supervisionado, como regressão
linear e regressão
logística, esse número é o erro. Você pode pensar no objetivo, como em quantos
erros eu cometo. Assim, aprender é configurar seu cérebro de forma que você
cometa cada vez menos erros. Então, espero que a analogia com o aprendizado
humano seja clara. Aprender é equivalente a
configurar seu cérebro ou seu modelo de mundo
para cometer menos erros. Na regressão linear,
nosso objetivo é a soma dos erros quadrados. Há vários motivos pelos
quais isso faz sentido, mas aqui está um motivo simples. regressão linear tem
tudo a ver com encontrar a
linha de melhor ajuste. Em outras palavras,
gostaríamos que a linha estivesse o mais próxima
possível dos
pontos. Neste gráfico, você pode ver
que às vezes nossa linha de melhor ajuste superestima quando
faz uma previsão e outras vezes
subestima. Assim, o erro pode realmente
ser positivo ou negativo. Obviamente, você não
quer simplesmente somar as áreas
porque se você adicionar um número positivo e um número negativo que sejam iguais, obterá zero. Por exemplo, se um dos
erros for mais cinco e o outro
erro for menos cinco, mais cinco mais
menos cinco é zero. E, obviamente, você não
quer que o erro total seja zero quando seu modelo realmente
cometeu um erro diferente de zero. Portanto, ajustamos os erros para que todos sejam positivos. Para
transformá-los em um único número, nós os somamos, daí a soma dos erros quadrados. Chamamos isso de soma de
erros quadrados ou função de custo. Observe que existem outros
tipos de funções de custo, como a entropia cruzada, que é usada para regressão
logística. No entanto, neste curso, estamos interessados principalmente
no erro quadrado. A próxima etapa ao
treinar um modelo de regressão linear ou regressão
logística é descobrir como atualizar
os parâmetros do modelo para que você possa diminuir o erro. Exatamente como você faz isso está fora
do escopo deste curso, mas você é incentivado a
aprender sobre regressão linear e regressão logística
se estiver curioso. O importante é observar que, assim como o agrupamento
k-significa, isso é feito iterativamente. Isso quer dizer que
temos algum loop. Dentro do loop, atualizamos
os parâmetros do modelo. Em cada iteração do loop, esperamos atualizar os parâmetros do
modelo de
forma que o
erro sempre melhore. Novamente, a forma como fazemos isso está fora
do escopo deste curso, mas reconhecemos que
isso pode ser feito. Observe que a analogia com a aprendizagem
humana também faz
sentido nesse contexto. Você pode pensar em
cada iteração
do loop como uma
passagem pelos dados de treinamento. Ou seja, cada vez que você vê
os dados de treinamento, sua compreensão deles melhora,
de forma que você diminuirá
as áreas que você cria. Isso vale tanto para
humanos quanto para máquinas. Quanto mais eu pratico, mais inteligente eu me torno. Ok, então acontece que muitos algoritmos de aprendizado de máquina
são treinados dessa maneira. O método é, pensamos em
alguma função de custo útil. Em seguida, derivamos uma regra de atualização forma que, se continuarmos
aplicando essa regra de atualização, o modelo melhorará seu erro. Eventualmente, o erro converge
para algum valor mínimo, momento em
que você pode ver que concluiu
esse aprendizado. Nessas situações,
é útil
traçar seu custo por
iteração quando o
treinamento for concluído
para que você possa verificar se o
processo de treinamento foi bem-sucedido. E, novamente, muitos algoritmos
usam esse método de aprendizado. Conforme mencionado anteriormente, isso se aplica ao agrupamento de k-means, regressão
linear e regressão
logística. Também se aplica a redes neurais
profundas, aprendizado por
reforço
e fatoração de matrizes, só para citar
mais alguns exemplos. Ok, então essa é a ideia de
funções de aprendizado e custo em geral. Mas qual é a função de custo ou a
função objetiva para k-means? Como nota lateral,
lembre-se de que custo e objetivo e perda e
erro são todos sinônimos. Se eu usar um
desses termos no lugar do outro, não se assuste. Todos eles significam a mesma coisa. De qualquer forma, se você
se sentir confortável com a soma dos erros quadrados
para regressão linear
, também se
sentirá confortável com a
função de custo para k-means, que parece muito semelhante. Ok, então vamos passar por
isso lentamente para que você entenda cada componente
do objetivo. Primeiro, você pode ver que está
na forma de uma soma
dos erros quadrados. Somamos todos os n pontos de dados e colocamos a coisa dentro do quadrado. Observe que, como x sub n
e m sub k são vetores, denotamos a
distância euclidiana com barras duplas. Essa é a nossa notação
para a norma. A parte que é confusa para algumas pessoas é a
estranha notação. Isso é chamado de função
indicadora. Ele tem um valor de um
quando o argumento é verdadeiro e zero caso contrário. Como você lembra, y sub n armazena a identidade
do cluster do enésimo ponto de dados. Portanto, podemos
interpretar isso da seguinte maneira. Embora somemos
todos os valores de k, apenas um deles
contribui para o custo. É aquele que
é igual a y de n. E isso ocorre porque y de n atribui X de n a um por agrupamento. Portanto, o custo é a distância
quadrada entre x sub n e a média de qualquer
agrupamento ao qual ele pertence. Então, espero que isso faça sentido. Somamos todos os n pontos de dados. Para cada um dos n pontos de dados, adicionamos uma única distância quadrada. A distância quadrada que
adicionamos é a
distância quadrada entre x sub n e a média do
agrupamento ao qual ele pertence. Então, se x sub n pertence
ao agrupamento k, então adicionamos a
distância quadrada entre x de n e m sub k. Como nota lateral, você
pode ver que o pequeno k soma de um até o grande K. No código. caso pequeno soma de
zero até k menos um. Isso se deve apenas à forma como a
programação em Python funciona. Portanto, esteja atento
a essa diferença. Quando estamos escrevendo equações, normalmente é mais fácil contar a
partir de um em vez de zero. Também vale a pena falar sobre por que esse objetivo faz sentido. Para entender isso, podemos considerar alguns cenários
diferentes. Primeiro, vamos considerar
o cenário em que os clusters estão
claramente definidos. Todos os pontos de dados pertencentes a um cluster estão muito próximos
do centro do cluster. Como esse é o caso, todas as distâncias quadradas
serão muito pequenas. E, portanto, a soma total das distâncias
quadradas
também será muito pequena. Ok, agora vamos considerar
um segundo cenário. Desta vez, os clusters
estão menos bem definidos. Agora, os pontos de dados podem estar muito distantes
do centro do cluster. Por causa disso, as
distâncias quadradas são maiores e, portanto, a soma total das distâncias
quadradas
será maior. A função de custo
não favorece esse cenário porque os clusters estão menos
bem definidos do que antes. Agora, vamos considerar um
terceiro cenário em que
as atribuições reais do cluster
estão erradas nesse caso, porque os pontos de dados não estão atribuídos ao centro de cluster
mais próximo. A distância quadrada
entre cada ponto de dados e o centro do agrupamento ao
qual
ele está realmente atribuído será muito grande. Como essas distâncias
são muito grandes, a soma total das distâncias
quadradas também
será muito grande. Então, claramente,
para reduzir o custo, devemos atribuir cada ponto de dados ao centro de agrupamento mais próximo, minimizando
assim a distância. Observe que, por causa
do algoritmo k-means, podemos escrever a função
objetiva de
uma forma alternativa e talvez essa seja
mais fácil de entender. Portanto, neste fórum, não precisamos
mais somar k. Sabemos que x de n será atribuído a dois, seja qual for o
cluster mais próximo. Portanto, a parte interna
do custo é apenas a
distância quadrada entre x de n e qualquer meio
que esteja mais próximo usar
a raiz quadrada
da distância euclidiana. Neste formulário, tomamos
a distância mínima diretamente usando a notação Min. Outra forma de escrever o objetivo
k-means é essa. Podemos definir uma quantidade chamada matriz de
responsabilidade, indicada pela letra R. Basicamente, é
a mesma coisa que a função indicadora
que vimos anteriormente. Mas agora é uma matriz
em vez de uma função, essencialmente r de n k, ou seja, o valor na linha n, coluna k é igual a um. Se x de n pertence ao agrupamento k,
caso contrário, é zero. Você deve ser capaz de
verificar se cada linha do nosso correspondente a um
único ponto de dados em X contém apenas um
único e o restante dos valores deve ser zero. Isso porque x só pode
pertencer a um único cluster. Em outras palavras, x só pode ter uma única identidade de cluster. E, novamente, temos essa
situação em que, embora
somemos todos os valores de k,
tecnicamente na realidade, apenas um desses termos é zero e o resto
é zero porque o valor da responsabilidade é zero quando x não pertence
a esses agrupamentos. Um fato interessante
é que, para k-means, não
derivamos o algoritmo
de
aprendizado da função de custo. Tudo o que fizemos foi partir de dois fatos simples sobre agrupamento que
pareciam fazer sentido. Então descobrimos que, se repetirmos esses dois fatos
simples em um loop, acabaríamos com k-means. Para recapitular, esses dois
fatos são os seguintes. Primeiro, as identidades do
cluster devem ser atribuídas para que X de n pertença ao centro do
cluster mais próximo. E número dois, os centros do
agrupamento são apenas a média de todos
os x que pertencem a ele. No entanto, usando o que
sabemos sobre funções de custo, isso não parece muito rigoroso. Você pode perguntar se a regressão
linear e redes
neurais podem derivar suas regras de aprendizado
da função objetiva, por que podemos fazer isso com K-mean? Neste momento, ainda não
estamos prontos para entender como esse
algoritmo pode ser derivado. Mas se você quiser saber mais, é recomendável aprender
sobre os modelos de mistura gaussiana, também conhecidos como GMM. Gmm é ou um modelo probabilístico, que pode ser visto como uma
generalização do
agrupamento de K-means através
da lente do GMM, você pode derivar o algoritmo de
atualização para K-means em termos de
probabilística quantidades. Então, se você está procurando uma derivação
mais rigorosa, essa seria a
próxima etapa a ser explorada. O ponto principal desta
palestra é entender
a ideia de que k-means tem uma função objetiva
em primeiro lugar. Você não
saberia disso apenas pelo próprio algoritmo. É por isso que não
discutimos isso até agora. O segundo ponto é que isso nos
prepara para escrever mais código. Em particular, seu
próximo exercício é esse. Pegue o código k-means que
tínhamos anteriormente e adicione mais código para
que, após o treinamento, possamos traçar a
função objetivo em cada iteração. Esperamos que a cada iteração
do agrupamento k-means, o objetivo
fique vez menor até convergir
para algum valor mínimo. Então, por favor, escreva esse código e
confirme se isso é verdade. Tudo bem, então esse é o exercício. Boa sorte, e nos
vemos na próxima palestra.
10. Objetivo (código): Nesta palestra,
concluiremos o próximo exercício de
implementação de k-means, que é traçar
a função de custo durante o processo de treinamento. Depois de fazer isso,
podemos considerar nossa
implementação k-means concluída. Como você verá, isso é apenas uma simples modificação do código que
já escrevemos. Como concluímos a maior parte do trabalho na palestra
anterior. Como sempre,
certifique-se de concluir este exercício antes de
assistir a esta palestra, pois essa é sua
lição de casa para este curso. Em outras palavras, não
procure as soluções para
a lição de casa antes de
concluir a lição de casa. Ok, então vamos começar. Primeiro, você pode ver que todas
as partes iniciais
do código são iguais. As entradas são as mesmas, os dados são os mesmos. O que nos interessa é
o ciclo de treinamento k-means. Então, vamos rolar até
aquela parte do caderno. Agora, você pode ter assumido
que teríamos uma função separada para
calcular o custo, mas acontece que é mais simples
computá-la em
nosso ciclo de treinamento. Observe que usaremos
a versão do custo que contém
o operador Min. Nesse caso,
não há necessidade de fazer uma soma dupla sobre as n
amostras e os clusters k. A verdadeira razão pela qual você
precisa somar os k clusters é
porque você precisa
descobrir a qual cluster cada ponto de
dados x de n pertence. Em K-means, isso é definido
pela distância mínima entre x de n e cada uma delas significa. No entanto, você se lembrará de que já
encontramos
isso no código. Assim, se fizéssemos uma
função para fazer isso, estaríamos repetindo o
trabalho que já fizemos, o que seria ineficiente. Ok, então vamos dar uma
olhada no código para que possamos analisar onde já
fizemos esse cálculo. Primeiro, antes mesmo de
entrarmos no ciclo de treinamento, criaremos
duas novas variáveis. Temos discos Min,
que é plural, que é uma matriz
que armazenará distâncias
mínimas
para todas as n amostras. A seguir, temos uma lista
para armazenar os custos. Esta é uma lista e não uma matriz pois o número de
iterações é variável. Então, isso armazenará
o custo em cada iteração. Ok, então, dentro do circuito, vamos
examinar cuidadosamente a etapa número um. Você notará que
fazemos dois loops, um sobre os n pontos de dados
e outro sobre os kclusters. Para cada um dos grupos k, calculamos a distância euclidiana da
raiz quadrada entre a média do agrupamento, o enésimo ponto de dados. Além disso, você
lembrará que armazenamos isso em uma variável
chamada min dist. Isso é exatamente o que
precisamos para o custo. Portanto, tudo o que precisamos fazer
é que nosso circuito interno esteja completo. Basta salvar o disco principal
nos discos principais da matriz. Depois de concluirmos a etapa um, agora
temos todos os discos N Min, que são as distâncias
euclidianas quadradas entre cada ponto de dados e o centro de agrupamento
mais próximo. Como você sabe, o custo total
é apenas a soma deles. Portanto, chamamos
a função Sum em homens assim para obter o custo, e a armazenamos em
nossa lista de carros. Depois disso, o resto
do código é o mesmo. Então, depois de terminarmos o treinamento, podemos chamar plt.plot para traçar
o custo por iteração. Então, como você pode ver, o custo por iteração
diminui a cada iteração e, eventualmente, converge para algum valor mínimo, conforme prometido. E, novamente, vamos
nos lembrar por que isso é importante. É importante
fazer isso sempre que você estiver treinando um modelo usando
um algoritmo iterativo. Normalmente, isso envolve minimizar ou maximizar algum objetivo. Portanto, você gostaria de
traçar esse objetivo em cada iteração para verificar
se seu código está
funcionando conforme o esperado. Na verdade, às vezes, como
no aprendizado profundo, mesmo que seu código esteja correto, as coisas ainda podem falhar devido à seleção
abaixo do ideal
de hiperparâmetros. Então esse é outro
motivo pelo qual você precisa traçar o custo por iteração. Caso contrário, você não tem ideia se seu modelo
aprendeu o
que deveria aprender só porque seu
código está correto. Isso não significa que os
hiperparâmetros que você escolheu também estejam corretos. Portanto, a lição é que, sempre que você tem um algoritmo iterativo, é sempre importante
traçar o custo por iteração.