coursera Wu Enda 機械学習 機械学習の宿題/演習導入 + スクリプト テスト (ex12345678)

宿題をしているときに遭遇した問題を書き留めてください。
coursera Wu Enda 機械学習 Web サイト

PS: ここのコード スニペットには言語が書かれていません。確認できます。私は怠け者です。私がそれを書いていないことがわかったら、ここにマゼンタが表示されます (Wu Enda を参照すると、赤色がこれはまだ非常に見栄えの良いものです。私は Google を使用して
ここに画像の説明を挿入
Reader を閲覧し、「ダーク リーダー」プラグインをダウンロードしました。これは犬の目を保護するのに非常に最適で、実際に失明しそうになっていました。白い画面に向かっていた。
後から追記:編集時のみマゼンタで、読み込み時は白になることが分かりました。

クリックして送信:
Ex1
Ex2 Ex3
Ex4
Ex5
Ex6
Ex7
Ex8


例1

メモの断片:

  1. nx1、または 1xn はベクトル、ベクトルと呼ばれ、R n R^nと表されます。Rn、 nxm は行列と呼ばれ、 Rnxm
  2. プログラミング課題をクリックしたときにそのパスワードが表示されただけで、ビデオを見た後、試してみたいと思ったのですが、パスワードが見つかりませんでした。

1.ウォームアップエクササイズ

A = eye(5);

ビデオにも答えがあり、良いスタートが切れました。最初の「Nice Work!」が得られました。
注意すべき場所は、テストする必要がない場合はセミコロンを追加することです。そうしないと、大量のものが出力されます。 .. その後、出力は結果に影響を与えないようで、「Just do it right」が返されます。


2. 計算コスト (1 つの変数の場合)

prediction = X*theta;
cost = (prediction - y).^2;
J = 1/(2*m)*sum(cost);

.^2 に「.」を追加するのは要素ごとの操作であることに注意してください。


3. 勾配降下法 (1 つの変数の場合) は、
ここに画像の説明を挿入
公式に従って記述できます。

delta = X'*(X*theta - y); %X'可以不加括号
theta = theta - alpha/m*delta;

delta = X' * (X * theta - y) のように行列の大小関係に注意してください。(X*theta - y)*X' のように書くことはできません。X' は 20x2 なので、1 つは 20 x です。 1、デルタ(つまり、シータの導関数、シータと同じサイズ)は 2x1 なので、X' を前に書く必要があります。この問題は、数式を手動で押す場合に発見するのがより困難になります。これらのパラメータの長さと幅については、黒枠で印刷して確認してください。

この問題は2週目のプログラミング課題提出時の読み物に記載されていたのですが、当時は何が起こっているのか分かりませんでした。書き終えた後、うっかりクリックしてしまい、この問題について話していることに気づきました。


4. 特徴の正規化
特徴の正規化処理。正規化は (x - 平均) / 標準偏差です。
(x - 平均) / (最大 - 最小) を書きます。投稿してください。そうしないと、無駄に書かれてしまいます。

mu = mean(X_norm')
mu = mu' * ones(1,3);
sigma = std(X_norm');
X_norm = (X_norm-mu)./(max(X_norm')'*ones(1,3)-min(X_norm')'*ones(1,3))

主に: ここで x は各行の例であり、各列は特徴であるため、mean、std、および max 関数を呼び出すときに転置する必要があります。これらは列ごとに計算する必要があるため、単一行ベクトルでは確認できませんが、行列では確認できます。


5. [計算コスト (複数の変数の場合)] は
[計算コスト (1 つの変数の場合)] と同じなので、貼り付けるだけです。


6. 勾配降下法 (複数の変数の場合) は
勾配降下法 (1 つの変数の場合) と同じで、貼り付けるだけです。行列演算の魅力。


7. 正規方程式
ここに画像の説明を挿入
theta = (pinv(X' * X))*(X') * y は
行列を反転するときに -1 を書き込みます。X-1 が何を表すのか、逆も転置も思い出せません ==

最後にex1の完成を記念しましょう~
ここに画像の説明を挿入


例2

1. シグモイド関数

g = ones(size(z,1),size(z,2))./(1+exp(-z));

点の除算 ( ./ ) に注意を払い、この 1 は 1x1 次元であるため分子に 1 を書き込むことはできません。また、分母は exp(- に 1 が追加されるため、OK) であることに注意するのは簡単ではありません。 z) を後で正しいディメンションに変更すると、そのディメンションは大きいディメンションにマージされます。


2. ロジスティック回帰コスト
はは、最後に送信ファイルを確認する必要がありました。2 と 3 はどちらもcostFunction を呼び出しますが、1 つは J をチェックし、もう 1 つは grad をチェックします。すると、3のJが間違っていることが分かりました。実際、3 は正しくありません。ロジスティック関数は線形に従って記述すると凸関数ではないため、形式を変更する必要があります。処理は簡単で、探すだけで済みます。行列の乗算のサイズは次のとおりです
ここに画像の説明を挿入
。図でも扱われます。

prediction = ones(size(X*theta,1),size(X*theta,2))./(1+exp(-X*theta));
cost = (prediction - y).^2;
%J = 1/(2*m)*sum(cost); Wrong!!!
J = 1/m*(-y'*log(prediction)-(1-y)'*log(1-prediction));
grad = X'*(prediction - y)/m;

3. ロジスティック回帰勾配 -costFunction は
2 番目の処理を実行しようとしていますが、結果は 3 番目の処理になります (???)

prediction = ones(size(X*theta,1),size(X*theta,2))./(1+exp(-X*theta));
cost = (prediction - y).^2
J = 1/(2*m)*sum(cost)
grad = X'*(prediction - y)/m

ロジスティックコストと線形コスト (J) およびコスト勾配の計算式は同じであるため、予測 (z) を変更するだけです。前のコードをコピーして貼り付けるだけです。


4. Predict は、
フォルダー (バー) 内の関数が相互に呼び出しできることを突然発見しました。

%X(1,:)
%theta
for i=1:m
  if sigmoid(X(i,:)*theta)>=0.5
    p(i) = 1;
  endif
endfor

注意すべきことは、X の長さと幅とシータに注目することです。一致させるために、i は各行 (各グループ) の X を容易にし、それにシータを掛けます。p(i) は i です。 - 行目 (グループ) の結果。うーん、ここでは for ループが使用されていますが、for を使用せずに各行の p(i) を更新する方法が思いつきません。
書き終わってすぐに思い出して(うーん、賢いな)、Python に = [X>0] があることを思い出して… ほぼこんな感じです(文法が間違っているようですが、 ReLu で使用されます) 要素をチェックして > 0 であるかどうかを確認し、それを (行列にも) に割り当てます。それから、ここの黒いフレームでそれを真似しました。
ここに画像の説明を挿入
このひょうたんの絵の波は非常にOKです!したがって、引き続き真似してください。

predict = sigmoid(X*theta)
p = predict>=0.5

終わりました。マトリックスを直接操作するために使用しないでください。


5. &6. 正規化ロジスティック回帰コストと正規化ロジスティック回帰勾配は
すべて 1 つのファイルでテストされ、一緒に書き込まれます。

h = sigmoid(X*theta)
J = 1/m*(-y'*log(h)-(1-y)'*log(1-h))+lambda/2/m*(sum(theta.^2)-theta(1)*theta(1)) 
grad = X'*(h-y)/m + lambda/m*theta
grad(1) = grad(1) - lambda/m*theta(1)

J の参考:
ここに画像の説明を挿入
上記の行列の計算方法:
ここに画像の説明を挿入
y が mx1、yT が 1xm、h が mx1 であるため、Σ は省略されています。size() でそれらを出力するだけで、長さと幅がわかります。
最初に渡されたもの:

J = 1/m*(-y'*log(h)-(1-y)'*log(1-h))+lambda/2/m*sum(theta.^2)

プロンプトが表示され、操作せずに θ(1) に注意を払う必要があることを通知し、そのまま変更します。θ の添字は 0 ではなく 1 であり、エラーが再度報告されることに注意してください。
次に、卒業生のリファレンスがあります:ウェブサイト: 正則化線形回帰
ここに画像の説明を挿入
昨日書いたコードを振り返ってください:
ここに画像の説明を挿入
ひょうたんを見てください:

grad = X'*(h-y)/m + lambda/m*theta
grad(1) = grad(1) - lambda/m*theta(1)

添え字が 1 である場合、grad(1) を正規化する必要はなく、単に加算して減算するだけであることに注意してください。
これ以上簡潔な方法は思いつきませんが、少なくとも J と grad は行列の乗算を必要とせず、柔軟に行列の乗算を使用します。

完成、記念すべき最後のスクリーンショット:
ここに画像の説明を挿入


例3

1. 正則化ロジスティック回帰

h = sigmoid(X*theta);
J = 1/m*(-y'*log(h)-(1-y)'*log(1-h))+lambda/2/m*(sum(theta.^2)-theta(1)*theta(1)) ;
grad = X'*(h-y)/m + lambda/m*theta;
grad(1) = grad(1) - lambda/m*theta(1);

ex2を貼り付けて終了です……


2. 1 対すべての分類子トレーニングが
40 分間停止しました。このトピックは比較的長いため、fmincg はそれを使用しません (来るはずのトピックはまだ来ています)。

initial_theta = zeros(n + 1, 1);
options = optimset('GradObj','on','MaxIter',50);
for c = 1:num_labels
  %initial_theta = zeros(n + 1, 1); 没有加上但是还是过了
  k = fmincg(@(t)(lrCostFunction(t,X,(y==c),lambda)),initial_theta,options)
  k';
  all_theta(c,:) = k';
  all_theta;
endfor

ここに画像の説明を挿入
イテレーションは fmincg の実行回数、コストは損失関数です。最初はエラーかと思いました。

このトピックのアイデアは、num_labels 回実行し、x 回目に fmincg が最適なシータを与え、それを all_theta の x 行目に入れることです。指定されたシータは列ベクトルであるため、行内で転置する必要があります。 all_theta の。

要約すると、all_theta の x 番目の行は、x 番目に最適なシータを保存するために使用されます。このシータは、y が 1、2、3、および 4 (num_labels = 4 であるため)、x が 1 ~ 4 の場合に取得されます。

転置の便宜上、k を使用して列ベクトル theta を格納し、次に k を転置して、それを all_theta の行に割り当てます。つまり、パラメーター k が省略された場合は上記のコードになります。

initial_theta = zeros(n + 1, 1);
options = optimset('GradObj','on','MaxIter',50);
for c = 1:num_labels
  %initial_theta = zeros(n + 1, 1); 没有加上但是还是过了
  all_theta(c,:) = fmincg(@(t)(lrCostFunction(t,X,(y==c),lambda)),initial_theta,options)'; %最后加上转置" ' "
endfor

移調の問題は考慮されていなかったため、最初に書かれたのは次のとおりです。

for c = 1:num_labels
  all_theta(c) = fmincg(@(t)(lrCostFunction(t,X,(y==c),lambda)),all_theta(c),options)
endfor

間違いだらけとも言えますが、まず(c)はc行目ではなく、行列を列に並べた後のc行目、そしてall_thetaはinitial_thetaとなるはずです。さらに、注意していれば、initial_theta がトラバースされるたびにクリアされるわけではないことがわかりますが、この fmincg アルゴリズムは十分強力であり、theta はすべて 0 に設定されているため、問題ではありません。一番?

しかし、待ってください、initial_theta は本当に必要なのでしょうか? all_thetaも最初は各行0になっていませんか?したがって、別のパラメータinitial_thetaを保存できます。あなたがしなければならないのは、all_theta の行を取得し、それを少し転置して、initial_theta を置き換えることだけです。

options = optimset('GradObj','on','MaxIter',50);
for c = 1:num_labels
  all_theta(c,:) = fmincg(@(t)(lrCostFunction(t,X,(y==c),lambda)),all_theta(c,:)',options)';
endfor

すごい、最初に提出した正しいコードよりもはるかに無駄のないコードになったし、正しいコードになったヾ(≧∇≦*)ヾ



3. One-vs-All 分類子予測の古い方法では、size() を使用して all_theta と X の長さと幅を出力します。X は mx 3 次元、all_theta は num_labels x 3 次元 (4 x 3) であることがわかります。 max関数
ここに画像の説明を挿入
には 4 つのタイプがあります。 max(X) X の最大の要素を検索します。
max( X , [] , 1 ) X の各列の最大の要素を検索します。
max( X , [] , 2 ) 各列の最大の要素を検索します。 X の行
[ a , b ] = max (X)、 a は X の各列の最大要素、 b は X の各列の最大要素の添え字 max( X ,
Y ) は各列の最大要素X 行列と Y 行列の位置

主に求めているのは、thetaにXを掛けた後、グループ(行)ごとに、4種類のyのうちどれが最も確率が高いかを調べて取得し、それをpに対応する行に格納することです。次に、max 関数を使用して各列の最大の要素の添字を取得します。つまり、4 つのタイプがあるため、4 つの行を作成し、列はこれら 4 つのタイプに対応する確率になると想像します。 max 関数を使用すると、各列で最も確率が高いものの添え字を取得できます。したがって、この行列のサイズは 4 xm なので、all_theta * X' となります。それをまとめた後、最も高い確率で添字で構成される行ベクトルを取得し、それを p に転置します。

t = all_theta*X';
[a,b] = max(t);
p = b';

ちなみに、シグモイド活性化は追加されていません。θx は本質的に増加しており、シグモイドも同様に大きくなり、大きいほど大きくなるため、追加する必要はありません。


4. ニューラル ネットワークの予測関数は
、私が書いたときは少し雑でした。最終的な出力行列がわかりません。他の人のコードをちらっと見たところ、隠れ層が抜けていて 1 が追加されていました。入力層は覚えていて、隠れ層は忘れます。

X = [ones(m, 1) X];
z2 = sigmoid(X*Theta1');
size(z2);
a2 = [ones(m,1) z2];
a3 = a2*Theta2';
t = a3';
[a,b] = max(t);
p = b';

入力層の行列は mx 2 -> mx 3
隠れ層の入力行列は mx 3 * 3 x 4 = mx 4
隠れ層の出力行列は mx 4 -> mx 5
出力層の行列は mx 5 * 5 x 4 = mx 4
最終、mx 4 (または 4 xm) は、m 組の入力があり、4 組の出力 (確率) に対応することを意味します。さらに、他の人が書いたことを読んだ後、
[ a,b] = max(A,[ ], 2) このようなコケティッシュな演算は同様の意味を持ちますが、1 つは行ベクトル用で、もう 1 つは列ベクトル用です。

X = [ones(m, 1) X]
z2 = sigmoid(X*Theta1');
size(z2);
a2 = [ones(m,1) z2];
a3 = sigmoid(a2*Theta2');
[a,b] = max(a3,[],2);
p = b;

当然のことですが、それでも他の人のコードを見て、お互いの長所から学ぶ必要があります。

sigmod はすべてインクリメンタルなので最後に追加してもしなくても構いませんが、「確率」の意味があるのでやはり追加します。

つまずいてみましょう。完了後に見つけるのはそれほど難しくありません (すべての真実: 理解するのは難しくありません)。最後の日常的なスクリーンショットは次のことを記念しています。
ここに画像の説明を挿入


Ex4

フィードフォワードとコスト関数と正則化コスト関数は
、レビューのために長い間入力されておらず、不慣れで、長い間スタックしていました:
参考式:
ここに画像の説明を挿入

[hx,dummy] = predict(Theta1,Theta2,X);
Y = zeros(m,num_labels);
for i=1:m
  Y(i,y(i))=1;
endfor
t1 = log(hx).*Y + log(1-hx).*(1-Y);
sum_xita = sum(sum(Theta1(:,2:end).^2)) + sum(sum(Theta2(:,2:end).^2));
J = -1/m*sum(sum(t1)) + lambda/2/m*sum_xita;

% 不能够直接矩阵乘法,因为矩阵乘法的话,log(hx_k)和跟下一组y_k+1等乘在一起,是不对的
% 正确的理解应该是点乘,自己乘回自己,这里没有理解,卡了很久
% 然后theta点乘的时候,第一位是要省略不乘的,可以用语法简易截取

予測はファイル内で変更されます:
ここに画像の説明を挿入



次の式によるシグモイド勾配:

g = sigmoid(z).*(1-sigmoid(z));

シグモイド関数の導出の証明を見てください少し難しい


ニューラル ネットワーク勾配 (バックプロパゲーション) と正規化勾配は
折りたたまれて書かれており、他のものを参照して
、nnCostFunction の後に追加し続けます。

X = [ones(m,1) X];
for i=1:m
  a1 = X(i,:);  %1x3
  z2 = a1*Theta1'; %1x4
  a2 = [1 sigmoid(z2)];
  z3 = a2*Theta2';
  a3 = sigmoid(z3);
  deta3 = a3-Y(i,:); % 1 x 4
  deta3 = deta3'
  deta2 = Theta2(:,2:end)'*deta3.*sigmoidGradient(z2')
  size(z2)
  size(deta2)
  size(Theta2(:,2:end)')
  size(deta3)
  size(a2')
  Theta2_grad = Theta2_grad + deta3*a2; % 4 x 5
  Theta1_grad = Theta1_grad + deta2*a1; % 4 x 3
endfor
Theta1(:,1) = 0;
Theta2(:,1) = 0;
Theta1_grad = (Theta1_grad + lambda*Theta1)/m;
Theta2_grad = (Theta2_grad + lambda*Theta2)/m;

ナレッジリファレンス:
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
[詳しいプロセスの説明]
午後に私が踏んだ落とし穴についてお話します:

  1. a と z がそれぞれ何なのかわかりません。長い間取り組んでいたのですが、以前のメモを読んでいませんでした。PDF に次のことが含まれていることを今知りました。
  2. 次に、最初の層の入力層は x0 = 1 を追加する必要があります、へへ
  3. 小文字のデルタ (δ)、つまりθ T ∗ δ θ^T*δTδ、実際は関係ないと思ったので、δ T ∗ θ δ^T*θdTθ、フェイティアンの間違い
  4. 最終的な pdf では、D は △ と λθ の両方を m で割った値になる必要があります。

朝の 10 時から午後 5 時まで、私はあらゆる種類の落とし穴を踏みました。記念に言っておきます。ex4 が
ここに画像の説明を挿入
つまずいているので、フォーラムの質問を見る時間があります。


Ex5

正則化線形回帰コスト関数と正則化線形回帰勾配の
参考図:
ここに画像の説明を挿入
コメント部分をブレインストーミングして書きました。後で他の人の意見を読んで、x の i 乗を掛ける必要がないことがわかりました。しばらくすると、 x の上付き文字は、x の累乗ではなく、最初のいくつかの x を指します。
ここに画像の説明を挿入
次に、勾配 grad を計算します。
ここでの勾配は回帰と正則化を使用する必要があるためです。
Ex2 の質問ノートを振り返ってください: (この透かしを削除するのは少し難しいです)正則化線形回帰
ここに画像の説明を挿入
と青で囲まれた部分は grad で、これは J から θ への勾配です。
次に、完全なコードがあります。

h = zeros(m,1);
h = X*theta;
J = 1/2/m*(sum((h-y).^2))+lambda/2/m*sum(theta(2:end).^2)
grad = X'*(h-y)/m + lambda/m*theta
grad(1) = grad(1) - lambda/m*theta(1)

最初の θ には正則化が必要ないことに注意してください。


Learning Curve
の要件は、サンプル i の数が増加するにつれて相互検証の誤差とトレーニング テストの誤差を描画することです。そして、これら 2 つの絵を描きます。通常の状況は次のとおりです: (ここで N は i)
ここに画像の説明を挿入
ですが、非常に明白な問題が見つかりました。Octave を使用して絵を描くことができませんテストでなければ絵を描きますが、提出すると何度も繰り返し、描いた絵に問題が発生し、描いた絵は非常に汚くなります。
ちょっとめんどくさいし、インターネット上のチュートリアルはすべて matlab ですし、進みは少し急いでいますし、matlab を学びたくないので、試験後の夏休み後に見てみましょう。
コード: (最初は分かりませんでしたが、他の人の描いた絵を見てどうすればいいか分かりました(Nが大きくなるとエラー絵が2つになります))

for i = 1:m
  theta = trainLinearReg(X(1:i,:),y(1:i,:),lambda);
  error_val(i) = linearRegCostFunction(Xval,yval,theta,0);
  %theta = trainLinearReg(X,y,lambda)
  error_train(i) = linearRegCostFunction(X(1:i,:),y(1:i,:),theta,0);
endfor

多項式特徴マッピングは
X を計算し、[X(i) X(i).^2 X(i).^3 ... X(i).^p] になります。コード:

for i=1:size(X,1)
  for j=1:p
  X_poly(i,j) = X(i).^j; 
endfor

他の人の記事を読むと、行列のプロパティをより完全に活用できることがわかりました。

X 
for i=1:p
  X_poly(:,i) = X.^i; 
endfor
X_poly

ここに画像の説明を挿入
突然、プリントアウトが私が理解している = = と大きく異なることに気づきました。まあ、質問を真剣に検討せず、式を見て for ループを 2 つ設定しただけでしたが、それでも正しくできました。
ブログを投稿して matlab の画像を確認してください: https://blog.csdn.net/weixin_40807247/article/details/81359042
最終練習:
ここに画像の説明を挿入
PS: 今回はあまりうまくできなかったと思います = =、少し焦りました問題を読むのに失敗しました、少し考えた後、他の人のコードを見に行きました、悪くはありませんが、問題をよく読まなければなりません。


Ex6

ガウス カーネルは
ガウス カーネルの式を計算します:
ここに画像の説明を挿入
||u|| 計算方法: (u は 2 次元)
ここに画像の説明を挿入
u を x1 - x2 に置き換えます。正しいコード:

t = x1-x2;
sim = exp(-sum(t.^2)/(2*sigma^2))

エラーコード:

sim = exp(-(x1-x2).^2/(2*sigma^2))

明らかに公式を理解していませんでした。


データセット 3 のパラメーター (C、シグマ) は
唖然としましたが、友人がダウンロードするドキュメントがあると言っていたことを思い出しました: 「
ここに画像の説明を挿入
人生最悪。その中にスクリプトがあり、トピックを紹介する PDF があります (おそらく他のデータや何か)、最初にダウンロードするように求められたものの一部はそこにはありません。

ただ、蘇游さんは背景を紹介しても無駄だと言っていたので、「こちら」のファイルはずっと読んでいなかったので安心です。

今回の宿題は本当に耐えられなかったのですが、ダウンロードしたファイルを読んでみると、実は授業では取り上げなかった機能の使い方など、ヒントがたくさんあることが分かりました。

質問の意味は、最適な C とシグマ (分散 / σ) を見つけて、svmPredict を使用することです。実際、svmPredict を使用すると、svmTrain を使用する必要があることがわかり、その中の 4 番目のパラメーターが必要になります。 @啥哥と svmTrain のコードを参照する必要があります。コードを見ると、直接代入が (1,0) であるため、x1 と x2 を定義する必要がないことがわかります。授業で教わった内容とも一致しています。次に、PDF は C と sigma によって推奨されるパラメーターもプロンプトします。ダブルサイクルのブルート フォース検索で十分です。

vec_C = [0.01;0.03;0.1;0.3;1;3;10;30];
vec_sigma = [0.01;0.03;0.1;0.3;1;3;10;30];
%x1 = [1 2 1 5 9 8]; x2 = [0 4 -1 7 6 5]; 见有人定义了x1 x2
%x1 x2这里怎么定义没所谓,因为svmTrain中kernelFunction的用法是(1,0)
vec_errors = 10000000;
for i=1:length(vec_C)
  for j=1:length(vec_sigma)
    model= svmTrain(X, y, vec_C(i), @(x1, x2) gaussianKernel(x1, x2, vec_sigma(j)));
    pred = svmPredict(model,Xval);
    error = mean(double(pred~=yval));    
    if (error < vec_errors)
      a = i;
      b = j;
      vec_errors = error;
    endif
  endfor
endfor
C = vec_C(a); % 注意要记得赋值
sigma = vec_sigma(b);
vec_errors;
model = svmTrain(X,y,vec_C(i),@(x1, x2) gaussianKernel(x1, x2, vec_sigma(j)));
visualizeBoundaryLinear(X,y,model); % 看ex6.m知道的,可以用来看图


回線上の電子メール前処理暴力の比較:

    for i=1:size(vocabList)
      if (strcmp(str,vocabList(i,1)))
        word_indices = [word_indices;i];
        break;
      endif
    endfor

電子メールの特徴
は暴力と同じです。

for i = 1:size(word_indices)
  x(word_indices(i)) = 1;
endfor

今回は比較的簡単だと思います。おそらく PDF から読むことができます。自分で書く必要はありません。
ここに画像の説明を挿入


Ex7

最も近い重心の検索 (k 平均)
X の行から重心の行を引いたもの (重心 (μ) は X (バー) 内の点であるため) であるため、次元は同じであることに注意してください。
X(i) - 重心(j) の代わりに

m = size(X,1);
for i=1:m
  min = 1000000000;
  for j=1:K
    t = X(i,:) - centroids(j,:);
    s = sum(t.^2);
    if (s<min)
      min = s;
      idx(i) = j;
    endif
  endfor
endfor

Compute Centroid Means (k-Means) は
行列によって計算できます。検索があることは知っていますが、あまり詳しくありません。後で、for を使用しました。他の人の投稿を読んで、次の変更を加えました。

%自己写的:
##for i=1:K
##  cnt = 0;
##  for j=1:m
##    if (idx(j)==i)
##      centroids(i,:) += X(j,:);    
##      cnt++;
##    endif
##  endfor
##  centroids(i,:) /= cnt;
##endfor

%别人用了find的,进行更改:
for i=1:K
  t = find(idx==i);
  centroids(i,:) = sum(X(t,:))/length(t);
endfor

K-means は画像圧縮に使用されます。
これまでのところ、スクリプト ex7 を実行します。
ここに画像の説明を挿入
これは非常に興味深いものです。

pdf で画像圧縮に関するものを見ました。これは、K 色 (16 色など) を設定して、K 平均法を実行するというものです。
まず、以下を含む kMeansInitCentroids を作成します。

% randidx存的是大小为X的行数的,然后把用X(randidx(1:K),:)分出打乱后的前K行
randidx = randperm(size(X,1)); % Randomly reorder the indices of examples
centroids = X(randidx(1:K),:); % Take the first K examples as centroids

randpermの使用テストは以下の通りです。
ここに画像の説明を挿入
変数を使用してベクトルを保存し、別の行列を使用して行をこのベクトルに関連付けます。このメソッド/プロセスは C で記述すると少し複雑ですが、ここでは完全に機能します (Python もこの方法で記述できると思います)短いですがまとめてくれます 自分の考えも理解してくれるのでとても便利です。

次に、コマンド ウィンドウで次のスクリプトを実行します。
ここに画像の説明を挿入
K = 16 の場合:
ここに画像の説明を挿入
スクリプトを変更します。 K = 8:
ここに画像の説明を挿入
K = 1:
ここに画像の説明を挿入
K = 1024:
ここに画像の説明を挿入


PCA

ここに画像の説明を挿入

画像から始めて、コードの編集がすべてです。

sigma = X'*X/m;
[U,S,X] = svd(sigma);

プロジェクトデータ(PCA)

U = U(:,1:K);
Z = X*U; %懒得纸上算了,长宽瞎搞

データの回復 (PCA)

X_rec = Z*U(:,1:K)'; % 看回projectData

プログラミング演習もまた 1 つ終わりました。
ここに画像の説明を挿入


Ex8

ガウスパラメータの推定

ここに画像の説明を挿入

mu = mean(X)';
t = mu'.*ones(m,n);
sigma2 = sum( (X-t).^2 )'/m;


ここに画像の説明を挿入
他の人のコードを読むためにfor を使いたくないので、 t は行列を展開するために使用されます。

X
mu = mean(X)
size(mu)
size(X)
sigma2=sum((X - mu) .^ 2)/m;

うーん、使い切るのは正しいです。
発見 - 乗算と同じで、水平方向の乗算を垂直方向にたどります。私はまだコードに慣れていません = =
ここに画像の説明を挿入


「Select Threshold」
と入力するだけです。<epsilon が 1 であることに注意してください。

    pval;
    yval;
    fp = sum((pval<epsilon)&(yval==0));
    tp = sum((pval<epsilon)&(yval==1));
    fn = sum((pval>=epsilon)&(yval==1));

    prec = tp/(tp+fp);
    rec = tp/(tp+fn);

    F1 = 2*prec*rec/(prec+rec);

ここに画像の説明を挿入
ここに画像の説明を挿入


協調フィルタリングのコストと協調フィルタリングの勾配には、
正規化されたコストと勾配がありません。

% without regularization 
% version 1.0
J = sum(sum((X*Theta'-Y).^2.*R))/2;
for j=1:size(R,2)
  for i=1:size(R,1)
    if (R(i,j)==1)
      [i,j];
      X_grad(i,:) += (X(i,:)*Theta(j,:)'-Y(i,j))*Theta(j,:);
      Theta_grad(j,:) += (X(i,:)*Theta(j,:)'-Y(i,j))*X(i,:);
    endif
  endfor
endfor

J の参考:
ここに画像の説明を挿入ここに画像の説明を挿入
ここに画像の説明を挿入
Y は nm * nu サイズの行列であるため、X と Theta の位置を変更する必要があります。ここではX ∗ T heta TX*Theta^Tとなります。バツテア_ _ _ _次に、 T は
R を使用して、特定の行 i と列 j の位置が有効かどうかを判断します。1 は有効、0 は無効であるため、内積となります。
最後に、J は数値であるため、2 つの合計を使用してベクトルを合計します。

グラデーションのリファレンス:
ここに画像の説明を挿入
サポートされている PDF のプロンプトをちらっと見て、for ループを使用するように言われましたが、書き出すことができませんでした... 最後に
、私は今でも行列の意味について注意深く考えています: (もちろん、X とX_gradは同じ意味(勾配の関係なので)、Thetaも同じ)
X行列:各行は映画(num_movies)を表し(下図ではx1 x2)、各列は特徴(num_features)を表します(次数)ロマンスとアクションの) シータ行列: 各行は
ユーザー (num_users) (Alice Bob Carol Dave) を表し、各列は特徴 (num_features) を表します (ロマンスとアクションの 2 つのタイプの愛)。図でより明確にわかります
。注: 図のシータ行列はユーザ​​ーの列であり、各行は特徴を示します。最初の行 0 は表示されない X0 と乗算するためのものであり、無視できます)。その後、定義を振り返って
ここに画像の説明を挿入
ください
ここに画像の説明を挿入
。先ほどの行列と上記の式を組み合わせると、X_grad は実際には行ごとに更新され、(Theta の行 j の転置) と (X の行 i) の乗算になります。注: ここで出てくるものは行列ではなく数値です。次に、それを Theta の j 番目の行と掛け合わせます。答えを合計することを忘れないでください。i 番目の行 (i 番目の映画) には、異なるスコア (列/特徴) があるためです。毎回 2 つのループがあります。 i 行目のみ j 列のデータなので、結果を累積する必要があります。
Theta_grad も同じです。ここで R ( i , j ) は「i 番目の映画が j 番目のユーザーによって評価された場合」を意味するため、Theta_grad の場合、更新は行 j であり、X_grad は i OK です。

ふと、PDFの次のページにヒントがあることに気づきました。j:r(i,j)=1 を見つける方法について話します。
ここに画像の説明を挿入
ひょうたんに従って、新しいコードを描きます。

% without regularization 
% version 2.0
J = sum(sum((X*Theta'-Y).^2.*R))/2;
for i=1:size(R,1)
  idx = find(R(i,:)==1); % 即找出符合的 j; 
  X_grad(i,:) += (X(i,:)*Theta(idx,:)'-Y(i,idx))*Theta(idx,:);
endfor

for j=1:size(R,2)
  idx = find(R(:,j)==1); % 即找出符合的 i
  Theta_grad(j,:) += (X(idx,:)*Theta(j,:)'-Y(idx,j))'*X(idx,:);
endfor

最終的な Theta_grad 計算式では、-Y の結果を転置する必要があることに注意してください。転置しないと、エラーが報告されます。
ここに画像の説明を挿入
書き込み後、ex8_cofi を実行し、画像を取得します。
ここに画像の説明を挿入
それが何なのかわかりません...
正規化コスト& Regularized Gradient
ここに正則化を追加します。次に、前のものに基づいて少し変更を加えます。
参照する:
ここに画像の説明を挿入
ここに画像の説明を挿入

% with regularization

J = sum(sum((X*Theta'-Y).^2.*R))/2 + lambda/2*sum(sum(Theta.^2))+ lambda/2*sum(sum(X.^2));
for i=1:size(R,1)
  idx = find(R(i,:)==1); % 即找出符合的 j; 
  X_grad(i,:) += (X(i,:)*Theta(idx,:)'-Y(i,idx))*Theta(idx,:)+lambda*X(i,:);
endfor

for j=1:size(R,2)
  idx = find(R(:,j)==1); % 即找出符合的 i
  Theta_grad(j,:) += (X(idx,:)*Theta(j,:)'-Y(idx,j))'*X(idx,:)+lambda*Theta(j,:);
endfor

しかし、初めてタイムアウトになる場合は、理由がわかりません。もう一度送信するだけです。
ここに画像の説明を挿入
最後に ex8_cofi を実行します。奇妙に感じます。スコアは 5.0 ですが、すべての質問は再度合格しました。最後の
ここに画像の説明を挿入
プログラミングの宿題は終わりました。
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/Only_Wolfy/article/details/89893734