Compartilhamento de tecnologia

modelo de regressão linear

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

regressão linear

1. Parte teórica

regressão linear: Em dados limitados, ajustando os parâmetros, uma linha reta é ajustada, e esta linha reta (modelo) é usada para realizar experimentos em dados desconhecidos.prever

DiretoForma geral
y = w × x + por = w vezes x + be=c×x+b
O estado de toda a linha reta é dado por w e bw e bcebDecidir, uaucdeterminar a linha retadeclive(isto é, o ângulo de inclinação), bbbDetermine a linha reta no eixo Yinterceptar(Controle a translação para cima e para baixo de uma linha reta, também conhecida comoviés ).Portanto, precisamos apenas calcular uauce bbbO valor de pode determinar uma linha reta específica A seguir, estudaremos como encontrar. uauce bbb

Insira a descrição da imagem aqui

A influência de w e b na forma da linha reta

nome próprio

substantivoDefinição
Conjunto de treinamentoConjunto de dados usado para treinar o modelo
Conjunto de testeConjunto de dados usado para testar a qualidade do modelo
Amostra de Treinamento/Ponto de Treinamento (Amostra de Treinamento)Cada item de dados no conjunto de treinamento
CaracterísticasA entrada de dados no modelo pode ser valores numéricos, rótulos de categoria, valores de pixels de imagem, etc.
Rótulo O modelo precisa prever o valor alvo. Para problemas de classificação, o rótulo geralmente é o nome da classe; para problemas de regressão, o rótulo é um valor contínuo;

1. Regressão linear univariada

1) Pré-processamento de dados

Vamos estudar primeiro a regressão linear univariada. A chamada regressão linear univariada refere-se a uma função linear com apenas uma variável independente, como: y = w ⋅ x + por = wcdot x +be=cx+bAquilo éLinha reta univariada, tem apenas uma variável de entrada xxx . Esta linha reta pode ser expressa em um plano bidimensional (o eixo horizontal é X e o eixo vertical é Y).

Quando obtemos um conjunto de dados indivisos, geralmente dividimos os dados em um conjunto de treinamento e um conjunto de teste. Um método de divisão simples é: considere os primeiros 80% das amostras como conjunto de treinamento e os 20% restantes como. o conjunto de teste.

2) Defina a função de custo

Suponha que descobrimos uauce bbb, então determinamos uma linha reta e podemos usá-la para fazer previsões, a fim de facilitar o julgamento do valor que prevemos.e'com valor realeentreerroQuanto, queremos definir *"uma régua"*, usada para medir o valor previsto e ′ e'ecom valor verdadeiro aaae erro entre.Aqui usamoserro quadrático médiodefinirfunção de custo

J ( w , b ) = 1 2 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) 2 J(w,b) = frac{1}{2m}somalimites_{i = 1}^m(f_{w,b}(x^{(i)}) - y^{(i)})^2Eu(c,b)=2eu1eu=1eu(ec,b(x(eu))e(eu))2
Desmantelamento de fórmula

fw , b ( x ( eu ) ) − y ( eu ) f_{w,b}(x^{(i)}) - y^{(i)}ec,b(x(eu))e(eu):em fw , b ( x ( eu ) ) f_{w,b}(x^{(i)})ec,b(x(eu))representa o valor previsto usando o modelo treinado, enquanto e ( eu ) y^{(i)}e(eu)representa o resultado verdadeiro de cada amostra de treinamento, e a diferença entre os dois representa o erro entre o valor previsto pelo modelo e o valor verdadeiro.

Por que quadrar o erro?

Em todos os conjuntos de amostras, cada erro pode ser positivo ou negativo, e haverá uma certa probabilidade de deslocamento durante o processo de soma. Isso levará a que o erro de cada item seja muito grande (como: -100, + 90,). -25, +30), após a soma, obtém-se um valor pequeno (-5) e, finalmente, obtém-se um julgamento errado.

1 2 m fração{1}{2m}2eu1: representa a média da soma de todos os erros de dados (essa média pode representar o erro de todo o modelo em certo sentido) e obtém o erro quadrático médio.

Por que dividir por 2

Porque quando a descida do gradiente for realizada posteriormente, a derivação dividirá o índice 2 em coeficientes, pois para uma grande quantidade de dados, uma constante tem pouco impacto no modelo. Para introduzir a fórmula de derivação, divida-a por 2 antecipadamente. , para deslocamento posterior.

