Algoritmos Comuns para Inteligência Artificial IoT

1. Algoritmo de regressão logística

1. O que é Regressão Logística

A regressão logística é um desses processos: enfrentar um problema de regressão ou classificação, estabelecer uma função de custo, resolver iterativamente os parâmetros do modelo ideal por meio de métodos de otimização e, em seguida, testar e verificar a qualidade do nosso modelo resolvido.

Embora a regressão logística tenha "regressão" em seu nome, na verdade é um método de classificação, usado principalmente para problemas de duas categorias (ou seja, existem apenas dois tipos de saída, representando duas categorias respectivamente)

No modelo de regressão, y é uma variável qualitativa, como y=0 ou 1, e o método logístico é usado principalmente para estudar a probabilidade de certos eventos

2. Vantagens e desvantagens da regressão logística

vantagem:

1) Rápido, adequado para problemas de classificação binária

2) Simples e fácil de entender, veja diretamente o peso de cada recurso

3) O modelo pode ser facilmente atualizado para absorver novos dados

deficiência:

A capacidade de adaptação a dados e cenários tem limitações e não é tão adaptável quanto o algoritmo de árvore de decisão

3. A diferença entre regressão logística e regressão linear múltipla

A regressão logística e a regressão linear múltipla realmente possuem muitas semelhanças, a maior diferença é que suas variáveis ​​dependentes são diferentes, e as outras são basicamente as mesmas. Por causa disso, as duas regressões podem ser atribuídas à mesma família, modelos lineares generalizados.

4. Usos da regressão logística

Encontrar fatores de risco: procurar fatores de risco para uma determinada doença, etc.;

Predição: De acordo com o modelo, prever a probabilidade de uma determinada doença ou uma determinada situação sob diferentes variáveis ​​independentes;

Discriminação: Na verdade, é um pouco semelhante à previsão. Também se baseia no modelo para julgar a probabilidade de uma pessoa pertencer a uma determinada doença ou a uma determinada situação, ou seja, para ver a probabilidade dessa pessoa pertencer a uma determinada doença.

5. Etapas gerais de regressão

Encontre a função h (ou seja, a função de previsão)

Construa a função J (função de perda)

Encontre uma maneira de minimizar a função J e encontre os parâmetros de regressão (θ)

6. Construa a função de previsão h(x)

1) Função logística (ou chamada função Sigmóide), a forma da função é:

 

Para o caso de um limite linear, a forma do limite é a seguinte:

 

Entre eles, os dados de treinamento são um vetor

 

O valor da função h(x) tem um significado especial, que representa a probabilidade do resultado ser 1, então as probabilidades da classe 1 e classe 0 para a entrada x são:

P(y=1│x;θ)=h_θ (x)

P(y=0│x;θ)=1-h_θ (x)

7. Construa a função de perda J (m amostras, cada amostra tem n características)

A função Custo e a função J são as seguintes, derivadas com base na estimativa de máxima verossimilhança.

 

8. Processo de derivação detalhado da função de perda

1) A probabilidade da função de custo
é combinada e escrita como:

 

Considere a função de verossimilhança como:

 

A função log-verossimilhança é:

 

A estimativa de máxima verossimilhança é encontrar o θ quando l(θ) assume o valor máximo.Na verdade, o método de gradiente ascendente pode ser usado aqui para resolver o problema.O θ obtido é o parâmetro ótimo necessário.

No curso de Andrew Ng, J(θ) é tomado como a seguinte fórmula, a saber:

 

  1. Método de descida de gradiente para encontrar o valor mínimo

 

O processo de atualização θ pode ser escrito como:

 

9. Vetorização

A ectorização usa cálculos de matriz em vez de loops for para simplificar o processo de cálculo e melhorar a eficiência.
Processo de vetorização:
A forma de matriz dos dados de treinamento acordados é a seguinte, cada linha de x é uma amostra de treinamento e cada coluna é um valor especial diferente:

 

O parâmetro A de g(A) é um vetor de coluna, então a implementação da função g deve suportar vetores de coluna como parâmetros e retornar vetores de coluna.
O processo de atualização θ pode ser alterado para:

 

Resumindo, as etapas de atualização de θ após a Vetorização são as seguintes:

  1. Encontre A=x*θ
  2. E=g(A)-y
  3.  

10. Regularização

(1) Problema de sobreajuste
Sobreajuste significa sobreajustar os dados de treinamento, o que aumenta a complexidade do modelo e o torna menos próspero (a capacidade de prever dados desconhecidos)
. a imagem do meio é o ajuste adequado, com overfitting à direita.

 

(2) A principal razão para o overfitting

Problemas de superajuste geralmente surgem por ter muitos recursos

