2013-03-30 2 views
1

다음과 같이 내 작업이다 : 나는 X, 직교 좌표계에서 y는 시스템 좌표 직교 좌표 좌표 열 X, Y, Class 있는 테이블과 지점의 예를 들어, 클래스가 클래스 1, 클래스 2). 별도의 클래스 포인트가 좌표계의 독립적 인 두 부분에있는 방식으로 평면을 나누는 선을 찾아야합니다. 선형 분류자를 사용한 것은 처음입니다. 나는 하나의 select 쿼리를 사용하여 이것을 어떻게 달성 할 수 있을지 궁금합니다. 서브 쿼리가 허용됩니다.는 데이터베이스에 저장

답변

1

나의 첫 번째 반응은 이것이 SQL의 문제가 아니므로 통계/데이터 분석 소프트웨어를 찾아 봐야한다는 것입니다. 이러한 "최상의"라인은 SVM (Support Vector Machine)에서 제공하므로 사용자가 직접 찾을 수 있습니다.

그러나 시간이 많거나 포인트가 거의없는 경우 무차별 방식을 시도 할 수 있습니다. 즉, 가능한 라인 목록을 살펴보고 얼마나 잘 분할되어 있는지 확인하십시오.

따라서 행에 방정식 y = mx + b이 있다고 가정합니다. 여기 다른 경사면을 가진 일련의 선들을 시험해 봅니다. y - mx + b이 양수인지 음수인지에 따라 줄의면을 테스트 할 수 있습니다. 그런 다음 각 측면 및 각 범주에 대해이를 집계하고 일부 논리를 사용하여 범주에 대한 측면을 선택합니다. 이를 위해

, 나는 SQL 서버 구문을 사용하고 있습니다 :이 코드는 카테고리 1에 대한 측면을 선택하는 것이

with nums as ( -- get a bunch of nums 
     select row_number() over (order by null) as n 
     from information_schema.columns c 
    ), 
    m as (
    select n - 10 as m -- from -10 to 10 
    from nums 
    where n <= 21 
    ), 
    b as (
    select n - 10 as b -- from -10 to 10 
    from nums 
    where n <= 21 
    ) 
    lines as (
    select m, b 
    from m cross join b 
    ) 
select m, b, 
     (case when cat1_side1 > cat1_side2 then 'side1' else 'side2' 
     end) as cat1_side, 
     (case when cat1_side1 > cat1_side2 then cat1_side1 else cat1_side2 
     end) as cat1_correct, 
     (case when cat1_side1 > cat1_side2 then 'side2' else 'side1' 
     end) as cat2_side, -- force cat2 to the other side 
     (case when cat1_side1 > cat1_side2 then cat2_side2 else cat2_side1 
     end) as cat2_correct 
from (select l.m, l.b, 
      sum(case when p.category = 'cat1' and p.y - (p.x*l.m + l.b) < 0 
         then 1 else 0 
       end) as cat1_side1_cnt, 
      sum(case when p.category = 'cat1' and p.y - (p.x*l.m + l.b) > 0 
         then 1 else 0 
       end) as cat1_side2_cnt, 
      sum(case when p.category = 'cat2' and p.y - (p.x*l.m + l.b) < 0 
         then 1 else 0 
       end) as cat2_side1_cnt, 
      sum(case when p.category = 'cat2' and p.y - (p.x*l.m + l.b) > 0 
         then 1 else 0 
       end) as cat2_side2_cnt, 
     from points p cross join 
      lines l 
     group by l.m, l.b, p.category 
    ) lp 
order by (cat1_correct + cat2_correct) desc 

참고 이것은, 차례 차례로, 당신은 선택할 수 없습니다 카테고리 2의 다른 측면을 강제로 모든 데이터 요소가 선의 한면에있을 수 있기 때문에 각면에 가장 적합한면입니다.

또한 수직선에서는 작동하지 않지만 가까이 오게됩니다.

이 문제를 해결하는 가장 좋은 방법은 이 아니며이 아님을 나타냅니다. 그러나 데이터 포인트 수가 적 으면 실제로 제대로 작동 할 수 있습니다.