Conhecendo a função de custo, só precisamos encontrar maneiras de reduzir o custo. Quanto menor o custo, mais próximo nosso valor previsto está do valor real.

Observando a função custo do erro, podemos ver que a função custo do erro é uma função quadrática, ou seja, umafunção convexa, uma propriedade da função convexa é:O ponto extremo é o ponto máximo , como a função de custo é uma função quadrática que se abre para cima (a fórmula pode ser expandida e você pode sentir intuitivamente que o coeficiente do termo quadrado é maior que 0), então a função convexa tem apenas um valor mínimo, e nós apenas precisa encontrar o O valor mínimo é o valor mínimo.Para a função de custo de erro J ( w , b ) J(w,b)Eu(c,b) , sua expansão de fórmula pode ser escrita como:
J ( w , b ) = 1 2 m ∑ i = 1 m ( ( wx ( i ) + b ) − y ( i ) ) 2 J(w,b) = frac{1}{2m}somalimites_{i = 1}^m((wx^{(i)}+b) - y^{(i)})^2Eu(c,b)=2eu1eu=1eu((cx(eu)+b)e(eu))2
JJEuO tamanho depende dos parâmetros uauce bbb, que pode ser resolvido por gradiente descendente. A forma da função de custo é aproximadamente a seguinte:

Insira a descrição da imagem aqui

3) Descida gradiente

A ideia de gradiente descendente funciona principalmenteEncontre a derivada parcialmétodo, que está relacionado à biologiavariáveis ​​de controleO método é muito semelhante, como por exemplo: no controle bbbAtualizar sem alteração uauc(Visível bbbé uma constante), fórmula: w ′ = w − α ∂ J ( w ) ∂ ww' = w - alfa frac{parcial J(w)}{parcial w}c=cαcEu(c) Indica que foi atualizado em sequência uauc,em α alfaα representataxa de Aprendizagem Usado para representar o tamanho do passo, que também pode ser entendido como a velocidade de descida, ∂ J ( w ) ∂ w frac{parcial J(w)}{parcial w}cEu(c) expressa certo uaucProcurando a derivada parcial, obtemos W - JW - JCEu(PesosCe preçoEufunção) Uma linha tangente em uma função convexa, usada para representar o valor da função que diminui mais rapidamentedireção, o produto dos dois representaDê um passo na direção onde o valor da função diminui mais rapidamente .Esta distância precisa ser ajustada de acordo com o conjunto de dados. α alfaαSe for muito grande (o tamanho do passo é muito grande), isso levará a uaucvai diretamente do ponto mais baixo até o ponto mais alto do outro lado, de modo que nunca chegue perto do mínimo, se α alfaαSe for muito pequeno (o tamanho do passo é muito pequeno), isso levará a uaucFica cada vez mais lento à medida que se aproxima do mínimo, consumindo custos computacionais.


taxa de Aprendizagem ( α alfaα) método de ajuste

  1. Defina um menor primeiro α alfaα Como: 0,001.

  2. Depois aumenta 10 vezes de cada vez, até um máximo de 1.

  3. Após determinar um determinado valor, como: 0,01.

  4. Em seguida, execute 3 vezes o processamento, como: 0,01 × 3 = 0,03, 0,03 × 3 = 0,09 0,01 vezes 3 = 0,03, 0,03 vezes 3 = 0,090.01×3=0.03,0.03×3=0.09 (O objetivo disso é tornar a convergência mais rápida).


