オーディオ ファイルから作成された 2 つのデータセットで、Matlab でロジスティック回帰をテストしています。
最初のセットは、各ファイルのベクトルを抽出することによって wavread を介して作成されます。セットは 834 x 48116 のマトリックスです。各トレーニング例は、wav の周波数の 48116 ベクトルです。
2 番目のセットは、母音の 3 つのフォルマントの周波数を抽出することによって作成されます。ここで、各フォルマント (特徴) には独自の周波数範囲があります (たとえば、F1 範囲は 500-1500Hz、F2 範囲は 1500-2000Hz など)。各トレーニング例は、wav のフォルマントの 3-ベクトルです。
私は次のようにアルゴリズムを実装しています:
コスト関数と勾配:
h = sigmoid(X*theta);
J = sum(y'*log(h) + (1-y)'*log(1-h)) * -1/m;
grad = ((h-y)'*X)/m;
theta_partial = theta;
theta_partial(1) = 0;
J = J + ((lambda/(2*m)) * (theta_partial'*theta_partial));
grad = grad + (lambda/m * theta_partial');
ここで、X はデータセット、y は 8 つのクラスの出力行列です。
分類子:
initial_theta = zeros(n + 1, 1);
options = optimset('GradObj', 'on', 'MaxIter', 50);
for c = 1:num_labels,
[theta] = fmincg(@(t)(lrCostFunction(t, X, (y==c), lambda)), initial_theta, options);
all_theta(c, :) = theta';
end
ここで、num_labels = 8、ラムダ (正則化) は 0.1 です。
最初のセットでは MaxIter = 50 で、最大 99.8% の分類精度が得られます。
2 番目のセットで MaxIter=50 の場合、精度は低くなります - 62.589928
パフォーマンスを改善するために MaxIter をより大きな値に増やすことを考えましたが、途方もない量の反復でも、結果は 66.546763 より高くなりません。正則化値 (ラムダ) を変更しても、結果に良い影響を与えるようには見えません。
何が問題なのですか?私は機械学習が初めてで、この劇的な違いの原因を正確に把握できないようです。私にとって明らかに際立っている唯一の理由は、最初のセットの例が非常に長いベクトルであるため、より多くの機能があり、2 番目のセットの例が短い 3-ベクトルで表されていることです。このデータは、2 番目のセットを分類するのに十分ではありませんか? もしそうなら、2番目のセットでより良い分類結果を得るために何ができるでしょうか?