기본 콘텐츠로 건너뛰기

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

코틀린 람다함수와 고차함수

Lambda 함수 

함수의 이름이 없는 익명함수(anonymous function)이라고 합니다.

{매개변수 → 실행 코드(몸체)}

위 함수의 구조와 같이 람다(익명)함수는 중괄호 내에 실행문을 입력합니다.
다음은 간단한 예로 문자열을 출력하는 함수입니다.
이 함수를 실행하기 위해서는 함수다음에 인수를 전달하기 위한 ()를 같이 나타내야 합니다.
다음은 전달하는 인수가 별도로 존재하지 않는 경우입니다.

{println("Hello")}()
      Hello

람다함수 역시 개체이므로 변수에 저장할 수 있습니다.
이 경우 변수명은 함수이름과 같은 역할을 합니다.
그러므로 객체를 호출할 경우 함수와 같이 적용해야 합니다. 즉, 변수명()

val swim={println("swim \n")}
swim()
      swim

다음은 매개변수가 존재하는 경우입니다.

var dirty = 20
val waterFilter = {dirty: Int -> dirty/2}
waterFilter(dirty)
      10

위 람다는 함수를 간단하게 표현하는 방법으로 나타낼 수 있습니다.

fun waterFilter(dirty:Int) = dirty+10
waterFilter(dirty)
      30

람다 함수는 실제로 고차함수(함수를 인수로 취하는 모든 함수)를 사용할 때 강력합니다.

fun updateDirty(dirty: Int, operation: (Int)->Int):Int{
    return operation(dirty)
}

updateDirty(dirty){dirty -> dirty+50}
      70

고차 함수(Higher-Order Functions)

일반적으로 함수는 매개변수와 반환값이 데이터인데 반해 
고차 함수(고계도 함수)는 전달받는 매개변수나 반환물이 함수인 경우입니다. 
즉, 다음 중 하나를 만족하는 함수를 의미합니다.

1) 함수를 매개변수(파라미터)로 전달 받는 함수
2) 함수를 리턴(반환)하는 함수

다음은 함수에 인수로 문자열을 받아 그 문자열의 길이를 반환하는 함수로서
매개변수를 람다함수를 받는 경우입니다.
이 함수는 람다함수를 매개변수로 받기 때문에
그 함수의 적용은 길이를 반환하는데에 고정되지 않습니다.

fun stringMapper(str:String, result:(String)->Int):Int{
    return result(str)
}

println(stringMapper("Android", {input-> input.length}))
      7

println(stringMapper("Android", {input-> input.length*input.length}))
      49

다음은 정수와 람다함수를 매개변수로 받아 인수인 정수에 다른 함수를 적용하는 것입니다.

fun numFun(x1: Int, argFun: (Int) -> Int){
    val result = argFun(x1)
    println("x1 : $x1, someFun1 : $result")
    }

numFun(7,{x -> x*x*x})
      x1 : 7, someFun1 : 343

numFun(7, {x -> (x*x)/10})
      x1 : 7, someFun1 : 4


함수내에 함수를 매개변수로 받은 것입니다.
즉, 함수내에 내포된 함수를 하나더 생성한 것입니다.
이 경우 내포한 함수 역시 매개변수가 필요합니다.
위의 두 경우 내포된 함수에 전달한 다른 매개변수를  사용합니다.
매개변수로 사용된 람다함수의 결과를 다르게 할 수 있으므로
하나의 함수에서 다양한 결과를 생성하게 할 수 있습니다.

댓글

이 블로그의 인기 게시물

[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