기본 콘텐츠로 건너뛰기

[ML] 결정트리(Decision Tree) 모델

turtle로 정사각형 그리기

정사각형 그리기  

turtle로 그림 그리기준비
사각형의 각 꼭지점의 각이 90도라는 것을 사용하여 다음 순서로 그립니다. 
1) 시작점에서 앞으로 이동
2) 1)의 끝점에서 펜을 오른쪽으로 90도 회전
3) 다시 앞으로 이동
4) 3)의 끝점에서 펜을 오른쪽으로 90도 회전
위의 과정은 모서리 한개를 기준으로 양쪽의 선을 만든것으로 “ㄱ”와 같은 모양입니다. 사각형이 완성이 되기 위해서는 위의 과정을 한번더 반복해야 겠지요.

>>> t=Turtle()
>>> t.fd(100)
>>> t.right(90)
>>> t.fd(100)
>>> t.right(90)
>>> t.fd(100)
>>> t.right(90)
>>> t.fd(100)
>>> t.right(90)
>>> t.hideturtle()

위 코드는 같은 명령이 반복되지요. 즉, 앞으로 이동하고 터틀을 90도 회전하는 명령이 4번 반복합니다. 번거롭지요.
동일한 명령을 여러번 반복하는 것은 컴퓨터가 매우 빠르고 정확하게 처리할 수 있는 일들 중의 하나입니다. 그러나 컴퓨터에 그러한 명령을 전달하기 위해서는 컴퓨터가 인식할 수 있게 전달해야 하지요. 뭐 특별한 방법이 아니라 일정한 형식을 맞추기 만하면 됩니다. 이러한 형식을 반복문 (looping)이라고 해요. 또는 회돌이라는 용어로 언급되기도 하죠.  반복문의 형식은 몇가지가 있는데 우선은 위 코드에 적합한 for 문에 대해 살펴보지요.
위 코드를 for 문으로 작성해 보면 다음과 같습니다.

for i in range(4): #(1)
    t.fd(100) #(2)
    t.right(90) #(3)

코드를 작성할 경우 각 명령에 설명을 적을 경우 '#' 기호를 사용합니다. 일반적으로 이 기호 뒤에 첨부되는 설명을 주석이라고 하는데 실제로 컴퓨터는 이 주석문은 그냥 무시합니다. 단지 그 코드 작성자나 실행자만이 알 수 있는 부분이지요. 그럼 위 코드의 (1)번 부터 알아볼까요?
(1)에 range(4)는 새로 접하는 명령이지요. 이 명령은 반복문에서 매우 자주 사용되는 명령입니다. 사실 for --는 다음과 같은 의미를 나타내지요.
 for  이름 in  범위:
범위에 포함된 어떠한 이름을 차례대로 호출합니다. 예를들어
for i in [0,1,2,3]:
의 경우 i는 0이 되고 다음으로 1 이되며 이런 순으로 3까지 됩니다.
>>> for i in [0,1,2,3]:
...:     print(i) #"i를 프린트하세요"라는 함수입니다.
0
1
2
3
위에 따르면 range(4)는 [0,1,2,3]과 같은 의미이지요. 즉, 0부터 3까지를 간단히 나타내기 위해 사용하는 함수입니다.
range(숫자) : 0부터 "숫자-1"까지의 정수를 나타냅니다.
>>> list(range(4)) #list()는 ()내의 있는 결과를 리스트형 즉'[ ]'의 형식으로 나타내는 명령으로 후에 자료형 부분에서 자세히 소개할 것입니다.
 [0, 1, 2, 3]
파이썬에서 숫자는 0부터 출발하지요.
그러므로 위의 코드는 for 문에 포함된 명령들 (2)과 (3)번을 4번 시행하는 명령입니다.
위 코드와 같이 for 문은 명령 코드를 가지고 있어야 완성됩니다. 즉, 다음과 같은 형식을 가지지요.
for 번호 in 범위:
(4칸 들여쓰기)명령(들)
이와같이 for 문과 명령들은 한 세트로 움직입니다. 이렇게 여러명령들이 한세트로 움직이는 부분을 블럭(block)이라고 합니다.
마지막으로 위 코드의 형태는 for의 끝에는 콜론(:)으로 끝나고 줄을 옮겨 앞에 스페이스 4칸을 옯긴다음 다른 명령을 작성하지요. 이것은 다른 줄에 작성된 명령들은 오직 for 문 내에서만 사용된다는 것을 의미합니다. 이것은 파이썬의 코딩을 작성하는 규칙입니다. 즉,
명령 1 :
....명령1에 속하는 명령들

위 코드들 속에는 많은 함수들이 포함되어 있습니다. 즉, 여러개의 함수들을 모아 또 다른 함수들을 만들 수 있지요. 함수를 만들면 같은 명령을 매번 작성할 필요가 없겠지요. 이것이 함수를 만드는 중요한 목적입니다.
파이썬에서 함수를 만들기 위해 'def'라는 단어를 사용합니다. 즉, def라고 입력하면 'def 다음은 함수이다' 라는 것을  알려주는 것입니다.

derf  함수이름(함수에 전달할 것들):
.... 내용

이 경우 역시 def 다음에 한줄 바꿈을 하고 4칸 들여쓰기로 다른 명령들을 작성하죠. 그러면 이 명령들은 함수에만 포함되는 것입니다.
위 정사각형을 그리는 SquareS라는 이름의 함수를 작성해 보면 다음과 같습니다.
def EquisquareS(t, dis):
    for i in range(4):
        t.fd(dis)
        t.right(90)
