머신러닝에서 가장 일반적인 회귀분석 유형이라고 할 수 있는 선형 회귀는 예측 변수와 종속 변수로 구성되며, 이 둘은 선형 방식으로 서로 연관지어져 있다. 선형 회귀는 위에서 설명한 대로 가장 적합한 선, 즉 최적적합선을 사용한다.
변수들이 서로 선형적으로 연결되어 있는 경우 선형 회귀를 사용한다. 광고 지출 증가가 판매에 미치는 영향을 예측할 때 등이 예가 될 수 있다.
이와같이 데이터를 가장 잘 표현해주는 하나의 직선을 구하는 것이 선형회귀이다.
그러나 선형 회귀분석은 특이치에 영향을 받기 쉬우므로 빅데이터 집합을 분석하는 데 사용해서는 안 된다.
2. 로지스틱 회귀(Logistic regression)
종속 변수에 이산 값이 있는 경우, 다시 말해 0 또는 1, 참 또는 거짓, 흑 또는 백, 스팸 또는 스팸 아닌 것 등의 두 가지 값 중 하나만 취할 수 있는 경우 로지스틱 회귀를 사용하여 데이터를 분석할 수 있다.
즉 이벤트 발생에대해 확률을 구할 수 있다.
하지만 로지스틱 회귀는 비선형 문제를 해결하는 데 사용할 수 없으며 불행히도 오늘날의 많은 시스템은 비선형이다. 또한 로지스틱 회귀는 사용 가능한 가장 강력한 알고리즘이 아니다.
3. 릿지회귀(Ridge regression)
그러나, 불가피하게 독립 변수들 사이에 높은 상관 관계가 있는 경우라면 리지 회귀가 더 적합한 접근방식이다. 다중 회귀라고도 불리는 리지 회귀는 정규화 또는 규제화(regularization) 기법으로 알려져 있으며 모델의 복잡성을 줄이는 데 사용된다. 또한 ‘리지 회귀 페널티’로 알려진 약간의 편향, 즉 바이어스(bias)를 사용하여 모델이 과대적합(overfitting)에 덜 취약하게 만든다.
4. 라쏘회귀(Lasso regression)
라쏘 회귀는 리지 회귀와 같이 모델의 복잡성을 줄여주는 또 다른 정규화 기법이다. 회귀 계수의 절대 사이즈를 금지함으로써 복잡성을 줄인다. 리지 회귀와는 다르게 아예 계수 값을 0에 가깝게 만든다.
그 장점은 기능 선택을 사용할 수 있다는 것이다. 데이터 집합에서 기능 세트를 선택하여 모델을 구축할 수 있다. 라쏘 회귀는 필요한 요소들만 사용하고 나머지를 0으로 설정함으로써 과대적합을 방지할 수 있다.
5. 다항회귀(Polynomial regression)
다항 회귀는 선형 모델을 사용하여 비선형 데이터 집합을 모델링한다. 이것은 동그란 모양의 구멍에 네모난 모양의 못 또는 말뚝을 끼워 넣는 것과 같다. 다항 회귀는 독립 변수가 여러 개인 선형 회귀를 뜻하는 다중 선형 회귀와 비슷한 방식으로 작동하지만, 비선형 곡선을 사용한다. 즉, 데이터 포인트가 비선형 방식으로 존재할 때 사용한다.
모델은 이 데이터 포인트들을 지정된 수준의 다항식 특성으로 변환하고 선형 모델을 사용하여 모델화한다. 선형 회귀에서 볼 수 있는 직선이 아닌 곡선의 다항식 선을 사용하여 최적적합을 수행한다. 그러나 이 모델은 과대적합으로 나타나기 쉬우므로 이상한 결과치를 피하기 위해서는 끝 부분의 곡선을 분석하는 것이 좋다.
회귀 분석에는 위에서 소개한 것들보다 더 많은 종류가 있지만, 이 다섯 가지가 가장 일반적으로 사용되는 것들이다. 가장 적합한 모델을 선택하면 데이터가 가진 잠재력을 최대한 활용하여 더 큰 인사이트를 얻을 수 있다.
벡터의 좌표계 변환에다 좌표계의 원점 위치를 더해주면 되는것이다. 이때 더해지는 Qa Qb값이 어떤 좌표계를 기준으로 측정되어있는지 주의하자.
3.3 좌표계 변환의 행렬
위의 내용을 다시 생각해보면 행렬 표현으로 아래와 같이 표현할수 있다.
벡터의 값은 (x, y, z ,0 ) 과 같은 형식으로 되어있으므로 결과의 4번째 더해지는 값은 항상 0이 된다. 또한 점값은 4번째 더해지는 값이 Qb가 됨을 알수 있다.
각 u, v, w 는 변환할 좌표계의 단위 벡터이다. Qb는 변환할 좌표계의 원점의 위치이다.
또한 좌표변환 행렬이 A->B로 바꾸는 행렬이면 역행렬은 B->A로 변환하는 행렬이다.
물론 역행렬이 존재하지 않는 좌표변환 행렬이 존재할수 있지만 일반적으로 다루지 않는다.
3.4 능동적 변환 행렬과 좌표계 변환 행렬
좌표계변환 행렬과 아핀변환 행렬을 확인해보면 서로 모양이 같다는것을 확인 할 수 있다.
또한 수학적으로 동치 관계이다. ( 즉 둘이 서로 같은거라는 말 )
이 두가지를 모두 배우는 이유는 아래의 예시를 통해 이해하자.
현재 좌표계가 카메라의 좌표계이고 어떤 물체를 플레이어 캐릭터 주변을 회전하게 하고 싶을때
능동적변환 즉 아핀변환을 사용하면 할수는 있지만 코드 이해하기 쉽지 않다.
회전 -> 플레이어쪽으로 이동
하지만 좌표계 변환을 하면 코드를 쉽게 이해할수 있다.
좌표계 플레이어로 변환 -> 회전
이와같이 모든 변환 행렬은 두 방법을 통해 나타낼수 있다. 하지만 경우에 따라서 어떠한 행렬이 좀더 이해하기 쉬운지 또는 계산하기 편한지를 확인해야한다.
4. DirectXMath 에서의 변환 행렬 함수들
아래와 같은 DirectXMath 라이브러리에 관련 함수들이 존재
// 비례행렬 생성
XMMATRIX XM_CALLCONV XMMAtrixScaling(
float ScaleX,
float SclaeY,
float XcaleZ); // 각 매개변수는 비례계수이다.
// 벡터의 성분들로 비례행렬 생성
XMMATRIX XM_CALLCONV XMMatrixScalingFromVector(
FXMVECTOR Scale); // 매개변수 : (sx, sy, sz, 0)
// x축에 대한 회전행렬 Rx 생성
XMMATRIX XM_CALLCONV XMMatrixRotationX(
float Angle); // X축에 대해 Angle만큼 회전하는 변환행렬 생성
// y축에 대한 회전행렬 Ry 생성
XMMATRIX XM_CALLCONV XMMatrixRotationY(
float Angle); // Y축에 대해 Angle만큼 회전하는 변환행렬 생성
// z축에 대한 회전행렬 Rz 생성
XMMATRIX XM_CALLCONV XMMatrixRotationZ(
float Angle); // Z축에 대해 Angle만큼 회전하는 변환행렬 생성
// 임의의축에 대한 회전행렬 Rn 생성
XMMATRIX XM_CALLCONV XMMatrixRotationN(
FXMVECTOR Axis // 회전축의 벡터 (ex. x축 : (1,0,0,0) )
float Angle); // X축에 대해 Angle만큼 회전하는 변환행렬 생성
// 이동행렬 T 생성
XMMATRIX XM_CALLCONV XMMatrixTranslation(
float OffsetX,
float OffsetY,
float OffsetZ); // 매개변수는 각 이동 오프셋이다.
// 벡터를 이용한 이동행렬 T 생성
XMMATIRX XM_CALLCONV XMMatrixTranslation(
FXMVECTOR Offset); // ( offsetX, offsetY, offsetZ, 0 )
// 벡터와 행렬의 곱 함수 -> 결과 점 ( = 벡터 * 행렬, != 행렬 * 벡터 )
XMVECTOR XM_CALLCONV XMVector3TransformCoord(
FXMVECTOR V, // 결과가 점이므로 벡터의 4번째 값이 자동으로 1로 설정됨
CXMMATRIX M); // 입력 행렬
// 벡터와 행렬의 곱 함수 -> 결과 벡터 ( = 벡터 * 행렬, != 행렬 * 벡터 )
XMVECTOR XM_CALLCONV XMVector3TransformNormal(
FXMVECTOR V, // 결과가 벡터이므로 벡터의 4번째 값이 자동으로 0으로 설정됨
CXMMATRIX M); // 입력 행렬