2D의 점 집합에 선을 맞추는 방법을 구현하려고합니다. 두 Array (X, Y 좌표) 에서 데이터를 읽고 최소 제곱 법을 사용하여 가장 잘 맞는 선의 매개 변수를 계산해야하는 다음 코드를 작성했습니다. 내가 여기 주어진 수식을 사용 : mathworld.wolframObjective-C의 선형 회귀
- (void) linearRegressionOfUserAcceleration
{
double avgX = [[_accelBufferX valueForKeyPath:@"@avg.doubleValue"] doubleValue];
double avgY = [[_accelBufferY valueForKeyPath:@"@avg.doubleValue"] doubleValue];
int n = _accelBufferX.count;
double ssX, ssY, ssXY;
ssX = ssY = ssXY = 0;
int i;
// Sum of squares X, Y & X*Y
for (i = 0; i < n; i++)
{
ssX += pow([[_accelBufferX objectAtIndex:i] doubleValue],2);
ssY += pow([[_accelBufferY objectAtIndex:i] doubleValue],2);
ssXY += [[_accelBufferX objectAtIndex:i] doubleValue] * [[_accelBufferY objectAtIndex:i] doubleValue];
}
ssX = ssX - n * pow(avgX,2);
ssY = ssY - n * pow(avgY,2);
ssXY = ssXY - n * avgX * avgY;
// Best fit of line y_i = a + b * x_i
b = ssXY/ssX;
a = avgY - b * avgX;
// Correlationcoefficent gives the quality of the estimate: 1 = perfect to 0 = no fit
corCoeff = pow(ssXY,2)/ssX * ssY;
NSLog(@"n: %d, a: %f --- b: %f --- cor: %f --- avgX: %f --- avgY: %f --- ssX: %f - ssY: %f - ssXY: %f", n, a, b, corCoeff, avgX, avgY, ssX, ssY, ssXY);
}
내가 수를 같은 출력 :
이n: 15, a: -0.095204 --- b: 0.929245 --- cor: 3.567163 --- avgX: -0.017827 -- avgY: -0.111770 --- ssX: 2.176048 - ssY: 1.898429 - ssXY: 2.022081
전혀하고 corelationCoefficient하지만 데이터에 맞지 않는 결과 라인이보다 때로는 더 큰, IMHO는 모든 것이 올바르게 작동하면 결코 일어나서는 안됩니다.
누구든지 구현시 오류가 있습니까?
- 편집 -
이것은 CRD에서 팁 다음 수정 된 코드. 두 단계 사이의 수평면에서 샘플 된 userAcceleration의 방향 벡터를 추출하여 단계 방향을 얻는 데 사용했습니다.
이
은 나를 위해 일한 : 몇 가지 알려진 데이터- (void) linearRegressionOfUserAcceleration
{
NSUInteger n = _accelBufferX.count;
double ax, ay, sX, sY, ssX, ssY, ssXY, avgX, avgY;
// Sum of squares X, Y & X*Y
for (NSUInteger i = 0; i < n; i++)
{
@synchronized(self) {
ax = [[_accelBufferX objectAtIndex:i] doubleValue];
ay = [[_accelBufferY objectAtIndex:i] doubleValue];
}
sX += ax;
sY += ay;
ssX += ax * ax;
ssY += ay * ay;
ssXY += ax * ay;
}
avgX = sX/n;
avgY = sY/n;
radius = hypot(avgX, avgY);
ssX = ssX - n * (avgX * avgX);
ssY = ssY - n * (avgY * avgY);
ssXY = ssXY - n * avgX * avgY;
// Best fit of line y_i = a + b * x_i
b = ssXY/ssX;
a = (avgY - b * avgX);
theta = atan2(1, b);
// Correlationcoefficent gives the quality of the estimate: 1 = perfect to 0 = no fit
corCoeff = (ssXY * ssXY)/(ssX * ssY);
NSLog(@"n: %d, a: %f --- b: %f --- cor: %f --- avgX: %f -- avgY: %f --- ssX: %f - ssY: %f - ssXY: %f", n, a, b, corCoeff, avgX, avgY, ssX, ssY, ssXY);
}
내가 알고 있어요 : 코드 자체는 하나의 루프에서 모든 금액을 @ "avg.doubleValue"에 전화를 떨어 뜨리고 생산함으로써, 명확하게, 그리고 부수적으로보다 효율적으로 할 수 있습니다에
'double ssX, ssY, ssXY; '구문을 사용하지만'ssX = ssY = ssXY = 0;'은 새로운 것입니다 :) – Anne구현을 변경했다면이 코드를 올바로 업데이트 할 수 있습니까? 나는 그것을 시도하고 correlationCoefficients가 1 이상 ... – horseshoe7
(업데이트 : 그냥 내 자신의 질문에 대답했다 ... 그것은 pow (..) 함수이다. – horseshoe7