O processo de resolução de derivadas parciais (encontrar a direção da descida do gradiente):

  • implorar ∂ J ( w ) ∂ w frac{parcial J(w)}{parcial w}cEu(c) :

    ∂ J ( w ) ∂ w frac{parcial J(w)}{parcial w}cEu(c) = ∂ ∂ w 1 2 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) 2 frac{parcial}{parcial w}frac{1}{2m}somalimites_{i = 1}^{m}(f_{w,b}(x^{(i)}) - y^{(i)})^2c2eu1eu=1eu(ec,b(x(eu))e(eu))2

    ​ = ∂ ∂ w 1 2 m ∑ i = 1 mwx ( i ) − y ( i ) ) 2 frac{parcial}{parcial w}frac{1}{2m}somalimites_{i = 1}^{m}wx^{(i)} - y^{(i)})^2c2eu1eu=1eucx(eu)e(eu))2

    ​ = 1 2 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) ⋅ 2 x ( i ) frac{1}{2m}somalimites_{i = 1}^{m}(f_{w,b}(x^{(i)}) - y^{(i)})cdot2x^{(i)}2eu1eu=1eu(ec,b(x(eu))e(eu))2x(eu)

    ​ = 1 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) x ( i ) frac{1}{m}somalimites_{i = 1}^{m}(f_{w,b}(x^{(i)}) - y^{(i)})x^{(i)}eu1eu=1eu(ec,b(x(eu))e(eu))x(eu)

  • implorar ∂ J ( w ) ∂ b frac{parcial J(w)}{parcial b}bEu(c) :

    ∂ J ( w ) ∂ b frac{parcial J(w)}{parcial b}bEu(c) = ∂ ∂ b 1 2 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) 2 frac{parcial}{parcial b}frac{1}{2m}somalimites_{i = 1}^{m}(f_{w,b}(x^{(i)}) - y^{(i)})^2b2eu1eu=1eu(ec,b(x(eu))e(eu))2

    ​ = ∂ ∂ b 1 2 m ∑ i = 1 mwx ( i ) − y ( i ) ) 2 frac{parcial}{parcial b}frac{1}{2m}somalimites_{i = 1}^{m}wx^{(i)} - y^{(i)})^2b2eu1eu=1eucx(eu)e(eu))2

    = 1 2 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) ⋅ 2 frac{1}{2m}somalimites_{i = 1}^{m}(f_{w,b}(x^{(i)}) - y^{(i)})cdot22eu1eu=1eu(ec,b(x(eu))e(eu))2

    ​ = 1 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) frac{1}{m}somalimites_{i = 1}^{m}(f_{w,b}(x^{(i)}) - y^{(i)})eu1eu=1eu(ec,b(x(eu))e(eu))

Encontre itens específicos por meio da iteração do loop uaucvalor com bbbvalor:

enquanto ( ) : enquanto():coieue():

w ∗ = w − α ∂ ∂ w J ( w , b ) w^* = w - alfa frac{parcial}{parcial w}J(w,b)c=cαcEu(c,b)

b ∗ = b − α ∂ ∂ b J ( w , b ) b^* = b - alfa frac{parcial}{parcial b}J(w,b)b=bαbEu(c,b)

w = w ∗ w = w^*c=c

b = b ∗ b = b^*b=b

No início, avaliamos w e b aleatoriamente e, em seguida, iteramos. Podemos definir a descida do gradiente para sair quando o erro for menor que um determinado limite ou personalizar o número de iterações. Por meio de etapas limitadas, podemos obter um valor mais ideal. uaucsoma do valor bbbvalor.

2. Regressão linear multivariável

A regressão linear multivariável expande as dimensões para três dimensões e até mesmo estados multidimensionais, como y = w 1 x 1 + w 2 x 2 + por = w_1 x_1 + w_2 x_2 + be=c1x1+c2x2+b pode ser entendido comoXEixo eEOs eixos são x 1 e x 2 x_1 e x_2x1ex2 ZO eixo é aaae, este é um estado tridimensional. Cada amostra de treinamento é um ponto no espaço tridimensional. É necessário encontrar uma linha reta adequada para ajustar o ponto da amostra no espaço tridimensional.

Método: Para cada variável separadamente ( w 1 , w 2 , … , wn , b w_1,w_2,pontos,w_n,bc1,c2,,ce,b) para processamento de descida gradiente

Pontos principais: Para regressão linear multivariável, os intervalos de valores de diferentes valores de recursos são diferentes, como: o intervalo de valores do recurso de idade: 0 0 0 ~ 100 100 100, área de cobertura: 0 m 2 0m^20eu2 ~ 10000 m 2 10000m^210000eu2 , também pode haverAmostra estranha, a existência de dados de amostra singulares fará com que o tempo de treinamento aumente e também pode levar à falha na convergência. Portanto, quando há dados de amostra singulares, é necessário pré-processar os dados antes do treinamento.Normalizado ; Pelo contrário, quando não há dados de amostra singulares, a normalização não precisa ser realizada.Para resolver esse problema, precisamos realizarOs recursos são dimensionados (normalizados)