위 함수에서 t는 도화지이고 dis 사각형 한변의 길이이지요.
이 함수에 의해 다음 명령을 실행해봅시다.
>>> EquisquareS(t, 100) #(1)
>>> t.up() #(2)
>>> t.goto(110, 0) # (3)
>>> t.down() # (4)
>>> for i in range(100): (5)
...:     EquisquareS(t, i) (6)
위 코드중
(1)은 이미 작성한 SquareS함수를 적용하여 변의 길이 100인 정사각형을 그립니다.
(2), (3), (4) 번은 도화지에 그림을 그리는 경우와 같습니다. 즉, 한지점에서 다른 지점으로 흔적없이 이동하기 위해서는 붓을 도화지에서 올리고 다시 그림을 그리는 지점에 붓을 도화지에 다시 내려놓지요. 이러한 절차입니다. 즉,
t.up(): 캔버스(도화지)에서 펜(터틀)을 올럽니다. 
t.goto(x, y):이동할 지점의 좌표,
그림 2.6과 같이 도화지를 모눈종이와 같이 수평(x)과 수직(y)으로 구분하여 보면 이동할 좌표를 할당할 수 있습니다.
t.down(): 올렸던 터틀을 다시 내려놓습니다. 이 명령 후에는 다시 도화지에 그림이 그려지기 시작합니다.
(5)와 (6)은 정사각형의 변의 길이 0 부터 99까지의 정사각형을 반복적으로 그리는 명령으로 turtle에서 생성하는 캔버스를 그림 2.6과 같이 모눈종이로 표현하면 x,y의 모든 간격이 1입니다. 그러므로 이 코드에 의하면 모든 간격이 선으로 겹쳐지기 때문에 색칠된 정사각형으로 나타납니다.

댓글

이 블로그의 인기 게시물

[Linear Algebra] 유사변환(Similarity transformation)

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. $$\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B $$ 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. \begin{align}\tag{식 2} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align} 식 2의 행렬식은 식 3과 같이 정리됩니다. \begin{align} &\begin{aligned}\textsf{det}(B - \lambda I ) & = \textsf{det}(P^{-1}(AP – \lambda P))\\ &= \textsf{det}(P^{-1}) \textsf{det}((A – \lambda I)) \textsf{det}(P)\\ &= \textsf{det}(P^{-1}) \textsf{det}(P) \textsf{det}((A – \lambda I))\\ &= \textsf{det}(A – \lambda I)\end{aligned}\\ &\begin{aligned}\because \; \textsf{det}(P^{-1}) \textsf{det}(P) &= \textsf{det}(P^{-1}P)\\ &= \textsf{det}(I)\end{aligned}\end{align} 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같

[matplotlib] 히스토그램(Histogram)

히스토그램(Histogram) 히스토그램은 확률분포의 그래픽적인 표현이며 막대그래프의 종류입니다. 이 그래프가 확률분포와 관계가 있으므로 통계적 요소를 나타내기 위해 많이 사용됩니다. plt.hist(X, bins=10)함수를 사용합니다. x=np.random.randn(1000) plt.hist(x, 10) plt.show() 위 그래프의 y축은 각 구간에 해당하는 갯수이다. 빈도수 대신 확률밀도를 나타내기 위해서는 위 함수의 매개변수 normed=True로 조정하여 나타낼 수 있다. 또한 매개변수 bins의 인수를 숫자로 전달할 수 있지만 리스트 객체로 지정할 수 있다. 막대그래프의 경우와 마찬가지로 각 막대의 폭은 매개변수 width에 의해 조정된다. y=np.linspace(min(x)-1, max(x)+1, 10) y array([-4.48810153, -3.54351935, -2.59893717, -1.65435499, -0.70977282, 0.23480936, 1.17939154, 2.12397372, 3.0685559 , 4.01313807]) plt.hist(x, y, normed=True) plt.show()

R 미분과 적분

내용 expression 미분 2차 미분 mosaic를 사용한 미분 적분 미분과 적분 R에서의 미분과 적분 함수는 expression()함수에 의해 생성된 표현식을 대상으로 합니다. expression expression(문자, 또는 식) 이 표현식의 평가는 eval() 함수에 의해 실행됩니다. > ex1<-expression(1+0:9) > ex1 expression(1 + 0:9) > eval(ex1) [1] 1 2 3 4 5 6 7 8 9 10 > ex2<-expression(u, 2, u+0:9) > ex2 expression(u, 2, u + 0:9) > ex2[1] expression(u) > ex2[2] expression(2) > ex2[3] expression(u + 0:9) > u<-0.9 > eval(ex2[3]) [1] 0.9 1.9 2.9 3.9 4.9 5.9 6.9 7.9 8.9 9.9 미분 D(표현식, 미분 변수) 함수로 미분을 실행합니다. 이 함수의 표현식은 expression() 함수로 생성된 객체이며 미분 변수는 다음 식의 분모의 변수를 의미합니다. $$\frac{d}{d \text{변수}}\text{표현식}$$ 이 함수는 어떤 함수의 미분의 결과를 표현식으로 반환합니다. > D(expression(2*x^3), "x") 2 * (3 * x^2) > eq<-expression(log(x)) > eq expression(log(x)) > D(eq, "x") 1/x > eq2<-expression(a/(1+b*exp(-d*x))); eq2 expression(a/(1 + b * exp(-d * x))) > D(eq2, "x") a * (b * (exp(-d * x) * d))/(1 + b