Solução

1) Reduza o número de recursos (reduzir recursos perderá algumas informações, mesmo que os recursos sejam bem selecionados)

• Os recursos a serem retidos podem ser selecionados manualmente;

• Algoritmo de seleção de modelo;

2) Regularização (mais eficaz quando há muitos recursos)

• Preservar todos os recursos, mas reduzir o tamanho de θ

(3) Método de regularização

A regularização é a concretização da estratégia de minimização do risco estrutural, que consiste em adicionar ao risco empírico um item de regularização ou item de penalização. O termo de regularização é geralmente uma função monotonicamente crescente da complexidade do modelo, quanto mais complexo o modelo, maior o termo de regularização.

O termo regular pode assumir diferentes formas.No problema de regressão, a perda quadrada é tomada, que é a norma L2 do parâmetro, e também pode ser tomada a norma L1. Ao tomar a perda ao quadrado, a função de perda do modelo torna-se:

 

lambda é o coeficiente de regularização:

• Se seu valor for grande, significa que a penalidade de complexidade para o modelo é grande e a penalidade de perda para os dados de ajuste é pequena, de modo que não superajuste os dados, o desvio nos dados de treinamento é grande e o penalidade de perda nos dados desconhecidos A variância é pequena, mas pode ocorrer subajuste;

• Se seu valor for pequeno, significa que mais atenção é dada ao ajuste dos dados de treinamento, e o desvio nos dados de treinamento será pequeno, mas pode levar ao overfitting.

A atualização do algoritmo de descida de gradiente regularizado θ torna-se:

 

11. Python implementa regressão logística:

from sklearn.linear_model import LogisticRegression
Model = LogisticRegression()
Model.fit(X_train, y_train)
Model.score(X_train,y_train)
# Coeficiente de equação e interceptação
Print('Coeficiente',model.coef_)
Print('Intercept',model. intercept_)
# Predict Output
Predicted = Model.predict(x_test)

----- Parte do conteúdo é referenciado em: Logistic Regression-Theory _pakko's Blog-CSDN Blog_Logistic Regression Binomial Distribution

2. Algoritmo K-means

1. Visão Geral

O algoritmo K-means é o método de agrupamento baseado em partição mais clássico e um dos dez principais algoritmos clássicos de mineração de dados. A ideia básica do algoritmo K-means é agrupar os k pontos no espaço e classificar os objetos mais próximos a eles. Através do método iterativo, o valor de cada centro de agrupamento é atualizado sucessivamente até que o melhor resultado de agrupamento seja obtido.

O algoritmo k-means aceita o parâmetro k e, em seguida, divide a entrada de n objetos de dados antecipadamente em k clusters para que os clusters obtidos satisfaçam a similaridade de objetos no mesmo cluster, enquanto objetos em clusters diferentes A similaridade é pequena. A similaridade do cluster é calculada usando um "objeto central" (centro de gravidade) obtido a partir do valor médio dos objetos em cada cluster.

2. Princípio de implementação

A ideia básica do algoritmo KMeans é inicialmente definir aleatoriamente K centros de clusters e dividir os pontos amostrais a serem classificados em cada cluster de acordo com o princípio do vizinho mais próximo. Em seguida, recalcule os centróides de cada cluster de acordo com o método da média, de modo a determinar o novo centro do cluster. Itera até que a distância móvel do centro do cluster seja menor que um determinado valor.

O algoritmo de agrupamento K-Means é dividido principalmente em três etapas:

(1) O primeiro passo é encontrar o centro do cluster para os pontos a serem agrupados;

(2) O segundo passo é calcular a distância de cada ponto ao centro do cluster e agrupar cada ponto no cluster mais próximo do ponto;

(3) O terceiro passo é calcular o valor médio das coordenadas de todos os pontos em cada cluster e usar esse valor médio como o novo centro do cluster;

Repita (2) e (3) até que o centro do cluster não se mova mais em uma grande faixa ou o número de clusters atinja o requisito.

A figura abaixo mostra o efeito do agrupamento K-means em n pontos de amostra, onde k é 2:

(a) Conjunto de pontos inicial não agrupado;

(b) Selecione aleatoriamente dois pontos como centros de cluster;

(c) Calcule a distância de cada ponto até o centro do cluster e do cluster até o cluster mais próximo do ponto;

(d) Calcule o valor médio das coordenadas de todos os pontos em cada cluster e use esse valor médio como o novo centro do cluster;

(e) Repita (c), calcule a distância de cada ponto até o centro do cluster e agrupe o cluster mais próximo do ponto;

(f) Repita (d), calcule as coordenadas médias de todos os pontos em cada cluster e use essa média como o novo centro do cluster.