1) Pré-processamento de dados

Processamento de normalização de dados

concluirNormalização de dadosExistem três métodos:

  1. O mesmo que dividir pelo valor máximo:

    Todos os valores em cada recurso são divididos pelo valor máximo desse recurso.

  2. Normalização média:

    Subtraia o valor de cada recurso do valor desse recursosignificare depois dividido pela diferença entre os valores máximo e mínimo do recurso.

  3. Normalização do escore Z:

    Calcule cada recursodesvio padrãoesignificar

    Subtraia o valor de cada recurso de todos os valores desse recursovalor médioe depois dividido pelo recursosignificar

Se a normalização não for realizada, a função de custo mudará devido a grandes diferenças nos valores dos diferentes recursos no vetor de recursos. "plano" .Desta forma, ao realizar a descida do gradiente, a direção do gradiente se desviará da direção do valor mínimo e irá muitoDesvio, o que tornará o tempo de treinamento muito longo.

Após a normalização, a função objetivo mostrará uma comparação "redondo", para que a velocidade de treinamento seja bastante acelerada e muitos desvios sejam evitados.

Benefícios da normalização de dados:

  1. Após a normalizaçãoAcelera a descida do gradiente para encontrar a solução ideal, ou seja, acelerar a convergência da rede de formação.
  2. A normalização tem o potencial de melhorar a precisão.
2) Função de custo (igual à função de custo da regressão linear univariada)

J ( w , b ) = 1 2 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) 2 J(w,b) = frac{1}{2m}somalimites_{i = 1}^m(f_{w,b}(x^{(i)}) - y^{(i)})^2Eu(c,b)=2eu1eu=1eu(ec,b(x(eu))e(eu))2

3) Descida gradiente

Gradiente descendente para regressão linear múltipla

w 1 = W 1 − α 1 m ∑ i = 1 m ( fw ⃗ , bx ⃗ ( i ) − y ( i ) ) x 1 ( i ) w_1 = W_1 - alfa frac{1}{m}somalimites_{i = 1}^{m}(f_{vec{w},b}vec{x}^{(i)} - y^{(i)})x_1^{(i)}c1=C1αeu1eu=1eu(ec ,bx (eu)e(eu))x1(eu)

⋮ vdots

wn = W n − α 1 m ∑ i = 1 m ( fw ⃗ , bx ⃗ ( i ) − y ( i ) ) xn ( i ) w_n = W_n - alfa frac{1}{m}somalimites_{i = 1}^{m}(f_{vec{w},b}vec{x}^{(i)} - y^{(i)})x_n^{(i)}ce=Ceαeu1eu=1eu(ec ,bx (eu)e(eu))xe(eu)

b = b − α 1 m ∑ i = 1 m ( fw ⃗ , bx ⃗ ( i ) − y ( i ) ) b = b - alfa frac{1}{m}somalimites_{i = 1}^{m}(f_{vec{w},b}vec{x}^{(i)} - y^{(i)})b=bαeu1eu=1eu(ec ,bx (eu)e(eu))

explicar: w 1 ⋯ wn w_1cdots w_nc1ce representa o coeficiente de cada variável e b representa o termo constante da função linear.

3. Equação normal

1) Pré-processamento de dados

Omitir...

2) Função custo

Derivação matemática:

J = 1 2 m ∑ i = 1 m ( θ ⃗ ix ⃗ i − yi ) 2 J = frac{1}{2m}somalimites_{i = 1}^{m}(vec{theta}_i vec{x}_i - y_i)^2Eu=2eu1eu=1eu(θ eux eueeu)2

​ = 1 2 m ∣ ∣ θ ⃗ x ⃗ − y ∣ ∣ 2 frac{1}{2m}||vec{theta} vec{x} - y||^22eu1∣∣θ x e2

​ = 1 2 m ( θ ⃗ x ⃗ − y ) T ( θ ⃗ x ⃗ − y ) frac{1}{2m}(vec{teta} vec{x} - y)^T(vec{teta} vec{x} - y)2eu1(θ x e)E(θ x e)

​ = 1 2 m ( θ ⃗ T x ⃗ T − y T ) ( θ ⃗ x ⃗ − y ) frac{1}{2m}(vec{teta}^T vec{x}^T - y^T)(vec{teta} vec{x} - y)2eu1(θ Ex EeE)(θ x e)

