私の仕事は次のとおりです。列を持つテーブルがあります。X, Y, Class
ここで、デカルト座標系の x 座標、デカルト座標系の y 座標、およびポイントのクラス (クラス 1、クラス 2) があります。別々のクラスの点が座標系の 2 つの独立した部分に存在するように平面を分割する線を見つける必要があります。線形分類器を使用するのは初めてです。1 つのクエリだけを使用してこれをどのように達成できるのか疑問に思っていselect
ます - サブクエリが許可されています。
1 に答える
私の最初の反応は、これは SQL の影響を受けやすい問題ではなく、統計/データ分析ソフトウェアを調べる必要があるということです。そのような「最良の」行は、サポート ベクター マシン (SVM) によって提供され、調べることができます。
ただし、時間がたくさんある場合、またはポイントがほとんどない場合は、力ずくの方法を試すことができます。つまり、可能な行のリストを調べて、それらがどの程度うまく分割されているかを確認します。
したがって、線に等式があるとしますy = mx + b
。これは、さまざまな勾配を持つ一連の線のテストです。y - mx + b
正か負かによって線の側面をテストできます。次に、これをサイドごとおよびカテゴリごとに集計し、いくつかのロジックを使用してカテゴリのサイドを選択します。
このために、SQL Server 構文を使用しています。
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
このコードは、カテゴリ 1 の側を選択し、これにより、カテゴリ 2 の反対側を強制することに注意してください。すべてのデータ ポイントが線の片側にある可能性があるため、それぞれに最適な側を選択することはできません。
また、これは垂直線では機能しませんが、近いものになります。
これをまとめるにあたり、これがこの問題への最善のアプローチだと言っているわけではありません。ただし、データ ポイントの数が少ない場合は、実際にはかなりうまく機能する可能性があります。