A maior vantagem deste algoritmo é a sua simplicidade e rapidez. A chave do algoritmo está na seleção do centro inicial e na fórmula da distância.

O valor de K:
Não existe um método ótimo para determinar o número de clusters K e geralmente precisa ser selecionado manualmente de acordo com o problema específico. Não há um método direto de avaliação de agrupamento para agrupamento não supervisionado, mas o efeito do agrupamento pode ser avaliado a partir do grau de densidade dentro de um agrupamento e do grau de dispersão entre agrupamentos. Os métodos mais comuns são o Coeficiente de Silhueta e o Índice de Calinski-Harabaz. Dentre eles, o cálculo do Índice de Calinski-Harabaz é direto e simples, e quanto maior o resultado obtido, melhor o efeito de agrupamento. Calculado da seguinte forma:

 

Entre eles: m é o número de amostras no conjunto de treinamento e k é o número de categorias. Bk é a matriz de covariância entre categorias e Wk é a matriz de covariância entre dados internos. tr é o traço da matriz. Ou seja, quanto menor a covariância dos dados internos, melhor, e quanto maior a covariância entre as categorias, melhor, de modo que a pontuação do
Índice Calinski-Harabaz correspondente será maior. selecione os dados K ​​(isto é, o agrupamento final é a classe K) como o centro inicial do agrupamento. Calcule a distância euclidiana de cada ponto de dados para os K pontos centrais separadamente e atribua-a ao cluster mais próximo do ponto central. Recalcule a média coordenada dos dados do cluster K e use a nova média como o centro do cluster. Repita as etapas 2 e 3 até que as coordenadas dos centros dos clusters não sejam mais transformadas ou o número especificado de iterações seja alcançado para formar os K clusters finais. O algoritmo k-Means, também conhecido como k-means ou k-means, é um algoritmo de agrupamento amplamente usado ou forma a base de outros algoritmos de agrupamento. Assumindo que a amostra de entrada é S=x...m, os passos do algoritmo são: selecionar os k centros de categoria iniciais μ2.Hk para cada amostra x;, marcá-la como a categoria mais próxima do centro de categoria, a saber:















Atualize cada centro de classe para ser a média de todas as amostras pertencentes a essa classe

 



As duas últimas etapas são repetidas até que a variação dos centros de classe seja menor que algum limite.

Condição de término:

número de iterações) taxa de mudança do centro do cluster/erro quadrado mínimo MSE (Erro Quadrado Mínimo)

 

Registre K centros de cluster como M,μ,,k e o número de amostras em cada cluster como N,N2,..,N.
Use o erro quadrado como a função objetivo:



Encontre a derivada parcial da função em relação a from,...,Hp, seu ponto de estagnação é:

 

 

  1. Resumo do método de agrupamento k-Means

    (1) Vantagens:

    É um algoritmo clássico para resolver problemas de agrupamento. É simples e rápido para processar grandes conjuntos de dados. O algoritmo mantém escalabilidade e alta eficiência. Quando o cluster é distribuído aproximadamente Gaussiano, ele O efeito é melhor

    (2) Desvantagem:

    só pode ser usado quando o valor médio do cluster pode ser definido, pode não ser adequado para algumas aplicações,

    k (o número de clusters a serem gerados) deve ser fornecido antecipadamente, e é sensível ao valor inicial, valores iniciais diferentes podem levar a resultados diferentes.

    Não é adequado para encontrar clusters com formas não convexas ou clusters com grandes diferenças de tamanho. Sensível a ruído e dados atípicos,

    mas pode ser usado como algoritmo básico para outros métodos de agrupamento, como agrupamento espectral.
  2. Realize o código com JAVA:

class point {     public float x = 0;     public float y = 0;     public int flage = -1;     public float getX() {         return x;     }     public void setX(float x) {         this.x =     x     ;         return y;     }     public void setY(float y) {         this.y = y;     } } public class Kcluster {     point[] ypo;// set point     [] pacore = null;// old cluster center     point [] pacoren = null ;// novo centro de agrupamento     // centro de agrupamento preliminar, conjunto de pontos     public void productpoint() {         Scanner cina = new Scanner(System.in);

 

 

 



 



 



 




 

 

 

 

 



        System.out.print("Insira o número de pontos no cluster (gerados aleatoriamente):");
        int num = cina.nextInt();
 
