반응형
포인트 리스트를 가지고 그림을 드로잉하고, 이것을 원하는 크기로 Resize 하고, 투명 이미지 datauri 만들기...
pointlist = '[(10,10)(20,20)(40,50)(60,80)][(10,80)(24,70)(40,60)(60,40)]'

# image 필드에 데이터가 없는 목록만 뽑아서 배치 작업을 수행한다.
def to_datauri(sn):
    sn = sn.strip()
    # 정규표현식으로 포맷 문자열에서 점 정보 추출
    point_regex = r"\(([-+]?\d+),([-+]?\d+)\)"
    strokes = sn.replace('[', '')
    strokes = strokes.split(']')
    strokes = [ s for s in strokes if s!='' ]

    # 그래프 그리기
    plt.figure()
    fig, ax = plt.subplots(figsize=(3, 2))
    ax.set_facecolor('none') # 배경 투명
    fig.patch.set_alpha(0) # 배경 투명
    # 축과 눈금 숨기기
    ax.axis('off')

    # 각 획별로 분리하여 그리기
    for stroke in strokes:
        points = re.findall(point_regex, stroke)
        if len(points)==0:
            continue
        x_list = [int(point[0]) for point in points]
        y_list = [int(point[1]) for point in points]
        ax.plot(x_list, y_list, color='black', lw=2)

    plt.gca().invert_yaxis()  # y축 뒤집기

    # 그래프 저장
    buf = io.BytesIO()
    plt.savefig(buf, format='png', bbox_inches='tight')
    buf_resized = buf

    ## resize 작업
    buf.seek(0)
    img = Image.open(buf)
    img_resized = img.resize((150,100), Image.Resampling.LANCZOS)  
    # img_resized = img.resize((150,100), Image.ANTIALIAS)  
    # sampling=Image.ANTIALIAS deprecated 되었다. 버전에 따라 위 둘 중 하나를 사용.
    buf_resized = io.BytesIO()
    img_resized.save(buf_resized, format=img.format)

    # buf대신 buf_resized를 변환
    buf_resized.seek(0)
    data_uri = 'data:image/png;base64,'+base64.b64encode(buf_resized.read()).decode('utf-8')
    plt.close()
    plt.clf()
    plt.close('all')
    img.close()
    img_resized.close()
    buf.close()
    buf_resized.close()

    return data_uri

이 함수를 사용하여 드로잉 데이터를 넣으면, datauri 텍스트가 출력된다.

시작,끝 따옴표를 제거한 텍스트를 복사해서 브라우저 URL창에 넣으면 드로잉된 투명이미지가 나온다.. (드래그해 보면, 선만 움직이는 것을 확인할 수 있다. 배경투명)

y축을 뒤집은 이유는? 모니터 스크린 좌표계에서 보통 좌상단이 (0,0) 이다.  plot에서는 좌하단이 (0,0)이다. 따라서 스크린 좌표계로 보이게 하려고 하였다. 

datauri가 아니라 파일로 저장하려면 plt.close() 전에  plt.savefig('test.png') 로 저장하면 된다.

 

'Python' 카테고리의 다른 글

투명 배경 이미지 만들기  (0) 2023.03.22
set에 set 추가? frozenset  (0) 2021.02.24
Jupyter Notebook 소스 복구  (0) 2020.06.16
Docker python venv 패키지 유지  (0) 2020.06.07
딕셔너리에서 키삭제  (0) 2019.12.07
반응형
module_conflict

Python module conflict error

파이썬으로 외부의 여러 패키지들을 깔고 테스트하다 보면 가끔씩 충돌이 발생하여 이전에는 잘 되던 것들이 꼬이게 된다.
막상 경험해 보면 복구하는 것이 쉽지 않고 점점 더 꼬이는 악순환이 발생하여 나중에는 파이썬을 다시 설치하게 된다.
어떻게 복구하는 방법이 없을까?

먼저 가끔씩 현상황을 기록해 두자.

pip freeze > requirements.txt

  • 위와 같이 freeze 옵션을 사용하면 현재 설치된 모든 모듈의 버전들이 기록된다. 보통은 requirements.txt 로 많이 기록된 것을 볼 수 있다.
  • 나중에 저 목록을 한 번에 설치가 가능하다. install -r 옵션을 사용한다.