​ = 1 2 m ( θ ⃗ T x ⃗ T x ⃗ θ ⃗ − y T x ⃗ θ ⃗ − θ ⃗ T x ⃗ T y + y T y ) frac{1}{2m}(vec{teta}^T vec{x}^Tvec{x}vec{teta} - y^Tvec{x}vec{teta} -vec{teta}^Tvec{x}^Ty +y^Ty )2eu1(θ Ex Ex θ eEx θ θ Ex Ee+eEe)

3) Descida gradiente

certo θ tetaθEncontre a derivada parcial: Δ = ∂ J ∂ θ = 1 2 m ( ∂ θ ⃗ T x ⃗ T x ⃗ θ ⃗ ∂ θ − ∂ y T x ⃗ θ ⃗ ∂ θ − ∂ θ ⃗ T x ⃗ T y ∂ θ + y T y ∂ θ ) Delta = frac {parcial J}{parcial theta} = frac {1}{2m} (frac {parcial vec {teta} ^ T vec {x} ^ Tvec {x} vec {teta}} {parcial theta} - frac {parcial y ^ Tvec {x} vec {teta}} {parcial theta} - frac {parcial vec{theta}^Tvec{x}^Ty}{theta parcial} + frac{y^Ty}{theta parcial})Δ=θEu=2eu1(θθ Ex Ex θ θeEx θ θθ Ex Ee+θeEe)

Regra de derivação de matriz:

  1. ∂ θ TA θ ∂ θ = ( A + AT ) θ frac{parcial theta^{T}Atheta}{parcial theta} = (A + A^T)thetaθθEAθ=(A+AE)θ

  2. ∂ XTA ∂ X = A frac{parcial X^{T}A}{parcial X} = AXXEA=A

  3. ∂ AX ∂ X = AT frac{parcial AX}{parcial X} = A^TXAX=AE

  4. ∂ A ∂ X = 0 frac{parcial A}{parcial X} = 0XA=0

Disponível Δ = 1 2 m ( ∂ θ ⃗ T x ⃗ T x ⃗ θ ⃗ ∂ θ − ∂ y T x ⃗ θ ⃗ ∂ θ − ∂ θ ⃗ T x ⃗ T y ∂ θ + y T y ∂ θ ) = 1 2 m ⋅ ( 2 x T x θ − 2 x T y ) = 1 m ⋅ ( x T x θ − x T y ) Delta = frac{1}{2m}(frac{parcial vec{theta}^T vec{x}^Tvec{x}vec{theta}}{parcial theta} - frac{parcial y^Tvec{x}vec{teta}}{teta parcial} - frac{vec{teta} parcial^Tvec{x}^Ty}{teta parcial} + frac{y^Ty}{teta parcial}) = frac{1}{2m}cdot (2x^Txteta - 2x^Ty) = frac{1}{m} cdot (x^Txteta - x^Ty)Δ=2eu1(θθ Ex Ex θ θeEx θ θθ Ex Ee+θeEe)=2eu1(2xExθ2xEe)=eu1(xExθxEe)
quando Δ = 0 Delta = 0Δ=0 hora: x T x θ = x T yx^Tx teta = x^TyxExθ=xEe , θ = ( x T x ) − 1 x T y teta = (x^Tx)^{-1}x^Tyθ=(xEx)1xEe pode ser calculado θ tetaθ valor.

Comparação de gradiente descendente e equações normais

  • Gradiente descendente: É necessário selecionar a taxa de aprendizado α, que requer múltiplas iterações. Também pode ser melhor aplicado quando o número de recursos n é grande e é adequado para vários tipos de modelos.

  • equação normal: Não há necessidade de selecionar a taxa de aprendizagem α. Ela é calculada uma vez e precisa ser calculada. ( x T x ) − 1 (x^Tx)^{-1}(xEx)1 , se o número de recursos nãoeSe for maior, o custo da operação será maior, pois a complexidade do tempo de cálculo da matriz inversa é O ( n 3 ) O(n^3)O(e3) , geralmente quando nãoeAinda é aceitável quando é inferior a 10.000.Disponível apenas para modelos lineares, não é adequado para outros modelos, como modelos de regressão logística.

