python 랜 덤 경사도 하강 법 실현
4003 단어 python경사도 가 떨어지다.
1.왜 랜 덤 경사도 하강 알고리즘 을 제시 합 니까?
경사도 하강 법권 값 의 업데이트 방식 을 주의 깊 게 보 세 요.
즉,매번 업데이트 가중치전체 데이터 세트(그 요구 와 기호 에 주의)를 옮 겨 다 녀 야 합 니 다.데이터 양 이 적 을 때 우 리 는 이런 알고리즘 을 받 아들 일 수 있 습 니 다.데이터 양 이 너무 많 으 면 이 방법 을 사용 하면 수렴 과정 이 매우 느 리 고 여러 부분 극소 값 이 존재 할 때 전체적인 최 적 화 를 보장 할 수 없습니다.이러한 문 제 를 해결 하기 위해 경사도 하강 법의 진급 형식 인 랜 덤 경사도 하강 법 을 도입 했다.
핵심 사상
가중치 의 업 데 이 트 는 모든 데이터 세트 를 옮 겨 다 니 지 않 고 그 중의 샘플 을 선택 하면 됩 니 다.(프로그래머 에 게 당신 의 첫 번 째 반응 은 반드시:여기 서 무 작위 함수 로 샘플 을 선택해 야 하지 않 습 니까?)일반적으로 그 보폭 의 선택 은 경사도 하강 법의 보폭 보다 조금 작다.경사도 하강 법 은 정확 한 경사도 를 사용 하기 때문에 전체 국면 에서 가장 좋 은 것(문제 가 돌출 문제 일 때)을 비교적 큰 폭 으로 교체 할 수 있 지만 랜 덤 경사도 법 은 안 된다.왜냐하면 이것 은 유사 경사도 를 사용 하기 때문이다.또는 전체 국면 에서 볼 때 가끔 은 경사 가 내 려 가 는 방향 이 아 닐 수도 있 기 때문에 걸음 이 느 릴 수도 있다.마찬가지 로 이렇게 가 져 온 장점 은 경사 가 내 려 가 는 방법 에 비해 국부 적 인 최 적 화 에 쉽게 빠 지지 않 는 다 는 것 이다.
3.가중치 업데이트 방식
(i 는 견본 의 레이 블 아래 표 시 를 나타 내 고 j 는 견본 의 차원 아래 표 시 를 나타 낸다)
4.코드 실현(대체적으로 경사도 하강 법 과 같 고 while 순환 중의 내용 과 다르다)
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
from matplotlib import style
#
def get_data(sample_num=1000):
"""
y = 5*x1 + 7*x2
:return:
"""
x1 = np.linspace(0, 9, sample_num)
x2 = np.linspace(4, 13, sample_num)
x = np.concatenate(([x1], [x2]), axis=0).T
y = np.dot(x, np.array([5, 7]).T)
return x, y
#
def SGD(samples, y, step_size=2, max_iter_count=1000):
"""
:param samples:
:param y: value
:param step_size:
:param max_iter_count:
:param batch_size:
:return:
"""
# theta
m, var = samples.shape
theta = np.zeros(2)
y = y.flatten()
#
loss = 1
iter_count = 0
iter_list=[]
loss_list=[]
theta1=[]
theta2=[]
# 0.01 ,
while loss > 0.01 and iter_count < max_iter_count:
loss = 0
#
theta1.append(theta[0])
theta2.append(theta[1])
#
rand1 = np.random.randint(0,m,1)
h = np.dot(theta,samples[rand1].T)
# ,
for i in range(len(theta)):
theta[i] =theta[i] - step_size*(1/m)*(h - y[rand1])*samples[rand1,i]
# ,
for i in range(m):
h = np.dot(theta.T, samples[i])
#
every_loss = (1/(var*m))*np.power((h - y[i]), 2)
loss = loss + every_loss
print("iter_count: ", iter_count, "the loss:", loss)
iter_list.append(iter_count)
loss_list.append(loss)
iter_count += 1
plt.plot(iter_list,loss_list)
plt.xlabel("iter")
plt.ylabel("loss")
plt.show()
return theta1,theta2,theta,loss_list
def painter3D(theta1,theta2,loss):
style.use('ggplot')
fig = plt.figure()
ax1 = fig.add_subplot(111, projection='3d')
x,y,z = theta1,theta2,loss
ax1.plot_wireframe(x,y,z, rstride=5, cstride=5)
ax1.set_xlabel("theta1")
ax1.set_ylabel("theta2")
ax1.set_zlabel("loss")
plt.show()
if __name__ == '__main__':
samples, y = get_data()
theta1,theta2,theta,loss_list = SGD(samples, y)
print(theta) # [5, 7]
painter3D(theta1,theta2,loss_list)
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.