마지막에 설치/변경된 모듈들을 삭제.

  • 마지막에 설치/변경된 모듈들을 하나씩 삭제해 올라간다.
  • 그런데 마지막순으로 설치된 모듈들이 무엇인지 기억이 나지 않는다.

현재 python 환경(env)의 설치 경로들을 확인.
conda env list
python --version
코드로 라이브러리 위치 확인

import os, inspect
inspect.getfile(os)
'opt/anacoda3/lib/python3.7/os.py'

import web3
inspect.getfile(web3)
'/home/crazyj/myvenv/lib/python3.7/site-packages/web3/__init__.py'
  • 위와 같이 패키지 설치 경로를 확인한 다음 디렉터리로 가서 날짜를 확인한다.

ls -ltr : 마지막에 나온것들이 최근 설치/업데이트된 패키지들. (last modified time 기준으로 역순소팅)
위 마지막 패키지들을 pip uninstall로 하나씩 지워나가면서 테스트 한다.

모든 패키지 삭제하기

이것도 저것도 안된다면, 백업받은 패키지 목록대로 돌리기 위해 전부 삭제하고 다시 설치하자.

pip freeze | xargs pip uninstall -y
또는
pip freeze > requirements.txt
pip uninstall -r requirements.txt -y

패키지 목록 한번에 설치하기

pip install -r requirements.txt

Author: crazyj7@gmail.com

'Python' 카테고리의 다른 글

Docker python venv 패키지 유지  (0) 2020.06.07
딕셔너리에서 키삭제  (0) 2019.12.07
파이썬 개발환경/가상환경구축  (0) 2019.12.01
진법 표현 및 수 스트링 변환  (0) 2019.11.24
크롤링 BeautifulSoup 요약  (1) 2019.11.06
반응형
int_hex_str_bin

진법 표현 int hex str bin

파이썬에서 진법 표현 방법을 알아보자.

여러가지 진법 수 표현

기본적으로 숫자를 쓰면 10진수이다. 수 앞에 진법표기 접두어를 쓰면 해당 진법의 수로 인식을 한다. (숫자 0 다음에 문자 o/x/b)

  • 8진수 : 0o
  • 16진수 : 0x
  • 2진수 : 0b
i10 = 1234
i8 = 0o1234
i16 = 0x1234
i2 = 0b1010
print(i10, i8, i16, i2)
1234 668 4660 10
  • 그냥 print로 출력하면 10진수로 변환하여 출력해 준다.

여러가지 진법 수를 문자열로 변환

  • str, oct, hex, bin 함수를 사용한다.
i10 = 1234
print( str(i10), oct(i10), hex(i10), bin(i10))
1234 0o2322 0x4d2 0b10011010010

i16 = 0x4d2
print( str(i16), oct(i16), hex(i16), bin(i16))
1234 0o2322 0x4d2 0b10011010010
동일한 출력결과
  • 파라미터는 10진수일 필요없다. 아무거나 결국엔 십진수로 변수에 값이 할당되므로 같은 결과가 나온다.

포맷 스트링을 사용한 문자열 변환

  • format 함수로 사용하여 수를 진법 스트링으로(b, o, x) 변환한다.
  • 소문자면 소문자로 대문자면 대문자로 출력된다.
  • 앞에 #(샵)을 붙이면 prefix 도 출력한다.
print( format(1234, 'x'), format(1234, 'X'), format(1234, '#x'), format(1234, '#X') )
4d2 4D2 0x4d2 0X4D2
  • 출력 포맷 스트링을 사용하면 원하는 형태로 prefix를 줄 수 있다. (단, %방식은 %b를 지원하지 않는다.)
print( '%x %X 0x%x  '%(1234,1234,1234) )
4d2 4D2 0x4d2
print( '%d %o %x' % (1234,1234,1234) )
1234 2322 4d2
print( '{0:d} {0:o} {0:x} {0:b}'.format(1234,1234,1234,1234) )
1234 2322 4d2 10011010010

여러가지 진법 수 문자열을 수로 변환

print( int('0o2322', 8), int('0x4d2', 16), int('0b10011010010', 2) )
1234 1234 1234
  • 간단하게 스트링을 int로 타입 캐스팅하는데 기본이 10진수이고, 다른 진법인 경우는 진법을 명시를 해 주면 된다.

Author: crazyj7@gmail.com

'Python' 카테고리의 다른 글