4. Regressão polinomial

Como em alguns casos é difícil que as linhas retas ajustem todos os dados, são necessárias curvas para ajustar os dados, como modelos quadráticos, modelos cúbicos, etc.

Em geral, a função de regressão dos dados é desconhecida. Mesmo que seja conhecida, é difícil transformá-la em um modelo linear com uma simples transformação de função, portanto a abordagem comum é.regressão polinomial(Regressão Polinomial), ou seja, usando uma função polinomial para ajustar os dados.

Como escolher o grau de um polinômio

Existem muitos tipos de funções polinomiais. De modo geral, você precisa primeiro observar a forma dos dados e depois decidir qual forma de função polinomial usar para resolver o problema. Por exemplo, a partir do gráfico de dispersão dos dados, se houver um "dobrar ", você pode considerar o uso de um polinômio quadrático (ou seja, quadrar as características); existem dois "dobrar ", você pode considerar o uso de um polinômio cúbico (tomando a potência cúbica do recurso); existem três "dobrar ”, então considere usar um polinômio de quarta ordem (tomando a quarta potência do recurso) e assim por diante.

Embora a função de regressão real não seja necessariamente um polinômio de certo grau, desde que o ajuste seja bom, é viável usar um polinômio apropriado para aproximar a função de regressão real.

2. Parte experimental

O apêndice no final do artigo contém todos os dados originais utilizados no experimento.ex1data1.txté a relação entre população e lucro, ex1data2.txtÉ o impacto do tamanho da casa e do número de quartos no preço da casa.

1. Regressão linear univariada

1) Carregar dados
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
path = "ex1data1.txt"
data = pd.read_csv(path,header = None,names=['Population','Profit'])
data.head()   # 预览数据
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Insira a descrição da imagem aqui

2) Ver dados
data.describe()    # 更加详细的数据描述
  • 1

Insira a descrição da imagem aqui

# 可视化训练数据
data.plot(kind = 'scatter',x = 'Population',y = 'Profit',figsize = (12,8))
plt.show()
  • 1
  • 2
  • 3

Insira a descrição da imagem aqui

3) Defina a função de custo
def computerCost(X,y,theta):    # 定义代价函数
    inner = np.power(((X*theta.T)-y),2)   # theta.T表示theta的转置
    return np.sum(inner)/(2*len(X))
  • 1
  • 2
  • 3
data.insert(0,"One",1)  # 表示在第0列前面插入一列数,其表头为One,其值为1
  • 1

Insira na primeira coluna do conjunto de dados 1 1 1A função éFacilita cálculos matriciais, quando matrizes são multiplicadas, pesos estão envolvidos uauce preconceito bbb,porque bbbnão é multiplicado pela variável, então um 1 1 1, usado com bbbMultiplicar.

4) Divida os dados
cols = data.shape[1]
X = data.iloc[:,0:cols - 1]  #“,”前只有“:”,表示所有的行,“,”后表示抽取数据中第[0列~第cols-1列)(左闭右开),去掉最后一列,最后一列为预测值

y = data.iloc[:,cols - 1:cols]  #只取最后一列的值,表示预测值

  • 1
  • 2
  • 3
  • 4
  • 5
X.head()
  • 1

Insira a descrição da imagem aqui

y.head()
  • 1

Insira a descrição da imagem aqui

X = np.matrix(X.values)
y = np.matrix(y.values)  #只将表格中的值装换为矩阵而不是包括序号与标题

#初始化theta
theta = np.matrix(np.array([0,0]))  #先是一个一维的数据,然后在转换为一个二维的矩阵
  • 1
  • 2
  • 3
  • 4
  • 5
5) Parâmetros de inicialização
theta  
# => matrix([[0, 0]])
  • 1
  • 2
X.shape,theta.shape,y.shape  # 此时theta为一行列,需要进行转置
# => ((97, 2), (1, 2), (97, 1))
  • 1
  • 2
computerCost(X,y,theta)
# => 32.072733877455676
  • 1
  • 2
