최소 2 곱하기법으로 삼차원 곡선 낚시를 하다

개시하다


처음 뵙겠습니다.
나는 작년 5월부터 프로그래밍을 시작한 문외한이다. 오늘부터 갑자기 생각나는 일, 마음에 드는 일을 끊임없이 투고하고 싶다.
주제 밖의 말은 연구 자체가 로봇이다×기계 학습을 주제로 각 분야에서 전개되다.
그나저나 사진은 최근 제작된 인공지능을 탑재한 에어하키 로봇으로 어린아이보다 더 강하다!
관심 있는 사람여기.

오늘의 주제.


이 페이지를 본 대다수의 사람들은 최소 2승법이 무엇인지 안다.
그러나 나는 인터넷에서 2차원 공간을 사용하는 최소 2승법의 예를 많이 보았다.
3차원 공간에서 사용하는 물건이 매우 적다...
따라서 이번에는 3차원 공간에서 이런 자주 사용하는 최소 2승법을 어떻게 사용하는지 간단하게 소개한다.

컨디션

Python 3.6.5 ProductName:Mac OS X ProductVersion:10.14

최소 제곱법


여러분!!너는 최소 제곱법이 원래 무엇에 쓰였는지 아니?
상세한 상황은 차치하고, 간단히 설명하면 된다.

최소 2승법


측정된 수치를 사용하여 적당한 모델에서 구상한 함수, 수곡선 등 특정 함수와 비슷할 때 사용하는 수치를 사용한다.
이 근사화를 진행할 때, 잔차의 제곱과 최소 계수를 확정한다.
공식 및 설명 상세 정보여기.

2차원 최소 2승법


모두가 2차원 최소 2승법을 한 번 겪었기 때문에 간단한 설명과 그림만 있을 뿐이다.
그림에서 보듯이 어떤 견본점에서 근사곡선을 간단하게 계산할 수 있다
2차원 최소 2승법을 실시하고 싶은 사람여기.

삼차원의 최소 2승법


그럼 오늘의 주제인'3차원의 최소 2승법'에 들어가고 싶습니다.
이번에 나는 아래 그림의 점을 이용하여 3차원 공간에서 근사 곡선을 구하고 싶다.
송이경(신지현):내 맘대로 한 거니까 어울린다고 할 수 없고...

내가 이번에 낚시에 사용한 함수는 다음과 같은 다항식이다.
f(x)=ax^2 + by^2 + cx + d y + e 
이 슈퍼 파라미터 (사람이 조정해야 할 파라미터)
a,b,c,d,e
최소 2승법으로 최적화.
코드는 다음과 같습니다.
lsm_3dim.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
from matplotlib import pyplot as plt
from scipy import optimize
from mpl_toolkits.mplot3d import Axes3D

# サンプル点を作成
x = np.array([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19])
y = np.array([-1,-3,-1,9,21,30,37,39,59,65,95,123,142,173,191,216,256,292,328,358])
z = np.array([-89,-77,-69,-48,-47,-42,-40,-36,-32,-27,-24,-22,-21,-4,-3,5,19,24,27,40])

# フィッティングする関数を作成
def fiting_func(param,x,y,z):
    residual = z - (param[0]*x**2 + param[1]*y**2 + param[2]*x + param[3]*y + param[4])
    return residual

# ハイパーパラメータを初期化
param = [0, 0, 0, 0, 0]

# 最小二乗法を実装
optimised_param =  optimize.leastsq(fiting_func, param, args=(x, y, z))

print(optimised_param)

# フィッティングする関数を求める
a = optimised_param[0][0]
b = optimised_param[0][1]
c = optimised_param[0][2]
d = optimised_param[0][3]
e = optimised_param[0][4]

print("a:",optimised_param[0][0])
print("b:",optimised_param[0][1])
print("c:",optimised_param[0][2])
print("d:",optimised_param[0][3])
print("e:",optimised_param[0][4])

f = a*x**2 + b*y**2 + c*x + d*y + e

# 3Dでプロット
fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(x, y, z)
ax.plot(x, y, f)

# 軸ラベル
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')

# 保存
plt.savefig('figure_3d.png')

# 表示
plt.show()
초파라미터 봐봐.
a: -0.5551880910904999
b: 0.0007371156506096842
c: 10.113522462277956
d: 0.10962459408256231
e: -84.61701880472386
이거 봐봐.

내 생각에는 비교적 비슷하지 않은 것 같다.

총결산


이번에는 3차원 공간에서 최소 2승법을 실시해 근사곡선을 구했다.
좀 매끄럽지는 않지만 잘 한 것 같아.
더 좋은 방법이 있다고 생각합니다. 꼭 메시지를 남겨주세요!!!
끝까지 읽어주셔서 감사합니다^^

좋은 웹페이지 즐겨찾기