python機械学習プログラミング(197ページ)
197ページのプログラムについてです。
import numpy as np
np.argmax(np.bincount([0, 0, 1], weights=[0.2, 0.2, 0.6]))
np.bincount関数が何を意味するかさっぱり分からず、さらに、argmax関数も何を返してくれるのかを勘違いするという。。。
自分なりの理解
np.bincount([0, 0, 1], weights=[0.2, 0.2, 0.6])
bincount関数の意味が出てきた数字の個数を数えるという者みたいです。
つまり
>>> y1 = [10,9,8,7,6,5,4,3,2,1] >>> np.bincount(y1) array([0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], dtype=int64) これは、y1の配列の各数字の個数を数えているという事です。 0は0個、1~10は1個ずつ。なので、 array([0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], dtype=int64) という結果が出ているという事です。 >>> y2 = [2,2,2,2,2,2,2,2,2,2] >>> np.bincount(y2) array([ 0, 0, 10], dtype=int64) >>> の場合、y2は2が10個あります。 なので、0が0個、1が0個、2が10個という事で array([ 0, 0, 10], dtype=int64) となっているという事ですね。
では197ページのプログラムに戻ります。
np.argmax(np.bincount([0, 0, 1], weights=[0.2, 0.2, 0.6]))
np.bincount([0, 0, 1])
を考えます。
これは先ほどの例で考えると0が2個、1が1個となります。
そこでこの答えは
>>> np.bincount([0, 0, 1]) array([2, 1], dtype=int64)
という事で0が2個、1が1個と予想通りになりました。
ここに、重み(weights=[0.2, 0.2, 0.6])が入るとどうなるか。
この場合は
np.bincount([0, 0, 1])
の最初の0に0.2の重みを、2番目の0に0.2の重みを、3番目の1に0.6の重みをつけて計算するわけです。
なので、0が0.2個+0.2個、1が0.6個という感じで、計算されます。
なので、以下のような実行結果になるというわけです。
>>> np.bincount([0, 0, 1], weights=[0.2, 0.2, 0.6]) array([0.4, 0.6])
とりあえずbincountのみ自分はこう理解しました。間違っていたらすいません。
python機械学習プログラミング(224ページ)
飛ばしまくって224ページまで来ました。
8章で機械学習の適用を通して実際にどのように機械学習を利用するか確認しようと思い、途中の理解が中途半端な状態ですが、8章に来ました。
ここでもプログラミングですが、本当に基本的なところで躓いてます。
for s in ('test', 'train'):
こんなforの使い方知りませんでした。
自分なりの理解
以下のプログラムで試してみました
for i in ("list","sec","yama","matu","homa","5"): print("word : %s" % (i)) 結果 word : list word : sec word : yama word : matu word : homa word : 5
python機械学習プログラミング(126ページ)
固有値、固有ベクトル、共分散行列がよくわからなかったが、このサイトを読んだらなんとなくわかった。
blog.aidemy.net
python機械学習プログラミング(123ページ)
主成分分析でこれ以上にないほどわかりやすい説明を見つけました!!!
python機械学習プログラミング(51ページ)
さて、51ページの前半のプログラムでわからないことが出てきました。
print('Misclassified samples: %d' % (y_test != y_pred).sum())
についてですが、前後の文脈から誤分類の個数を数えているようです。
でも、(y_test != y_pred).sum()で誤分類が数えられるのでしょうか?
【今のところの理解】
確かめてみました。
b = 10 a = 12 print(a != b) 実行結果 >>> b = 10 >>> a = 12 >>> print(a != b) True >>> print((a != b).sum()) Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'bool' object has no attribute 'sum'
エラーが出ました。どうやら、"True"は数えられないよ!!
という事ですよねぇ。
もしかして、配列だったらうまくいくのかも??という事で、配列で確かめてみました。
>>> demo = np.arange(10).reshape(5,2) >>> demo1 = np.arange(10).reshape(5,2) >>> print("error : %d" % (demo == demo1).sum()) error : 10
上手くいきましたね。
どうやら、配列で正誤を確認して、その個数を数えてくれるみたいです。
なるほどぉ!!
読んでも理解できない時でも読んでみる
昨日はじっくり読む時間が出来たので、ひたすら読んでました。
3章を読んでいくうちに数式が分からなくなって、読み飛ばしていっていたらだんだんすべてが分からなくなってきて、一通りざっとは読んだものの。。。
ただ、救いなのは勉強を始めたころにも一度読み飛ばしていったのですが、その時よりもすこーしだけ理解できる箇所が増えていました。
これからもじっくり読んで理解しようと思います。
【今のところの理解】
3章はいろいろな種類のアルゴリズムが紹介されているので、アルゴリズムの詳細まで理解するのではなくpythonでの実際の使用方法などを通してアルゴリズムの概要を理解する事が目標なのかな?
と理解しました。
少しづつ頑張ります!!!
python機械学習プログラミング(44ページ)
44ページを見ていてふと疑問に思ったことが出てきました。
44ページの上部なんですが、
self.w_[1:] = += self.eta * xi.dot(error)
とあります。
dotってnumpyじゃなかったっけ?
np.dotしか見たことがないんですが、、、
【今のところの自分なりの理解】
import numpy as np a = np.arange(10).reshape(5,2) at = a.T aTdota = a.T.dot(a) print("a.T.dot(a)") print(aTdota) dotata = np.dot(at,a) print("npdot(at,a)") print(dotata) """ a.T.dot(a) [[120 140] [140 165]] dot(at,a) [[120 140] [140 165]] """
このことから
xi.dot(error)
と
np.dot(xi,error)
は同じみたいです。