Swift로 최소 2승법의 선형 회귀를 복습하다

최근에 수학을 다시 공부하는 것이 좋다고 해서 저도 복습하는 김에 swift로 선형 회귀(단회귀)를 실시했기 때문에 적어 두었습니다.

선형 회귀


통계학에서 Y가 연속값일 때 데이터는 Y=f(X)라는 모델('정량 관계의 구조[1]')을 사용해야 한다.
회귀에 사용되는 가장 기본적인 모델은 Y=AX+B 형식의 선형 회귀이다.
회귀 분석 - 위키백과
예를 들어 주택을 팔 때 그 주택의 부지 면적이 얼마나 되는지, 대략 얼마나 되는지 추측할 수 있다.
샘플 데이터가 몇 개 있다고 가정하면, 그것을 표에 그립니다.
부지 면적이 넓으면 가격이 오를 것 같아서요.

이 부지 면적과 가격의 관계를 나타내기 위해 y=ax+b의 공식을 사용하면 다음과 같다.
価格 = a \times 敷地面積 + b
이 데이터에서 상식의 a와 b를 집중적으로 계산하려면 최소 2승법을 사용하십시오.

최소 제곱법


특정 함수(예를 들어 적당한 모델에서 가정한 일차 함수, 대수 곡선 등)를 사용하여 측정을 통해 얻은 수치와 비슷할 때 계수를 확정하여 잔차의 제곱과 최소화를 함으로써 가정한 함수가 측정 값에 좋은 근사한 방법이나 이런 방법을 통해 근사하게 한다.
최소 2승법-위키백과
아까 표에 y=ax+b의 선을 그어라.

최소 제곱법의 정의는 위에서 설명한 바와 같지만 그림과 같이 빨간색 선(추정치와 실제 데이터 사이의 차이)을 최소화하는 공식이 필요하다.

공식.


방금 y=ax+b 중 a는 회귀계수이고 b는 절편이다.
각자의 방식을 찾다
回帰係数 = \frac{xとyの共分散}{xの分散}\\
切片 = yの平均 - 回帰係数 \times xの平均
분산과 분산이 뭐였더라, 그래서 이것도 복습부터 하고.

편차


데이터의 산란 정도를 나타내는 수치에서 편차(각 수치와 평균치의 차)의 제곱의 평균값으로 계산한다.
\frac{1}{n}\sum_{i=1}^{n} (x_i - \bar{x})^2

공분산


'x의 편차'는 두 그룹의 대응하는 데이터 간의 관계를 나타내는 수치이다× y 편차의 평균값.
\frac{1}{n}\sum_{i=1}^{n} (x_i - \bar{x})(y_i - \bar{y})
이걸 알면 그 다음엔 실시만 할 거야.

실현을 해보도록 하겠습니다.


실제 데이터의 읽기가 매우 번거롭기 때문에 화면을 클릭하면 그려지고 최소 2승법으로 데이터 집합으로 회귀 계수와 슬라이드를 그립니다.
※ View의 좌표는 왼쪽 상단이 원점이므로 y 좌표는 왼쪽 하단을 원점으로 반전합니다.
각 값의 계산 방법은 다음과 같다.
탭 뒤의 좌표를 Samples에 저장합니다.
var samples: [CGPoint] = []

@IBAction func handleTap(_ tap: UITapGestureRecognizer) {
    let location = tap.location(in: view)
    samples.append(CGPoint(x: location.x, y: view.frame.height - location.y))
}
let x = samples.map{$0.x}
let y = samples.map{$0.y}
let m = samples.count

// 平均
let plus = { (a: CGFloat, b: CGFloat) -> CGFloat in a + b }
let aveX = x.reduce(0, plus)/CGFloat(m)
let aveY = y.reduce(0, plus)/CGFloat(m)

// XとYの共分散
let sXY = zip(x.map{$0-aveX}, y.map{$0-aveY}).map(*).reduce(0, plus)/CGFloat(m)

// Xの分散
let sX = x.map{pow($0-aveX, 2)}.reduce(0, plus)/CGFloat(m)

// 回帰係数
let a = sXY/sX

// 切片
let b = aveY-a*aveX
이상.
그리고 이 값으로 View에 그림을 그리면 완성됩니다.

총결산


예전에 했던 것 같은데 잊기 쉬워..
주로 최소 2승법의 계산 방법을 이해하는데 swift에서 써 본 부분은 혜택적인 느낌을 주지만 실제로 자신이 쓰면 공식이 무엇을 하는지 이해하기 쉽다.
상관없는 일이지만 대학 시절 통계학은 필수였지만 수학 선택은 어려웠고 수학 선택 이외의 사람은 간단한 반으로 나눌 수 있었다.
나는 수학적 선택이지만 간단한 반에서 주사위를 100번 던지면 실제 시험은 6분의 1의 확률이 있느냐는 과제가 나왔다고 하니 그렇게 간단한 과제가 있을까 하는 생각이 든다.

좋은 웹페이지 즐겨찾기