내 연락처 정보
우편메소피아@프로톤메일.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
선형 회귀: 제한된 데이터에서 매개변수를 조정하여 직선을 피팅하고, 이 직선(모델)을 사용하여 알려지지 않은 데이터에 대한 실험을 수행합니다.예측하다。
똑바로일반적인 형태:
y = w × x + by = w 곱하기 x + b와이=와×엑스+비
전체 직선의 상태는 다음과 같이 주어진다. w와 bw와 b와그리고비결정하다, W w와직선을 결정하다경사(즉, 기울기 각도), 비비비Y축의 직선을 결정합니다.가로채기(직선의 위아래 변환을 제어합니다.편견 ).그러므로 우리는 계산만 하면 된다. W w와그리고 비비비의 값에 따라 특정 직선을 구하는 방법을 알아보겠습니다. W w와그리고 비비비。
고유 명사
명사 | 정의 |
---|---|
트레이닝 세트 | 모델 학습에 사용되는 데이터세트 |
테스트 세트 | 모델 품질을 테스트하는 데 사용되는 데이터 세트 |
훈련 샘플/훈련 포인트(훈련 샘플) | 훈련 세트의 각 데이터 항목 |
특징 | 모델에 입력되는 데이터는 숫자 값, 카테고리 라벨, 이미지 픽셀 값 등이 될 수 있습니다. |
상표 | 모델은 목표 값을 예측해야 합니다. 분류 문제의 경우 레이블은 일반적으로 클래스 이름이고, 회귀 문제의 경우 레이블은 연속 값입니다. |
먼저 일변량 선형 회귀를 연구해 보겠습니다. 일변량 선형 회귀는 다음과 같이 독립 변수가 하나만 있는 선형 함수를 나타냅니다. y = w ⋅ x + by = wcdot x +b와이=와⋅엑스+비그건일변량 직선, 입력 변수가 하나만 있습니다. 더블 엑스엑스 . 이 직선은 2차원 평면(가로축이 X, 세로축이 Y)으로 표현될 수 있습니다.
분할되지 않은 데이터 세트를 얻을 때 일반적으로 데이터를 훈련 세트와 테스트 세트로 나눕니다. 간단한 분할 방법은 샘플의 처음 80%를 훈련 세트로 취하고 나머지 20%를 테스트 세트.
우리가 알아냈다고 가정해보자 W w와그리고 비비비, 그런 다음 직선을 결정하고 이 직선을 사용하여 예측 값을 쉽게 판단할 수 있습니다.와이'실제 가치를 지닌와이~ 사이오류예측 값을 측정하는 데 사용되는 *"자"*를 정의하고 싶은 금액 y ′ y'와이′진정한 가치를 지닌 예와이 사이에 오류가 발생했습니다.여기서 우리는평균 제곱 오차정의하다비용 함수:
J(w, b) = 1 2 m ∑ i = 1 m ( fw, b(x(i)) − y(i)) 2 J(w, b) = frac{1}{2m}합계_{i = 1}^m(f_{w, b}(x^{(i)}) - y^{(i)})^2제이(와,비)=2중1나=1∑중(에프와,비(엑스(나))−와이(나))2
포뮬러 해체:
fw, b(x(i)) - y(i) f_{w,b}(x^{(i)}) - y^{(i)}에프와,비(엑스(나))−와이(나):안에 fw, b ( x ( i ) ) f_{w, b}(x^{(i)})에프와,비(엑스(나))훈련된 모델을 사용하여 예측된 값을 나타내고, y ( i ) y^{(i)}와이(나)는 각 학습 샘플의 실제 결과를 나타내고, 둘 사이의 차이는 모델이 예측한 값과 실제 값 사이의 오류를 나타냅니다.
왜 오류를 제곱합니까?
모든 샘플 세트에서 각 오류는 양수이거나 음수일 수 있으며 합산 과정에서 특정 상쇄 확률이 있습니다. 이는 각 항목의 오류가 매우 큰 경우(예: -100, +90, -25, +30)을 합산한 결과 작은 값(-5)이 나오다가 결국 잘못된 판단을 얻게 된다.
1 2 m 프랙{1}{2m}2중1: 모든 데이터 오류의 합에 대한 평균을 나타내며(이 평균은 어떤 의미에서는 전체 모델의 오류를 나타낼 수 있음) 평균 제곱 오류를 구합니다.
왜 2로 나누는가??
왜냐하면 나중에 경사하강법을 수행할 때 파생은 인덱스 2를 계수로 나누게 되기 때문입니다. 데이터 양이 많은 경우 상수가 모델에 미치는 영향이 거의 없기 때문입니다. 파생 공식을 도입하려면 미리 2로 나누어야 합니다. , 후속 오프셋의 경우.
비용 함수를 알면 비용을 줄이는 방법만 찾으면 됩니다. 비용이 낮을수록 예측 값이 실제 값에 더 가까워집니다.
오류 비용 함수를 관찰하면 오류 비용 함수가 2차 함수, 즉볼록함수, 볼록 함수의 속성은 다음과 같습니다.극점은 최대점이다 , 비용 함수는 위쪽으로 열리는 2차 함수이므로(공식을 전개하면 제곱항의 계수가 0보다 크다는 것을 직관적으로 느낄 수 있음), 따라서 볼록 함수는 최소값만 갖고, 우리는 최소값은 최소값을 찾아야 합니다.오류 비용 함수의 경우 J(w, b)는 다음과 같다.제이(와,비) , 공식 확장은 다음과 같이 작성할 수 있습니다.
J(w, b) = 1 2 m ∑ i = 1 m ( ( wx(i) + b) − y(i) ) 2 J(w, b) = frac{1}{2m}합계_{i = 1}^m((wx^{(i)}+b) - y^{(i)})^2제이(와,비)=2중1나=1∑중((와엑스(나)+비)−와이(나))2
제이제이제이크기는 매개변수에 따라 다릅니다. W w와그리고 비비비, 경사 하강법으로 해결할 수 있는 비용 함수의 모양은 대략 다음과 같습니다.
경사하강법의 아이디어는 주로 실행됩니다.편도함수 찾기생물학과 관련된 방법제어변수방법은 다음과 같이 매우 유사합니다. 비비비변경 없이 업데이트 W w와(보이는 비비비상수입니다), 공식: w′ = w − α ∂ J ( w ) ∂ ww' = w - 알파 프랙{부분 J(w)}{부분 w}와′=와−α∂와∂제이(와) 순차적으로 업데이트되었음을 나타냅니다. W w와,안에 알파 알파α 나타냅니다학습률 하강 속도로도 이해될 수 있는 스텝 크기를 나타내는 데 사용됩니다. ∂ J ( w ) ∂ w 부분 J(w) { 부분 w }∂와∂제이(와) 옳다고 표현하다 W w와편도함수를 구하면, 우리는 다음을 얻습니다: W − JW - J여−제이(가중치여그리고 가격제이함수) 가장 빠르게 감소하는 함수 값을 나타내는 데 사용되는 볼록 함수의 접선방향, 둘의 곱은함수 값이 가장 빠르게 감소하는 방향으로 한 단계 이동합니다. .이 거리는 데이터 세트에 따라 조정되어야 합니다. 알파 알파α너무 크면(단계 크기가 너무 크면) W w와가장 낮은 지점을 넘어 반대편의 가장 높은 지점으로 직접 이동하므로 절대 최소값에 가까워지지 않습니다. 알파 알파α너무 작으면(단계 크기가 너무 작음) W w와최소값에 가까워질수록 속도가 점점 느려지고 계산 비용이 소모됩니다.
학습률( 알파 알파α) 조정 방법:
먼저 작은 것을 설정하세요. 알파 알파α 예: 0.001.
그러면 매번 10배씩 증가하여 최대 1배까지 증가합니다.
0.01과 같은 특정 값을 결정한 후.
그런 다음 다음과 같이 처리를 3회 수행합니다. 0.01 × 3 = 0.03 , 0.03 × 3 = 0.09 0.01 곱하기 3 = 0.03 , 0.03 곱하기 3 = 0.090.01×3=0.03,0.03×3=0.09 (이의 목적은 수렴을 더 빠르게 만드는 것입니다.)
편도함수를 푸는 과정(경사하강법의 방향 찾기):
빌다 ∂ J ( w ) ∂ w 부분 J(w) { 부분 w }∂와∂제이(와) :
∂ J ( w ) ∂ w 부분 J(w) { 부분 w }∂와∂제이(와) = ∂ ∂ w 1 2 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) 2 부분적 분수 w 합한계_{i = 1}^{m}(f_{w,b}(x^{(i)}) - y^{(i)})^2∂와∂2중1나=1∑중(에프와,비(엑스(나))−와이(나))2
= ∂ ∂ w 1 2 m ∑ i = 1 mwx ( i ) − y ( i ) ) 2 부분적 분수 w {1}{2m} 합한계_{i = 1}^{m}wx^{(i)} - y^{(i)})^2∂와∂2중1나=1∑중와엑스(나)−와이(나))2
= 1 2 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) ⋅ 2 x ( i ) frac{1}{2m}합계_{i = 1}^{m}(f_{w,b}(x^{(i)}) - y^{(i)})cdot2x^{(i)}2중1나=1∑중(에프와,비(엑스(나))−와이(나))⋅2엑스(나)
= 1 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) x ( i ) frac{1}{m}합계_{i = 1}^{m}(f_{w,b}(x^{(i)}) - y^{(i)})x^{(i)}중1나=1∑중(에프와,비(엑스(나))−와이(나))엑스(나)
빌다 ∂ J ( w ) ∂ b 부분 J(w) {부분 b}∂비∂제이(와) :
∂ J ( w ) ∂ b 부분 J(w) {부분 b}∂비∂제이(와) = ∂ ∂ b 1 2 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) 2 부분적 분수 {부분적 b} 합한계_{i = 1}^{m}(f_{w,b}(x^{(i)}) - y^{(i)})^2∂비∂2중1나=1∑중(에프와,비(엑스(나))−와이(나))2
= ∂ ∂ b 1 2 m ∑ i = 1 mwx ( i ) − y ( i ) ) 2 부분적 분수 b 1 합한계_{i = 1}^{m}wx^{(i)} - y^{(i)})^2∂비∂2중1나=1∑중와엑스(나)−와이(나))2
= 1 2 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) ⋅ 2 frac{1}{2m}합계_{i = 1}^{m}(f_{w,b}(x^{(i)}) - y^{(i)})cdot22중1나=1∑중(에프와,비(엑스(나))−와이(나))⋅2
= 1 m ∑ i = 1 m ( fw , b ( x ( i ) ) − y ( i ) ) frac{1}{m}합계_{i = 1}^{m}(f_{w,b}(x^{(i)}) - y^{(i)})중1나=1∑중(에프와,비(엑스(나))−와이(나))
루프 반복을 통해 특정 항목 찾기 W w와가치를 부여하다 비비비값:
while ( ) : while():와안녕엘이자형():
w ∗ = w − α ∂ ∂ w J ( w , b ) w^* = w - 알파 프랙{부분}{부분 w}J(w, b)와∗=와−α∂와∂제이(와,비)
b ∗ = b − α ∂ ∂ b J ( w , b ) b^* = b - 알파 프랙{부분}{부분 b}J(w, b)비∗=비−α∂비∂제이(와,비)
w = w ∗ w = w^*와=와∗
b = b∗ b = b^*비=비∗
처음에는 w와 b의 값을 임의로 설정한 후 반복하여 오류가 특정 임계값보다 작을 때 종료되도록 경사하강법을 설정하거나, 제한된 단계를 통해 사용자 정의하여 더 이상적인 결과를 얻을 수 있습니다. W w와가치 합계 비비비값.
다변수 선형 회귀는 차원을 3차원 및 심지어 다차원 상태로 확장합니다. y = w 1 x 1 + w 2 x 2 + by = w_1 x_1 + w_2 x_2 + b와이=와1엑스1+와2엑스2+비 로 이해될 수 있다엑스축과와이축은 x 1 및 x 2 x_1 및 x_2엑스1그리고엑스2 지축은 예와이, 이는 3차원 상태입니다. 각 훈련 샘플은 3차원 공간의 한 점입니다. 3차원 공간의 샘플 점에 맞는 적절한 직선을 찾아야 합니다.
방법: 각 변수에 대해 개별적으로( w 1 , w 2 , … , wn , b w_1, w_2, 점, w_n, b와1,와2,…,와N,비) 경사하강법 처리의 경우
주요 요점: 다변수 선형 회귀의 경우 다양한 특성 값의 값 범위가 다릅니다. 예: 연령 특성의 값 범위: 0 0 0 ~ 100 100 100, 해당 영역: 0m2 0m^20중2 ~ 10000m2 10000m^210000중2 , 또한 있을 수 있습니다이상한 샘플, 단일 샘플 데이터가 존재하면 훈련 시간이 길어지고 수렴에 실패할 수도 있으므로, 단일 샘플 데이터가 있는 경우 훈련 전에 데이터 전처리가 필요합니다.정규화됨 ; 반대로, 단일 샘플 데이터가 없으면 정규화를 수행할 필요가 없습니다.이 문제를 해결하려면 다음을 수행해야 합니다.기능이 확장됨(정규화됨)。
데이터 정규화 처리
성취하다데이터 정규화세 가지 방법이 있습니다:
최대값으로 나누는 것과 같습니다.
각 특성의 모든 값을 해당 특성의 최대값으로 나눕니다.
평균 정규화:
해당 특성의 값에서 각 특성의 값을 뺍니다.평균, 그런 다음 특성의 최대값과 최소값의 차이로 나눕니다.
Z-점수 정규화:
각 기능을 계산합니다.표준 편차그리고평균
해당 특성의 모든 값에서 각 특성의 값을 뺍니다.평균값, 그런 다음 기능의평균
정규화가 수행되지 않으면 특징 벡터의 다양한 특징 값의 큰 차이로 인해 비용 함수가 변경됩니다. "평평한" .이렇게 경사하강법을 수행하게 되면 경사의 방향이 최소값의 방향에서 벗어나 많이 가게 됩니다.우회, 이는 훈련 시간을 너무 길게 만듭니다.
정규화 후 목적 함수는 비교를 표시합니다. "둥근", 훈련 속도가 크게 빨라지고 많은 우회가 방지됩니다.
데이터 정규화의 이점:
J(w, b) = 1 2 m ∑ i = 1 m ( fw, b(x(i)) − y(i)) 2 J(w, b) = frac{1}{2m}합계_{i = 1}^m(f_{w, b}(x^{(i)}) - y^{(i)})^2제이(와,비)=2중1나=1∑중(에프와,비(엑스(나))−와이(나))2
다중 선형 회귀를 위한 경사하강법:
w 1 = W 1 − α 1 m ∑ i = 1 m ( fw ⃗ , bx ⃗ ( i ) − y ( i ) ) x 1 ( i ) w_1 = W_1 - 알파 분수 합 한계_{1}{m} i = 1}^{m}(f_{vec{w},b}vec{x}^{(i)} - y^{(i)})x_1^{(i)}와1=여1−α중1나=1∑중(에프와,비엑스(나)−와이(나))엑스1(나)
⋮ vdots⋮
wn = W n − α 1 m ∑ i = 1 m ( fw ⃗ , bx ⃗ ( i ) − y ( i ) ) xn ( i ) w_n = W_n - 알파 분수 합 한계_{1}{m} i = 1}^{m}(f_{vec{w},b}vec{x}^{(i)} - y^{(i)})x_n^{(i)}와N=여N−α중1나=1∑중(에프와,비엑스(나)−와이(나))엑스N(나)
b = b − α 1 m ∑ i = 1 m ( fw ⃗ , bx ⃗ ( i ) − y ( i ) ) b = b - 알파 분수 합 한계_{1}{m} i = 1}^{m}(f_{vec{w},b}vec{x}^{(i)} - y^{(i)})비=비−α중1나=1∑중(에프와,비엑스(나)−와이(나))
설명하다: w 1 ⋯ wn w_1c점 w_n와1⋯와N 는 각 변수의 계수를 나타내고, b는 선형함수의 상수항을 나타냅니다.
생략...
수학적 파생:
J = 1 2 m ∑ i = 1 m ( θ ⃗ ix ⃗ i − yi ) 2 J = 분수 합 한계_{1}{2m}_{i = 1}^{m}(vec{theta}_i vec{x}_i - y_i)^2제이=2중1나=1∑중(θ나엑스나−와이나)2
= 1 2 m ∣ ∣ θ ⃗ x ⃗ − y ∣ ∣ 2 frac{1}{2m}||vec{세타} vec{x} - y||^22중1∣∣θ엑스−와이∣∣2
= 1 2 m ( θ ⃗ x ⃗ − y ) T ( θ ⃗ x ⃗ − y ) frac{1}{2m}(vec{theta} vec{x} - y)^T(vec{theta} vec{x} - y)2중1(θ엑스−와이)티(θ엑스−와이)
= 1 2 m ( θ ⃗ T x ⃗ T − y T ) ( θ ⃗ x ⃗ − y ) frac{1}{2m}(vec{theta}^T vec{x}^T - y^T)(vec{theta} vec{x} - y)2중1(θ티엑스티−와이티)(θ엑스−와이)
= 1 2 m ( θ ⃗ T x ⃗ T x ⃗ θ ⃗ − y T x ⃗ θ ⃗ − θ ⃗ T x ⃗ T y + y T y ) frac{1}{2m}(vec{세타}^Tvec{x}^Tvec{x}vec{세타} - y^Tvec{x}vec{세타} -vec{세타}^Tvec{x}^Ty +y^Ty )2중1(θ티엑스티엑스θ−와이티엑스θ−θ티엑스티와이+와이티와이)
오른쪽 θ세타θ편도함수를 구합니다: Δ = ∂ J ∂ θ = 1 2 m ( ∂ θ ⃗ T x ⃗ T x ⃗ θ ⃗ ∂ θ − ∂ y T x ⃗ θ ⃗ ∂ θ − ∂ θ ⃗ T x ⃗ T y ∂ θ + y T y ∂ θ ) 델타 = frac{부분 J}{부분 세타}= frac{1}{2m}(frac{부분 vec{세타}^T vec{x}^Tvec{x}vec{세타}}{부분 세타} - frac{부분 y^Tvec{x}vec{세타}}{부분 세타} - frac{부분 vec{세타}^Tvec{x}^Ty}{부분 세타} + frac{y^Ty}{부분 세타})Δ=∂θ∂제이=2중1(∂θ∂θ티엑스티엑스θ−∂θ∂와이티엑스θ−∂θ∂θ티엑스티와이+∂θ와이티와이)
행렬 도출 규칙:
∂ θ TA θ ∂ θ = ( A + AT ) θ 프랙{부분 세타^{T}아세타}{부분 세타} = (A + A^T)세타∂θ∂θ티ㅏθ=(ㅏ+ㅏ티)θ
∂ XTA ∂ X = A 부분 X^{T}A 부분 X = A∂엑스∂엑스티ㅏ=ㅏ
∂ AX ∂ X = AT 부분 AX { 부분 X } = A^T∂엑스∂ㅏ엑스=ㅏ티
∂ A ∂ X = 0 부분 A { 부분 X } = 0∂엑스∂ㅏ=0
사용 가능 Δ = 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 ) 델타 = frac{1}{2m}(frac{부분 vec{세타}^T vec{x}^Tvec{x}vec{세타}}{부분 세타} - frac{부분 y^Tvec{x}vec{세타}}{부분 세타} - frac{부분 vec{세타}^Tvec{x}^Ty}{부분 세타} + frac{y^Ty}{부분 세타}) = frac{1}{2m}cdot(2x^Tx세타 - 2x^Ty) = frac{1}{m}cdot(x^Tx세타 - x^Ty)Δ=2중1(∂θ∂θ티엑스티엑스θ−∂θ∂와이티엑스θ−∂θ∂θ티엑스티와이+∂θ와이티와이)=2중1⋅(2엑스티엑스θ−2엑스티와이)=중1⋅(엑스티엑스θ−엑스티와이)
언제 Δ = 0 델타 = 0Δ=0 시간: x T x θ = x T yx^Tx 세타 = x^Ty엑스티엑스θ=엑스티와이 , θ = ( x T x ) − 1 x T y 세타 = (x^Tx)^{-1}x^Tyθ=(엑스티엑스)−1엑스티와이 계산될 수 있다 θ세타θ 값.
경사 하강법과 정규 방정식의 비교:
경사하강법: 학습률 α를 선택하는 것이 필요하며 이는 여러 번의 반복이 필요하며 특성 개수가 많을 때 더 잘 적용할 수 있으며 다양한 유형의 모델에 적합합니다.
정규방정식: 학습률 α를 선택할 필요가 없습니다. 한 번만 계산하면 계산이 필요합니다. ( x T x ) − 1 ( x ^ T x ) ^ {- 1}(엑스티엑스)−1 , 기능의 수가 엔N더 크면 역행렬의 계산 시간 복잡도가 크기 때문에 연산 비용이 더 커집니다. O ( n 3 ) O ( n 3 )은 1이다.영형(N3) , 보통 언제 엔N10,000 미만인 경우에도 허용됩니다.선형 모델에만 사용 가능, 로지스틱 회귀 모델과 같은 다른 모델에는 적합하지 않습니다.
어떤 경우에는 직선이 모든 데이터를 맞추기 어렵기 때문에 2차 모형, 3차 모형 등 데이터를 맞추기 위해서는 곡선이 필요합니다.
일반적으로 데이터의 회귀 함수를 알 수 없다고 하더라도 간단한 함수 변환으로는 선형 모델로 변환하기가 어렵기 때문에 일반적인 접근 방식은 다음과 같습니다.다항회귀(다항식 회귀), 즉 다항식 함수를 사용하여 데이터를 피팅합니다.
다항식의 차수를 선택하는 방법:
다항식 함수에는 여러 유형이 있습니다. 일반적으로 먼저 데이터의 모양을 관찰한 다음 문제를 해결하기 위해 사용할 다항식 함수 형식을 결정해야 합니다. 예를 들어, 데이터의 산점도에서 "굽히다 ", 2차 다항식 사용을 고려할 수 있습니다(즉, 특성을 제곱하는 것). 두 가지 "굽히다 ", 3차 다항식 사용을 고려할 수 있습니다(특성의 3차 거듭제곱을 사용). 세 가지 "굽히다 ” 그런 다음 4차 다항식(특성의 4승을 취함) 사용 등을 고려합니다.
실제 회귀함수는 반드시 어느 정도의 다항식은 아니지만, 적합도가 좋다면 적절한 다항식을 사용하여 실제 회귀함수를 근사화하는 것이 가능합니다.
기사 마지막에 있는 부록에는 실험에 사용된 모든 원본 데이터가 포함되어 있습니다.ex1data1.txt
인구와 이익의 관계이다. ex1data2.txt
집의 크기와 침실의 개수가 집값에 미치는 영향입니다.
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() # 预览数据
data.describe() # 更加详细的数据描述
# 可视化训练数据
data.plot(kind = 'scatter',x = 'Population',y = 'Profit',figsize = (12,8))
plt.show()
def computerCost(X,y,theta): # 定义代价函数
inner = np.power(((X*theta.T)-y),2) # theta.T表示theta的转置
return np.sum(inner)/(2*len(X))
data.insert(0,"One",1) # 表示在第0列前面插入一列数,其表头为One,其值为1
데이터 세트의 첫 번째 열에 삽입 1 1 1기능은행렬 계산을 용이하게 합니다., 행렬을 곱하면 가중치가 포함됩니다. W w와그리고 편견 비비비,왜냐하면 비비비변수에 곱해지지 않으므로 1 1 1, 와 함께 사용됨 비비비곱하다.
cols = data.shape[1]
X = data.iloc[:,0:cols - 1] #“,”前只有“:”,表示所有的行,“,”后表示抽取数据中第[0列~第cols-1列)(左闭右开),去掉最后一列,最后一列为预测值
y = data.iloc[:,cols - 1:cols] #只取最后一列的值,表示预测值
X.head()
y.head()
X = np.matrix(X.values)
y = np.matrix(y.values) #只将表格中的值装换为矩阵而不是包括序号与标题
#初始化theta
theta = np.matrix(np.array([0,0])) #先是一个一维的数据,然后在转换为一个二维的矩阵
theta
# => matrix([[0, 0]])
X.shape,theta.shape,y.shape # 此时theta为一行列,需要进行转置
# => ((97, 2), (1, 2), (97, 1))
computerCost(X,y,theta)
# => 32.072733877455676
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
alpha = 0.01 # 学习率
iters = 1000 # 迭代次数
g,cost = gradientDecent(X,y,theta,alpha,iters)
g
# => matrix([[-3.24140214, 1.1272942 ]])
computerCost(X,y,g)
# => 4.515955503078914
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()
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()
path = "ex1data2.txt"
data2 = pd.read_csv(path,header = None,names=["Size","Bedroom","Price"])
data2.head()
data2 = (data2 - data2.mean())/data2.std()
data2.head()
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
g2,cost2 = gradientDecent(X2,y2,theta2,alpha,iters) #记录放回值g2(theta2)和cost2
g2
# => matrix([[-1.10868761e-16, 8.78503652e-01, -4.69166570e-02]])
computerCost(X2,y2,g2)
# => 0.13070336960771892
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()
#正规方程
def normalEqn(X,y):
theta = np.linalg.inv(X.T@X)@X.T@y #.linalg中包含线性代数中的函数,求矩阵的逆(inv)、特征值等。@表示矩阵相乘
return theta
final_theta2 = normalEqn(X,y)
final_theta2
# => matrix([[-3.89578088], [ 1.19303364]])
모델 학습을 위한 일반적인 단계:
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
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