2017-12-28 2 views
2

좋아, 그래서 며칠 전에 파이썬으로 시작했다. 내가 화학 학부생이기 때문에 주로 DataScience에 사용합니다. 글쎄요, 이제는 함수를 외삽 법에 적용해야하므로 손에 작은 문제가 생겼습니다. 간단한 다이어그램과 그래프를 만드는 방법을 알고 있으므로 가능한 한 쉽게 설명해주십시오. 나는 Y (또는 Y2) 값 내 X = 0 얻기 위해 추정 할 수있는 방법을 일해야이 값을 너무x, y 값에 따라 함수를 외삽하는 법은 무엇입니까?

from matplotlib import pyplot as plt 
from matplotlib import style 
style.use('classic') 
x = [0.632455532, 0.178885438, 0.050596443, 0.014310835, 0.004047715] 
y = [114.75, 127.5, 139.0625, 147.9492188, 153.8085938] 
x2 = [0.707, 0.2, 0.057, 0.016, 0.00453] 
y2 = [2.086, 7.525, 26.59375,87.03125, 375.9765625] 

: 나는으로 시작. 이 작업을 수학적으로 수행하는 방법을 알고 있지만 파이썬이이 작업을 수행 할 수 있는지, 파이썬에서 어떻게 실행하는지 알고 싶습니다. 간단한 방법이 있습니까? 주어진 가치를 가진 예를 나에게 줄 수 있습니까? , 당신

+0

외삽 법을 혼합하고 보간하고 있습니까? –

+0

아니요, 구체적으로 내 가치 범위를 벗어나는 값이 필요합니다. – TheChemist

+2

질문이 명확하지 않습니다. 너는 무엇을 요구하고 있니? 샘플 입/출력을 줄 수 있습니까? – pault

답변

4

이 당신의 데이터를 빠른 살펴보면 감사

x2 = [0.707, 0.2, 0.057, 0.016, 0.00453] 
y2 = [2.086, 7.525, 26.59375,87.03125, 375.9765625] 
plt.plot(x2, y2) 

enter image description here

이 확실히 선형되지

enter image description here

from matplotlib import pyplot as plt 
from matplotlib import style 
style.use('classic') 

x1 = [0.632455532, 0.178885438, 0.050596443, 0.014310835, 0.004047715] 
y1 = [114.75, 127.5, 139.0625, 147.9492188, 153.8085938] 
plt.plot(x1, y1) 

. 다음에 어떤 기능이 있는지 알면 scipy's curve fitting을 사용하여 가장 잘 맞는 기능을 사용할 수 있습니다.

편집 :

우리는 로그인 또는 로그, 당신은 곁눈질 경우

import numpy as np 

plt.plot(np.log(x1), np.log(y1)) 
plt.plot(np.log(x2), np.log(y2)) 

enter image description here

enter image description here

들이 (꽤 선을 보이는 플롯을 변환하면 바이 티). 가장 맞는 라인, 두 번째는 무척 좋아 보인다

enter image description here

# f2: 
# log(y) = -1.01664659 * log(x) + 0.36759068 
# so 
# y = (e ** 0.36759068) * x ** (-1.01664659) 
def f2(x): 
    return np.e ** 0.36759068 * x ** (-1.01664659) 

plt.plot(x2, y2, xs, f2(xs)) 

enter image description here

np.polyfit(np.log(x1), np.log(y1), 1) 
# array([-0.05817402, 4.73809081]) 

np.polyfit(np.log(x2), np.log(y2), 1) 
# array([-1.01664659, 0.36759068]) 

우리가 기능을 변환 할 수 있습니다,

# f1: 
# log(y) = -0.05817402 * log(x) + 4.73809081 
# so 
# y = (e ** 4.73809081) * x ** (-0.05817402) 
def f1(x): 
    return np.e ** 4.73809081 * x ** (-0.05817402) 

xs = np.linspace(0.01, 0.8, 100) 
plt.plot(x1, y1, xs, f1(xs)) 
찾기; 첫 번째는 조금 더 정련해야한다. (즉,보다 대표적인 함수를 찾고 곡선을 맞추라.) 하지만 꽤 좋은 그림이 있어야합니다 ;-)

+0

오케이 그래, 그건 네 말이 맞지 않아. 첫 번째 값 집합 (x, y)에 대한 선형 회귀를 만드는 방법이 있습니까? – TheChemist

+2

귀하의 전화 번호는 어디에서 왔습니까? 그들이해야할 방정식의 종류를 아십니까? Scipy의 3 차 스플라인 피팅 https://docs.scipy.org/doc/scipy/reference/tutorial/interpolate.html은 보간법에 대해서는 문제가 없지만 외삽 법에 대해서는 정확하지 않습니다 (예 : 보통 끔찍합니다). –

+0

위의 @ HughBothwell의 의견에 동의합니다. 번호의 출처와 예상되는 관계 유형을 이해하는 것이 가장 좋습니다. 즉, 로그 로그는 확실히 이러한 플롯을 기반으로 여기에가는 방법과 같습니다. – pault

2

다음은 선형 모델을 만드는 데 도움이되는 예제 코드입니다. 다음을 생산

import numpy as np 
from sklearn.linear_model import LinearRegression 
from matplotlib import pyplot as plt 

# sample data 
x = [0.632455532, 0.178885438, 0.050596443, 0.014310835, 0.004047715] 
y = [114.75, 127.5, 139.0625, 147.9492188, 153.8085938] 

# linear model 
lm = LinearRegression() 
lm.fit(np.array(x).reshape(-1, 1), y) 

test_x = np.linspace(0.01, 0.7, 100) 
test_y = [lm.predict(xx) for xx in test_x] 

## try linear model with log(x) 
lm2 = LinearRegression() 
lm2.fit(np.log(np.array(x)).reshape(-1, 1), y) 

test_y2 = [lm2.predict(np.log(xx)) for xx in test_x] 

# plot 
plt.figure() 
plt.plot(x, y, label='Given Data') 
plt.plot(test_x, test_y, label='Linear Model') 
plt.plot(test_x, test_y2, label='Log-Linear Model') 
plt.legend() 

는 :

Model Comparison

@Hugh 보스 웰이 가리 켰을 때,

, 당신이 준 값은 선형 관계를 가지고 있지 않았다. 그러나 x의 로그를 취하는 것이 더 나은 적합성을 생성하는 것으로 보입니다.

관련 문제