파이썬 충돌해결 module conflict  (0) 2019.12.01
파이썬 개발환경/가상환경구축  (0) 2019.12.01
크롤링 BeautifulSoup 요약  (1) 2019.11.06
크롤링(Crawl) 2편  (2) 2019.10.27
웹 크롤링 Crawl 1편  (0) 2019.10.24
반응형


+최소제곱법

샘플데이터들을 최대한 근사할 수 있는 하나의 직선이나 평면으로 모델링하여 다른 샘플들도 모델링한 시스템으로 예측할 수 있다.

실제 해(샘플데이터)와 모델이 예측한 결과와의 차이가 최소가 되게하는 방식.

샘플데이터 (x, Y)

y=ax+b 인 모델로 예측. 

에러값을  오차^2의 합으로 한다.  (Y-(ax+b))^2 으로 해야 맞는데, 제곱이므로 상관없다.

J(Cost) =  

위 Cost Function을  a, b로 각각 편미분하여 0이 되도록 한다. 최적화 문제.  (위 cost function이 convex 형태이기 때문에 가능하다. 아니면 local minima 문제가 있음.)



위 식을 정리하면

 : 1번식 

   : 2번식

2식을 n으로 나누면

   : 3번식

3번식에서 b를 구해 번식에 대입한다.

a로 묶어주면

양변을 n으로 나눠주면

a를 뺀 왼쪽부분을 잘 보면 (제곱의 평균 - 평균의 제곱)이다.  어디서 많이 본 형태이다. 이것은 x의 분산이다.

분산은 또 편차 제곱의 평균이다. 즉, 왼쪽 부분을  다르게 표현하자면 아래와 같다... (전개해서 계산하면 똑같다는 것을 알 수 있다.)

양변에 n을 곱하면 

오른쪽 부분을 정리하면 = Sigma (xy) - n * m_x * m_y
= Sigma (xy) + ( -n -n +n ) * m_x * m_y
 Sigma (xy) - m_y*n*m_x - m_x *n * m_y + m_x m_y n
 = Sigma (xy) - m_y Sigma(x) - m_x Sigma(y) + m_x m_y Sigma(1)
= Sigma (  xy  - x m_y - y m_x + m_x m_y )
= Sigma ( (x- m_x ) ( y - m_y ) ) 

따라서 a를 구할 수 있다.

a의 의미를 보자면, 

a= 편차곱의 합 / 편차제곱의 합

같은 값으로 분자 분모를 각각 n으로 나누게 되면 

a = 편차 곱의 평균 / x의 편차제곱의 평균이 되고, 이것은 

   =  x,y 공분산 / x의 분산.

결국 a 는 공분산을 x의 분산으로 나눈 값이된다.


a를 구한다음에는  b를 쉽게 구할 수 있다.  (3번식에 대입)



+예제)  임의의  점 7개를 생성. (black box 모델을 임의로 만들고 노이즈를 추가하였음.)

[Python Code]

import numpy as np
import matplotlib.pyplot as plt

# some data
x=np.random.rand(7)*10
print('x=',x)

# black box + noise
y=x*1.5 + np.random.rand(len(x))*3
print('y=', y)

# model : y = ax + b
mx = np.average(x)
my = np.average(y)

print('mx=', mx, ' my=', my)
a1=np.average((x-mx)*(y-my))
a2=np.average(np.power((x-mx), 2))
a=a1/a2
b=my - a * mx
print('a=',a, 'b=',b)

plt.figure()
plt.scatter(x,y, marker='o', c='blue')

# predict
newx=np.arange(0, 10, 0.2)
yy = a*newx + b
print('predict yy=', yy)
plt.scatter(newx,yy, marker='+', c='red')

plt.show()
[결과]
x= [ 5.91242894  8.31159962  5.84424276  1.6816099   3.96831144  5.44434753
  4.99976856]
y= [ 11.3111561   14.27345181   9.25338631   4.42757815   7.11410915
   8.43423682   7.51826014]
mx= 5.16604410833  my= 8.90459692524
a= 1.49495983563 b= 1.18156847417

임의의 파란점을 기반으로 최소제곱법으로 주어진 모델로 추정선을 만들어 그림.







'Math' 카테고리의 다른 글

integral sec(x)  (0) 2019.03.28
integral csc(x)  (0) 2019.03.27
[선형대수] 프로젝션, 최소제곱법  (0) 2019.03.26
[미분] 미분  (0) 2017.05.08
[적분] 곡선의 길이 계산2  (0) 2017.05.08
반응형


