1次元線形回帰は、最も単純な回帰法の1つ(および一般的に最も単純な機械学習法の1つ)であり、属性の1つに対する観測値の線形依存性を記述することができます。 一般的な場合、機械学習の問題では、多数の異なる属性に対処する必要があります。 この場合の1次元線形回帰は、目的関数との最良の相関を達成できるようにするものの1つを選択します。
このシリーズの以前の投稿で、平均と共分散の計算の精度について説明し、多くの場合これらの問題の計算エラーを回避するウェルフォード法にも精通しました。 今日は、一次元線形回帰の問題におけるウェルフォード法の実際的な応用を見ていきます。
内容
1.一次元線形回帰
1次元線形回帰問題では、実数の2つのシーケンスがあると仮定します。 x そして答え y 。 さらに、対応する重みのベクトルがあります w 。 いつものように、これらのシーケンスには潜在的に無限の数の要素が含まれると仮定しますが、現時点では n 各シーケンスの最初の要素。
私たちのタスクは、特徴と答えの間の線形関係を復元すること、つまり線形決定関数を構築することです。 f: mathbbR\右矢印 mathbbR :
f(xi)= alpha cdotxi+ beta
これにより、平均二乗損失関数が最小化されます。
Q(f、x、y、w)= sqrt frac1 sumni=1wi sumni=1wi cdot(f(xi)−yi)2
分析のために、根本的で正規化されていない式を使用する方が簡単です。
Q1(f、x、y、w)= sumni=1wi cdot(f(xi)−yi)2= sumni=1wi cdot( alphaxi+ beta−yi)2
機能の最小点から Q そして Q1 一致する場合、そのような置換は正しいです。
2.中央揃えのサンプルのソリューション
損失機能 Q1 に関してデリバティブを書きやすい alpha そして \ベータ :
frac partialQ1(f、x、y、w) partial alpha=2 cdot sumni=1wixi( alphaxi+ beta−yi)
frac partialQ1(f、x、y、w) partial beta=2 cdot sumni=1wi( alphaxi+ beta−yi)
それらをゼロに等しくすると、次のようになります。
alpha cdot sumni=1wix2i+ beta cdot sumni=1wixi− sumni=1wixiyi=0
alpha= frac sumni=1wixiyi− beta cdot sumni=1wixi sumni=1wix2i
beta= sumni=1wiyi− alpha cdot sumni=1wixi
重要な余談。 この場合、導関数をゼロに等しくすることは正しいです。なぜなら、
1.損失汎関数は、最適化されたパラメーターに関して凸であるため、 ローカル最適の任意のポイントもグローバル最適のポイントになります 。
2.最適化されたパラメータに関する汎関数損失は放物線であるため、見つかった極値は最小値になります。
最適なパラメータの場合 \ベータ ゼロに等しい場合、解決策を見つけることは難しくありません。 サンプルを前処理する標準的な機械学習方法であるセンタリングが、この効果に正確につながることに気付くかもしれません。 実際、中心変数の問題を考えてみましょう。
x′i=xi− frac sumni=1wixi sumni=1wi
y′i=yi− frac sumni=1wiyi sumni=1wi
重み付き属性の合計はゼロになり、重み付き応答の合計もゼロになりました。
sumnk=1wkx′k= sumnk=1wk cdot Big(xk− frac sumni=1wixi sumni=1wi Big)= sumnk=1wkxk− sumni=1wixi=0
sumnk=1wky′k= sumnk=1wk cdot Big(yk− frac sumni=1wiyi sumni=1wi Big)= sumnk=1wkyk− sumni=1wiyi=0
その場合、自由パラメーターの最適値はゼロになります。
beta′= sumni=1wiy′i− alpha′ cdot sumni=1wix′i=0
そしてこれは、パラメータの最適値が alpha′ 見つけやすい:
alpha′= frac sumni=1wix′iy′i sumni=1wix′2i
3.一般的な場合の決定
次に、一般的なオフセンターデータのケースに戻りましょう。 もし f′ 中央のケースの決定的な関数であり、その値は式によって決定されます
f′(x′k)= alpha′ cdotx′k
値を概算する y′k=yk− frac sumni=1yixi sumni=1wi 次に、次の決定的な関数が量を近似します yk :
f(xk)= alpha′ cdot Big(xk− frac sumni=1wixi sumni=1wi Big)+ frac sumni=1yixi sumni=1wi= alpha′ cdotxk+ Big( frac sumni=1yixi sumni=1wi− alpha′ cdot frac sumni=1wixi sumni=1wi Big)
したがって、1次元線形回帰の初期問題の解は次のように記述できます。
alpha= frac sumni=1wi(xi−mwxn)(yi−mwyn) sumni=1wi(xi−mwxn)(xi−mwxn)
beta=mwyn− alpha cdotmwxn
ここでは、前回の記事で紹介した加重平均の表記法を使用します。
mwxn= frac sumni=1wixi sumni=1wi
mwyn= frac sumni=1wiyi sumni=1wi
別の方法で、このような移行が正しいことを理解できます。 中心データのソリューションが最適な場合、パラメーター alpha′ そして \ベータ′ 最小損失機能を提供する Q1 :
Q1(f′、x′、y′、w)= sumni=1wi cdot( alpha′ cdotx′i+ beta′−y′i)2
次に、変数を置き換えて、中心から外れたデータに戻ります。
Q1(f′、x′、y′、w)= sumni=1wi cdot Big( alpha′ cdot(xi−mwxn)−yi+mwyn Big)2=
= sumni=1wi cdot Big( alpha′ cdotxi+(mwyn− alpha′ cdotmwxn)−yi Big)2
結果の式は、損失関数の値を記述します Q1 の式に従った偏りのないデータの場合 alpha そして \ベータ 私たちは上に得た。 この場合の機能の値は最小に達するため、問題は正しく解決されます!
4.ウェルフォード法の適用
ここで、パラメータを計算するときに注意してください alpha 前の記事で扱った計算と同じ共分散が使用されます 。 実際、その表記法を使用して、次のように書くことができます。
alpha= fracDwxynDwxxn= fracCwxynCwxxn
つまり、回帰係数を計算するには、Wellfordメソッドを使用して共分散を2回計算する必要があります。 これらの計算の過程で、自由回帰係数の計算に必要な平均値を同時に見つけます。
別の要素を選択に追加するためのコードは 、サインと回答の平均と分散、およびサインと回答間の共分散を更新することで構成されます。
void TWelfordSLRSolver::Add(const double feature, const double goal, const double weight) { SumWeights += weight; if (!SumWeights) { return; } const double weightedFeatureDiff = weight * (feature - FeaturesMean); const double weightedGoalDiff = weight * (goal - GoalsMean); FeaturesMean += weightedFeatureDiff / SumWeights; FeaturesDeviation += weightedFeatureDiff * (feature - FeaturesMean); GoalsMean += weightedGoalDiff / SumWeights; GoalsDeviation += weightedGoalDiff * (goal - GoalsMean); Covariation += weightedFeatureDiff * (goal - GoalsMean); }
これは、すべての要素を追加した後、1次元線形回帰の最適なパラメーターを見つける問題を解決する方法です。
template <typename TFloatType> void TWelfordSLRSolver::Solve(TFloatType& factor, TFloatType& intercept, const double regularizationParameter = 0.1) const { if (!FeaturesDeviation) { factor = 0.; intercept = GoalsMean; return; } factor = Covariation / (FeaturesDeviation + regularizationParameter); intercept = GoalsMean - factor * FeaturesMean; }
GoalsDeviation
の値はここでは使用されませんが、今後の記事で必要になります。
1つのクラスですべての計算を組み合わせることで、オーバーヘッドを回避できます。 たとえば、2つのオブジェクトがセカンダリを格納するための実装で使用され、3つのオブジェクトが共分散を格納するために使用された場合(符号付きの回答、回答付きの回答、回答付きのサイン)、サンプルの各例で重みの合計が5回更新されます。
5.実験方法の比較
実際の比較のために、1 次元および多次元の線形回帰の問題を解決するためのさまざまな方法を実装するプログラムを作成しました。 次の記事で多次元回帰について説明しますが、ここでは1次元のケースに焦点を当てます。
いつものように、「ナイーブ」な方法、カハン法による合計に基づく方法、およびウェルフォード法に基づく方法を比較します。
「単純な」方法は、共分散を計算するための公式を直接適用します 。
void Add(const double feature, const double goal, const double weight = 1.) { SumFeatures += feature * weight; SumSquaredFeatures += feature * feature * weight; SumGoals += goal * weight; SumSquaredGoals += goal * goal * weight; SumProducts += goal * feature * weight; SumWeights += weight; }
クラスはテンプレートであり、タイプdoubleおよびタイプTKahanAccumulatorのカウンターを持つ特殊化があります。
さらに、 TTypedBestSLRSolver
クラスが TTypedBestSLRSolver
れ、1次元回帰モデルを構築するための最良の機能を選択します。 これは非常に簡単に行われます。1次元の線形回帰の問題は、各記号について解決され、結果のモデルの中で最良のものが選択されます。
開発したメソッドをテストするために、LIACコレクションのモデルデータを使用します。 便宜上、データセットの一部は、作成されたプログラムが理解できる形式でデータディレクトリに配置されます。
タスクのデータは単純な方法で「台無しにされます」。サインと回答の値に特定の数値を掛け、その後に他の数値を追加します。 したがって、計算ケースの観点から問題を取得できます:散布値と比較して大きな平均値。
research-bslr
サンプルは連続して数回変化し、そのたびにスライド制御手順が開始されます。 チェックの結果は、テストサンプルの決定係数の平均値です。
たとえば、kin8nmサンプルの場合、結果は次のとおりです。
injure factor: 1 injure offset: 1 fast_bslr time: 0.001322 R^2: 0.27359 kahan_bslr time: 0.002999 R^2: 0.27359 welford_bslr time: 0.00432 R^2: 0.27359 normalized_welford_bslr time: 0.004288 R^2: 0.27359 injure factor: 0.1 injure offset: 10 fast_bslr time: 0.001256 R^2: 0.27359 kahan_bslr time: 0.002948 R^2: 0.27359 welford_bslr time: 0.004303 R^2: 0.27359 normalized_welford_bslr time: 0.004275 R^2: 0.27359 injure factor: 0.01 injure offset: 100 fast_bslr time: 0.001283 R^2: 0.27359 kahan_bslr time: 0.003015 R^2: 0.27359 welford_bslr time: 0.004304 R^2: 0.27359 normalized_welford_bslr time: 0.004285 R^2: 0.27359 injure factor: 0.001 injure offset: 1000 fast_bslr time: 0.001262 R^2: 0.27324 kahan_bslr time: 0.002977 R^2: 0.27359 welford_bslr time: 0.004329 R^2: 0.27359 normalized_welford_bslr time: 0.00428 R^2: 0.27359 injure factor: 0.0001 injure offset: 10000 fast_bslr time: 0.00128 R^2: -59.271 kahan_bslr time: 0.003009 R^2: -0.0005269 welford_bslr time: 0.004304 R^2: 0.27359 normalized_welford_bslr time: 0.00428 R^2: 0.27359 full learning time: fast_bslr 0.006403s kahan_bslr 0.014948s welford_bslr 0.02156s normalized_welford_bslr 0.021408s
この場合、サンプル内のすべての値を1万倍に減らし、それらに10,000の値を追加すると、Kahanメソッドで合計しても標準アルゴリズムが動作しなくなります。 生産の実生活で見られるものを含む他のサンプルでも同様の結果が得られます。
おわりに
そこで、本日、1次元線形回帰の問題について話し、この問題の分析解を得る方法と、ウェルフォード法を使用して解を見つける方法を見つけました。
Wellfordの方法は、データの潜在的な問題に対する問題の解決を大幅に強化します。 ただし、この方法は標準アルゴリズムの2〜4倍遅いので、実際には、データで起こりうる問題に依存したり、できるだけ早く作業したりするのではなく、現時点でより重要なものを自分で決める必要があります。
異なるデータでモデルを何度も作成する必要があり、受信した各モデルの品質を制御する方法がない場合は、Wellfordメソッドを使用することをお勧めします。
次の記事では、Wellfordメソッドを使用して多次元線形回帰問題を解決する方法について説明します。
文学
- habrahabr.ru: ウェルフォード法による平均と共分散の正確な計算
- github.com: さまざまな計算方法を使用した線形回帰問題ソルバー
- github.com:コネクショニスト人工知能研究所(LIAC)のARFFデータセットのコレクション
- machinelearning.ru: 一次元線形回帰