        ypo = new point[num];
        // Gera pontos aleatoriamente
        para (int i = 0; i < num; i++) {             float x = (int) (new Random().nextInt(10));             float y = (int) (new Random().nextInt(10));             ypo[i] = new point();// Criação do objeto             ypo[i].setX(x);             ypo[i].setY(y);         }         // Inicializa a posição central do cluster         System.out.print("Insira o cluster de inicialização O número de centros (gerados aleatoriamente): ");         int core = cina.nextInt();         this.pacore = new point[core];// armazena o centro do cluster         this.pacoren = new point[core];         Random rand = novo Aleatório();
 


 



 

 





 

        int temp[] = new int[core];
        temp[0] = rand.nextInt(num);
        pacore[0] = new point();
        pacore[0].x = ypo[temp[0]].x;
        pacore[0].y = ypo[temp[0]].y;
        pacore[0].flage = 0;
        // Evita centros duplicados
        for (int i = 1; i < core; i++) {             int flage = 0;             int thistemp = rand.nextInt(num);             for (int j = 0; j < i; j++) {                 if (temp[j] == thistemp) {                     flage = 1;// tem                     intervalo repetido;                 }             }             if (flage == 1) {                 i--;






 




            } else {                 pacore[i] = new point();                 pacore[i].x = ypo[estemp].x;                 pacore[i].y = ypo[estemp].y;                 pacore[i].flage = 0; // 0 significa centro do cluster             }         }         System.out.println("Initial cluster center:");         for (int i = 0; i < pacore.length; i++) {             System.out.println(pacore[i] .x + " " + pacore[i].y);         }     }     // /// Descubra a qual centro de cluster cada ponto pertence     public void searchbelong()// Descubra a qual centro de cluster cada ponto pertence     {         for (int i = 0; i < ypo.length; i++) {             double dist = 999;             int lable = -1;





 





 

 



 



            for (int j = 0; j < pacore.length; j++) {                 double distance = distpoint(ypo[i], pacore[j]);                 if (distância < dist) {                     dist = distância;                     etiqueta = j;                     // po[i].flage = j + 1;// 1,2,3......                 }             }             ypo[i].flage = lable + 1;         }     }     // 更新聚类中心     public void calaverage() {         for (int i = 0; i < pacore.length; i++) {             System.out.println("以<" + pacore[i].x + ", " + pacore[i].y + ">为中心的点:");             int num = 0;
 





 



 

 

 


 




            for (int j = 0; j < ypo.length; j++) {                 if (ypo[j].flage == (i + 1)) {                     System.out.println(ypo[j].x + "," + ypo[j].y);                     numc += 1;                     newcore.x += ypo[j].x;                     newcore.y += ypo[j].y;                 }             }             // novo centro do cluster (isto é, toda a agregação O centro do ponto)             pacoren[i] = new point();             pacoren[i].x = newcore.x / numc;//soma das coordenadas x de todos os elementos agrupados/número de elementos             pacoren[i].y = newcore.y / numc;             pacoren[i].flage = 0;             System.out.println("Novo centro do cluster: " + pacoren[i].x + "," + pacoren[i].y);         }     }
 





 








 


 
    public double distpoint(point px, point py) {         return Math.sqrt(Math.pow((px.x - py.x), 2) + Math.pow((px.y - py.y), 2)) ;     }     public void change_oldtonew(point[] old, point[] news) {         for (int i = 0; i < old.length; i++) {             old[i].x = news[i].x;             old[i ].y = news[i].y;             old[i].flage = 0;//Representado como o sinalizador do centro do cluster.         }     }     public void movecore() {         // this.productpoint();//inicialização, conjunto de amostra, centro do cluster,         this.searchbelong();         this.calaverage();//         double moveddistance = 0;         int biao = - 1 ;// sinal, se o movimento do ponto central do cluster atende à distância mínima
 

 

 







 






        for (int i = 0; i < pacore.length; i++) {             movedistance = distpoint(pacore[i], pacoren[i]);//Calcular a distância entre os pontos centrais novos e antigos             System.out.println(" distcore: " +moveddistance);// A distância de movimento do centro do cluster             if (movedistance < 0.01) {                 biao = 0;             } else {                 biao = 0;             } else {                 biao = 1;// Continue iterando,                 break;             }         }         if ( biao == 0) {             System.out.print("iteração completa!!!!");         } else {             change_oldtonew(pacore, pacoren);             movecore();         }     }




 

 

 

 


 








 

 
    public static void main(String[] args) {         // TODO Método gerado automaticamente stub         Kcluster kmean = new Kcluster();         kmean.productpoint();         kmean.movecore();  }

 



}

----Parte do conteúdo é referenciado em: https://blog.csdn.net/weixin_40479663/article/details/82974625?utm_source=app&app_version=4.10.0&code=app_1562916241&uLinkId=usr1mkqgl919blen

Acho que você gosta

Origin blog.csdn.net/m0_72237363/article/details/128318847
Recomendado
Clasificación