4

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); 
} 
+0

내가 알고 있어요 : 코드 자체는 하나의 루프에서 모든 금액을 @ "avg.doubleValue"에 전화를 떨어 뜨리고 생산함으로써, 명확하게, 그리고 부수적으로보다 효율적으로 할 수 있습니다에

'double ssX, ssY, ssXY; '구문을 사용하지만'ssX = ssY = ssXY = 0;'은 새로운 것입니다 :) – Anne

+0

구현을 변경했다면이 코드를 올바로 업데이트 할 수 있습니까? 나는 그것을 시도하고 correlationCoefficients가 1 이상 ... – horseshoe7

+0

(업데이트 : 그냥 내 자신의 질문에 대답했다 ... 그것은 pow (..) 함수이다. – horseshoe7

답변

3

를 착용하면, 예를 들어, 손으로 확인하실 수 있습니다 {1,1}, {2,2}, {3,3}. 평균이 맞습니까? 그렇다면 합계로 이동하십시오. 오류는 자체를 나타냅니다.

// Sum of X, Y, X^2, Y^2 & X*Y 
for (NSUInteger i = 0; i < n; i++) 
{ 
    double x = [[_accelBufferX objectAtIndex:i] doubleValue]; 
    double y = [[_accelBufferY objectAtIndex:i] doubleValue]; 
    sX += x; 
    sY += y; 
    ssX += x * x; 
    ssY += y * y; 
    ssXY += x * y; 
} 
+0

많은 도움을 요청했다. 당신과 같은 구현을 바꿨다. 제안하고 지금은 매력처럼 작동합니다! 나는 첫 번째 코드에 무엇이 잘못 되었는가를 말할 수는 없지만, 지금은 ... 누가 투표하지 않겠습니까? 미안하지만 더 많은 평판이 먼저 필요합니다. –

+0

답변을 수락했습니다. 죄송합니다. 저는 여기 꽤 새롭습니다. 나는 coepleint가 하나보다 커지는 문제가 내 구현에서 캐치 레이션 오류로 인한 것임을 알았지 만. 회귀를 계산할 값에 요인을 추가 했으므로 값이 정확합니다. –

+0

@ D.Hot - 사과 할 필요가 없습니다. 우리는 한 번 새로운 것이었고 사이트가 어떻게 작동 하는지를 알아야했습니다. – CRD