+ Projection / 프로젝션 / 투영

a벡터에 b벡터를 프로젝션시키면, b에서 a로 수선의 발을 내린다.  

project b onto a 라고 표현. (b를 a에 수직으로 내림. 수직으로 내리면 최단거리가 됨.)

수선의 발을 p라 하면. p점은 a 선상에 있고 p벡터를 a벡터의 상수배로 볼 수 있다.

   

b벡터 끝에서 p벡터에 가는 벡터와 a 벡터는 수직이다. 따라서 

수직인 벡터의 내적은 0이다. 열벡터에서 내적은 transpose의 곱으로 표현.

   ,     

여기서 매트릭스 연산식으로 바꾸고, 파라미터를 b로 보고 시스템을 꺼내보면. 프로젝션한 포인트 p는 

    ,    


이렇게 된다. 프로젝션 시스템 P는

이 변환 시스템이 어떤 점을 a 벡터로 프로젝션시키는 시스템이다.


프로젝션의 의미?

project b onto a (b를 a로 프로젝션 시킨다.)

     여기에서 는  a,b의 내적이다.  b를 a에 내린 사영의 크기 * a벡터의 크기이고,      는  a벡터 / a 벡터크기의 제곱.  즉, a 방향의 단위벡터 / a벡터의 크기가 되고,  이 둘을 곱하면  a벡터 크기 부분이 없어지므로  a 방향이고, 크기가 b를 a에 내린 사영의 크기인 벡터가 된다. 즉, 프로젝션이 된다.

b벡터에서 a벡터의 성분을 얼만큼 갖고있는지를 나타냄. 내적은 닮은 정도를 나타내기도 한다. 해당 성분이 얼만큼 있는지 나타내므로 닮은 정도이기도 하다. ( 내적이 a b cos (theta) 라는 의미를 생각해 보면 알 수 있다. 닮은 정도를 cos 유사도로 표현하는 것도 비슷하다. 두 벡터의 사이 각도가 0에 가까울 수록 비슷하고 cos값이 최대가 된다. 반대 방향으로 갈수록 작아진다.) 



+ 벡터의 투영과 최소 제곱

벡터와 평면이 수직인가를 알려면? 평면을  구성하는 기저벡터를 구하여 해당 벡터와 모두 수직인지 확인하면 된다.

임의 평면 x+2y+3z=0 의 기저 벡터를 구하려면?

위 방정식을 만족하는 독립인 벡터 두 개를 구하면 된다.

[1 1 1 ], [3 0 1]

위 두 개 벡터로 위 평면위의 모든 점을 스팬할 수 있다.

A는 위 기저벡터를 컬럼벡터로 하는 매트릭스로 어떤 시스템으로 볼 수 있다.

Ax는 위 평면위의 임의의 점이다. 기저벡터들의 선형결합으로 구성된 평면위의 점을 가리키는 벡터.

만약  평면 밖에 있는 b벡터를 A 평면에 내부의 벡터로 가장 가깝게 표현하려면??? 프로젝션!

즉, ||Ax-b||^2이 최소값이 되도록 한다. 최소제곱법.


Ax-b 벡터는 A 평면과 수직이다. 여기서 Ax는 b를 A 평면위에 프로젝션한 벡터이다. --> 최단 거리 지점.

b를 A에 프로젝션한 결과 : 




+ 실전

그렇다면 여러 점들을 가장 최적의 라인(또는 평면) 하나로 표현하려면?

측정값: (x1,y1), (x2,y2), (x3, y3), ...

피팅라인: y=ax+b   : 구하고자 하는 값 (a,b)

y1=ax1+b

y2=ax2+b

..

위 식을 모두 만족하는 a,b는 보통 존재하지 않는다. 다만 거리가 최소가 되도록 최적화된 라인을 찾을 수는 있다.

A x = b ( 왼쪽의 b는 위의 a,b 게수의 b와는 다른 것. y1,y2,y3를 말함)

x를 구하는 문제의 방정식을 만든다.

||Ax-b||^2 이 최소가 되게 하는 해를 구한다.

최소 거리를 만드는 문제는 프로젝션이다.

스페이스 밖의 점 b, 시스템은 A,   Ax는 b를 A에 프로젝션한 A 내부의 최적화된 점(p, 프로젝션)이 된다.