6) Defina a função de descida gradiente
def gradientDecent(X,y,theta,alpha,iters):   #iters为迭代次数
    temp = np.matrix(np.zeros(theta.shape))   #构造一个与theta大小一样的零矩阵,用于存储更新后的theta
    parmaters = int (theta.ravel().shape[1])    #.ravel()的功能是将多维数组降至一维,用于求需要求的参数个数
    cost = np.zeros(iters)   #构建iters个0的数组,相当于对每次迭代的cost进行记录
    
    for i in range(iters):
        error = (X * theta.T - y)     #记录误差值,结果为一个数组
        for j in range(parmaters):    #对每一个参数进行更新,j用于表示每一个参数
            term = np.multiply(error,X[:,j])   #.multiply 是对矩阵当中的数对应相乘,这里表示与X矩阵的第j列相乘。
            temp[0,j] = theta[0,j] - ((alpha/len(X))*np.sum(term))  #存储更行后的theta的值,.sum()表示将矩阵中的数进行求和
        
        theta = temp      #更新theta
        cost[i] = computerCost(X,y,theta)  #计算此时的代价,并记录在cost中。
    return theta,cost
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
7) Inicialize hiperparâmetros
alpha  = 0.01		# 学习率
iters = 1000		# 迭代次数
  • 1
  • 2
8) Descida gradiente
g,cost = gradientDecent(X,y,theta,alpha,iters)
g
# => matrix([[-3.24140214,  1.1272942 ]])
  • 1
  • 2
  • 3
9) Calcule o custo
computerCost(X,y,g)
# => 4.515955503078914
  • 1
  • 2
10) Desenhe um modelo linear
x = np.linspace(data.Population.min(),data.Population.max(),100) #抽取100个样本  (从data数据集中的最小值到最大值之间抽取100个样本)
f = g[0,0] + (g[0,1] * x)  #f = ax + b

fig,ax = plt.subplots(figsize = (12,8))    #figsize表示图的大小
ax.plot(x,f,'r',label = "Prediction")    #绘制直线,横坐标,纵坐标,直线名称
ax.scatter(data.Population,data.Profit,label = 'Training data')   #绘制点,横坐标,纵坐标,点的名称
ax.legend(loc = 4)  #显示图例位置
ax.set_xlabel('Population')  #设置x轴的名称
ax.set_ylabel('Profit')   #设置y轴的名称
ax.set_title('Predicted Profit vs. Population Size')  #设置标题的名称
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

Insira a descrição da imagem aqui

11) Desenhe a curva de variação de custos
fig,ax = plt.subplots(figsize = (12,8))
ax.plot(np.arange(iters),cost,'r')
ax.set_xlabel('Interations')
ax.set_ylabel('Cost')
ax.set_title("Error vs. Training Epoc")
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Insira a descrição da imagem aqui

2. Regressão linear multivariável

1) Carregar dados
path = "ex1data2.txt"
data2 = pd.read_csv(path,header = None,names=["Size","Bedroom","Price"])
data2.head()
  • 1
  • 2
  • 3

Insira a descrição da imagem aqui

2) Processamento de normalização de dados
data2 = (data2 - data2.mean())/data2.std()
data2.head()
  • 1
  • 2

Insira a descrição da imagem aqui

3) Divida os dados
data2.insert(0,'Ones',1)  #在x的第一列插入1

clos = data2.shape[1]   #存储第二维(列)的数据量
X2 = data2.iloc[:,0:clos-1]  #对X2进行赋值
y2 = data2.iloc[:,clos-1:clos]  #对y2进行赋值

X2 = np.matrix(X2.values)  #将X2转为矩阵
y2 = np.matrix(y2.values)  #将y2转为矩阵
theta2 = np.matrix(np.array([0,0,0]))  #初始化theta2为0矩阵
computerCost(X2, y2, theta2)
# => 0.48936170212765967
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
4) Descida gradiente
g2,cost2 = gradientDecent(X2,y2,theta2,alpha,iters)   #记录放回值g2(theta2)和cost2
g2
# => matrix([[-1.10868761e-16,  8.78503652e-01, -4.69166570e-02]])
  • 1
  • 2
  • 3
5) Calcule o custo
computerCost(X2,y2,g2)
# => 0.13070336960771892
  • 1
  • 2
6) Desenhe a curva de variação de custos
fig,ax = plt.subplots(figsize = (12,8))
ax.plot(np.arange(iters),cost2,'x')
ax.set_xlabel('Iterations')
ax.set_ylabel('Cost')
ax.set_title('Error vs. Training Epoch')
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Adicione a descrição da imagem