여기서 x를 구하면 최적화된 방정식의 계수인 a,b가 나온다.


) (x1,x2) -> y    이러한 함수가 y=ax1+bx2+c 이 모델로 만들어진다고 한다. 아래 점들에 최대한 근사한  평면으로 표현하라면 최적의 계수 a,b,c?

(0,0) -> 1

(2,2)->6

(1,4)->2

(4,6)->10



A=np.array([[0,0,1],[2,2,1],[1,4,1],[4,6,1]])

b=np.array([[1],[6],[2],[10]])

np.dot( np.dot( np.linalg.inv( np.dot(np.transpose(A), A)), np.transpose(A) ) , b)

Out[72]: 

array([[ 3. ],

       [-0.5],

       [ 1. ]])



+ python source  

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D


A=np.array([[0,0,1],[2,2,1],[1,4,1],[4,6,1]])
b=np.array([[1],[6],[2],[10]])

x = np.dot( np.dot( np.linalg.inv( np.dot(np.transpose(A), A)), np.transpose(A) ) , b)

print('A=',A)
print('b=',b)
print('x=',x)

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

ax.scatter(A[:,0], A[:,1], b[:,0], marker='o', label='sample')

ax.set_xlabel('x1')
ax.set_ylabel('x2')
ax.set_zlabel('Y')
y = x[0]*A[:,0] + x[1]*A[:,1]+ x[2]
print('y=', y)
ax.scatter(A[:,0], A[:,1], y, marker='+', label='fitting')

# predict plane
x1=np.arange(0, 7, 0.2)
x2=np.arange(0, 7, 0.2)
x1,x2 = np.meshgrid(x1,x2)
Y = x[0]*x1 + x[1]*x2+ x[2]
ax.plot_surface(x1, x2, Y, alpha=0.2)


ax.legend()

plt.show()




파란점이 샘플 포인트이고 샘플 포인트에 최적화된 평면을 찾아 그 평면으로 다시 샘플포인트의 값을 추정하여 +로 표시하였음.   (거의 일치)

이렇게 프로젝션을 이용하여 최적화 할 수 있다. 


'Math' 카테고리의 다른 글

integral csc(x)  (0) 2019.03.27
최소제곱법  (0) 2019.03.26
[미분] 미분  (0) 2017.05.08
[적분] 곡선의 길이 계산2  (0) 2017.05.08
[적분] 곡선의 길이 계산  (0) 2016.09.06
반응형

+SVM (support vector machine)을 사용하여 간단하게 바이너리 분류하기


간단하게 말하면 가장 마진이 크도록 최적의 구분 라인 긋기. 약간의 판단 오류가 있더라면 데이터의 밀집 분포 정도에 따라 최적의 라인은 다를 수 있다. 판단오류가 하나도 없도록(과적합) 구분 라인을 만들면 오히려 임의의 값 예측시 정확도가 더 떨어질 수 있다. 


X 데이터 : 피쳐2개. 

Y데이터 : 라벨 (0, 1) binary 분류값.

SVM으로 최적 구분 라인 계산.

임의의 값에 대해 Y데이터 예측하기.


from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np

# line split SVM

X = np.array([[1,2],
[5,8],
[1.5,1.8],
[8,8],
[1,0.6],
[9,11]])
y = [0,1,0,1,0,1]
clf = SVC(kernel='linear'1.0# C is error penalty. if C is bigger then more strictly but margin will be narrow...
clf.fit(X,y)
print(clf.predict([[0.58,0.76]]))
print(clf.predict([[10.58,10.76]]))

w = clf.coef_[0]
print(w)
a = -w[0] / w[1]

xx = np.linspace(0,12)
yy = a * xx - clf.intercept_[0] / w[1]

h0 = plt.plot(xx, yy, 'k-'label="non weighted div")

plt.scatter(X[:, 0], X[:, 1], = y)
plt.legend()
plt.show()

[해설]
x데이터의 벡터는 2차원이고 구분 레이블은 y로 0, 1로 두 그룹으로 나눈다.
SVC의 리턴값으노 clf로 피팅을 하게 되면
clf.predict()로 입력값 x에 대한 구분 레이블 y를 예측할 수 있다.

x데이터의 벡터요소(피쳐)를 x0, x1라 하면
새로운 좌표계의 1차원 좌표축을 z라하면
z = f (x0, x1) 
z>=0 이면 레이블1, z<0이면 레이블 0가 될 것이다. (z=0이면 1일까? 맞다.)

clf의 coef_로 w0, w1를 얻고, intercept로 b를 얻는다.
w0, w1는 입력값의 가중치. b 는 bias

z = w0*x0+w1*x1 + b 가 된다.
따라서 위 라인 (z=0으로 놓는다.)을 기준으로 분류한다.

위 라인을 x1(Y축)에 대해 정리하면
기울기는 -w0/w1
y절편은 -b/w1가 된다.
이 라인이 구분선이 된다.





반응형



++ Linear Regression with multi-variables
X의 feature들이 여러 개 x1, x2, ...

import tensorflow as tf
# y = x1*2+x2+x3 training
# W => 2,1,1, b=0
x_train = [[1,2,3],[2,3,4],[3,4,5],[4,5,6], [1,3,5]]
y_train = [[7],[11],[15],[19], [10]]

#placeholder
x = tf.placeholder(tf.float32, shape=[None,3])
y = tf.placeholder(tf.float32, shape=[None,1])
# variables
W = tf.Variable(tf.random_normal(shape=[3,1]), name='W')
b = tf.Variable(tf.random_normal(shape=[1]), name='b')

# model
hypothesis = tf.matmul(x, W) + b
cost = tf.reduce_mean( tf.square(hypothesis-y) )
# train
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01)
train = optimizer.minimize(cost)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
# test
# hres= sess.run(hypothesis, feed_dict={x:x_train, y:y_train})
for i in range(3001):
    _, pcost, _W, _b= sess.run([train, cost, W, b], feed_dict={x:x_train, y:y_train})
    if i%500==0:
        print (i, pcost, _W, _b)

# test
print( sess.run(hypothesis, feed_dict={x: [[4, 2, 3]]}))





반응형


보간법. interpolate 


몇 개의 샘플 포인트들로 추정하여 인접한 점들 사이를 다항식 함수로 완만한 곡선으로 이어준 것을 스플라인 곡선이라고 한다.

보간법은 이러한 미싱 포인트(추정)들을 계산/추정하는 방법이다.

간단하게는 linear 방식(1차)이 있고, 2차, 3차, 4차 곡선등으로 확장하면서 보다 다양하게 추정할 수 있다.



위 그림은 파란색 점의 샘플 좌표들만을 가지고, 스플라인 곡선을 만들어 그린 추정 그래프이다.

python에서 scipy 라이브러리의 interpolate를 사용하여 구현하였다.

아래 코드에서 splrep에 별다른 옵션이 없으면 3차 스플라인 곡선으로 추정하게 된다. (k=1(선형보간), k=2, k=3(default), k=4 이런식으로 옵션을 준다. )

[python code]


#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu May 25 2017
@author: crazyj
"""

# interpolation test

import numpy as np
import scipy.interpolate as ip
from scipy.interpolate import splrep, splev
import matplotlib.pyplot as plt

# 0~10까지 15개로 나누어 점을 찍음.
x0 = np.linspace(0, 10, 15)
print('x0=', x0)
# cosine 값을 계산
y0 = np.cos(x0)

# x, y (샘플)값을 주고 추정하는 스플라인 곡선을 만든다.
spl = splrep(x0, y0)
# 0~10까지 50구간에 대한 모든 점들을 위 스플라인 곡선으로 추정한 y값을 구한다.
x1 = np.linspace(0, 10, 50)
y1 = splev(x1, spl)

# 그린다.
plt.figure(figsize=(16, 5))
plt.subplot(121)
plt.plot(x0, y0, 'o')
plt.plot(x1, y1, 'r')
plt.grid()

# 이번에는 sine 곡선으로 추정해 본다.
plt.subplot(122)
y2=np.sin(x0)
spl2=splrep(x0, y2)
y3=splev(x1, spl2)
plt.plot(x0, y2, 'o')
plt.plot(x1, y3, 'b')
plt.grid()
plt.show()



'Python' 카테고리의 다른 글

Python 강좌4 정규식 regular expression  (0) 2018.03.19
Python 강좌3 자료형. 수/문자열  (1) 2018.03.16
Python 강좌2 if/for/while/function  (0) 2018.03.15
Python 강좌1. 산술연산, range  (0) 2018.03.14
Linear regression  (0) 2018.03.13

+ Recent posts