3. Equação normal

#正规方程
def normalEqn(X,y):
    theta = np.linalg.inv(X.T@X)@X.T@y   #.linalg中包含线性代数中的函数,求矩阵的逆(inv)、特征值等。@表示矩阵相乘
    return theta
  • 1
  • 2
  • 3
  • 4
final_theta2 = normalEqn(X,y)
final_theta2
# => matrix([[-3.89578088], [ 1.19303364]])
  • 1
  • 2
  • 3

3. Resumo

Etapas gerais para treinar um modelo

  1. Pré-processamento de dados.
  2. Escolha um modelo com base no seu problema específico.
  3. Defina a função de custo.
  4. Use o algoritmo de descida gradiente para encontrar os parâmetros ideais.
  5. Avalie o modelo e ajuste os hiperparâmetros.
  6. Use modelos para fazer previsões.

4. Apêndice

1. ex1data1.txt

6.1101,17.592
5.5277,9.1302
8.5186,13.662
7.0032,11.854
5.8598,6.8233
8.3829,11.886
7.4764,4.3483
8.5781,12
6.4862,6.5987
5.0546,3.8166
5.7107,3.2522
14.164,15.505
5.734,3.1551
8.4084,7.2258
5.6407,0.71618
5.3794,3.5129
6.3654,5.3048
5.1301,0.56077
6.4296,3.6518
7.0708,5.3893
6.1891,3.1386
20.27,21.767
5.4901,4.263
6.3261,5.1875
5.5649,3.0825
18.945,22.638
12.828,13.501
10.957,7.0467
13.176,14.692
22.203,24.147
5.2524,-1.22
6.5894,5.9966
9.2482,12.134
5.8918,1.8495
8.2111,6.5426
7.9334,4.5623
8.0959,4.1164
5.6063,3.3928
12.836,10.117
6.3534,5.4974
5.4069,0.55657
6.8825,3.9115
11.708,5.3854
5.7737,2.4406
7.8247,6.7318
7.0931,1.0463
5.0702,5.1337
5.8014,1.844
11.7,8.0043
5.5416,1.0179
7.5402,6.7504
5.3077,1.8396
7.4239,4.2885
7.6031,4.9981
6.3328,1.4233
6.3589,-1.4211
6.2742,2.4756
5.6397,4.6042
9.3102,3.9624
9.4536,5.4141
8.8254,5.1694
5.1793,-0.74279
21.279,17.929
14.908,12.054
18.959,17.054
7.2182,4.8852
8.2951,5.7442
10.236,7.7754
5.4994,1.0173
20.341,20.992
10.136,6.6799
7.3345,4.0259
6.0062,1.2784
7.2259,3.3411
5.0269,-2.6807
6.5479,0.29678
7.5386,3.8845
5.0365,5.7014
10.274,6.7526
5.1077,2.0576
5.7292,0.47953
5.1884,0.20421
6.3557,0.67861
9.7687,7.5435
6.5159,5.3436
8.5172,4.2415
9.1802,6.7981
6.002,0.92695
5.5204,0.152
5.0594,2.8214
5.7077,1.8451
7.6366,4.2959
5.8707,7.2029
5.3054,1.9869
8.2934,0.14454
13.394,9.0551
5.4369,0.61705
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97

2. ex1data2.txt

2104,3,399900
1600,3,329900
2400,3,369000
1416,2,232000
3000,4,539900
1985,4,299900
1534,3,314900
1427,3,198999
1380,3,212000
1494,3,242500
1940,4,239999
2000,3,347000
1890,3,329999
4478,5,699900
1268,3,259900
2300,4,449900
1320,2,299900
1236,3,199900
2609,4,499998
3031,4,599000
1767,3,252900
1888,2,255000
1604,3,242900
1962,4,259900
3890,3,573900
1100,3,249900
1458,3,464500
2526,3,469000
2200,3,475000
2637,3,299900
1839,2,349900
1000,1,169900
2040,4,314900
3137,3,579900
1811,4,285900
1437,3,249900
1239,3,229900
2132,4,345000
4215,4,549000
2162,4,287000
1664,2,368500
2238,3,329900
2567,4,314000
1200,3,299000
852,2,179900
1852,4,299900
1203,3,239500
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47