Pythonを勉強してみる人の日記

仕事に元気を奪われながらなんとか続けてみたいと思う限り

Python9日目 手書き数字の予想プログラムを解読する難解な回。

こんばんは!金曜日です、お勉強し放題で嬉しい…

 

Python9日目、始めていきます。

昨日書いたコードの解読からです。

昨日の内容は

太いペンで「2」を書いて画像を保存

画像データを読み込んで、0(白)~16(黒)の数字が8×8に並んだ配列に変換する

変換したデータを使って何の数字を書いたのか当てさせる

というモノでした。

1行目から解読していきます。

 

・ファイルを開く:open(変数名)

・モノクロにする:convert("L")

・サイズを8×8ピクセルにする:resize(8,8)

までは分かりました。

 

次から早速全然分かりません。

急に難解

numpy.asarray(・・・)とは…

調べてみると、「Numpyのarrayとasarrayの違い」という記事が上からいくつかヒットしました。

私は違いの前にこれが何をしてくれるものなのか知りたいのに…世界がハイレベル…

 

1つずつ解読していきます。

・numpy:ライブラリの名前

(asarray の前に、arrayの訳→配列)

・asarray:配列っぽいものを配列にしてくれる

・float:浮動小数点数(え?)

いやいや…

まず日本語が分かりません…

 

浮動小数点数とは。

全く分からないので以下のサイトを見に行ってみました。

【C言語入門】浮動小数点数(double・float)の使い方 | 侍エンジニアブログ (sejuku.net)

まだ分からん。そもそも説明に使われている単語が分かりません。

仕方がないので単語を全部調べていきます。泣

 

浮動小数点変数:

 数字を「符号」「基数(きすう)」「仮数(かすう)」「指数」の4つで表したもの。

・固定小数点変数:
 2進数なら「(数字4つ).(数字4つ)」で数字を表す。

 

難しいですね…挫折する人が多いのもわかる。

これ独学でやり切っちゃう人はとんでもないです。

でもまぁ、何となくできるまでやってみたらできちゃった系の女なので踏ん張ります。

ド根性・努力・未来・A BEAUTIFUL STAR。(別に世代ではないです。ハロプロは好き)

 

・基数:1つの桁に入る数字の種類の個数。
    2進数なら0と1で2、10進数なら0~9で10、ということらしい。

 

そろそろ本気で行き詰ってきて「浮動小数点変数」が全く分からず、こちらのサイトを見に行ってみました。お邪魔します…

株式会社K-fix

 

どうやら、

10進数の-0.02402なら(今日の年月にしてみた)

-0.02402= - 0.2402×10^-1 としたときの

-:符号

2402:仮数

10:基数(10進数だから)

-1:指数

ということみたいです。ふむふむ。

 

そして2進数をこの形式で表すときは「10」がいる場所に「2」が入るようです。

10進数なら10倍になると小数点が1つ右にずれるみたいに、

2進数なら2倍になると小数点が1つ右にずれる。×2^n で表すらしいです。

全部初耳だから「らしい」としか言えない。笑

 

理解できたし「そもそもこれって分からないといけないのかな?」という思いも湧いてきたので、そろそろ本筋に戻ります。

そして一旦、float型のことは「なんだか分からないが『小数も表せる数』らしい」という感じで認識しておきます。

 

もう分からなかったコードがはるか昔のように思えてきたので再掲。

久しぶり!

画像の2行目は「grayImage」という変数を「float型で」「配列に(asarray)」してね。
という意味のようです。

 

そして3行目。floorがまた分からないので調べます。

・floor:小数点以下を切り捨て

ちなみにfloor変数はExcelにも存在していて、

「FLOOR(数値,基準値)」とすると「数値を」「基準値の倍数に最も近い数字になるように」切り捨て。という意味になるようです。

なるほど。floorは理解できました。

 

続き。数式は分かるけれどなぜ256で割るのか?

256は2^8なので、8ビットのなにがしかを扱うためと思われます。

多分「dtype=float」のところで8ビットの数字が作られたんでしょう。多分。知らんけど。

 

本によると、256で割ってちょっといじくる前は255(一番濃い黒)~0(一番明るい白)の濃淡を表すリストになっているそうです。

例えば

numImage[x]=256→一番濃い黒 のとき、

16-16*(numImage/256)=16-16*(256/256)=16-16*1=0 →一番暗い黒

になります。変換してる感じなんですね。

この変換式を自力で考えろと言われたらなかなかに至難の業な気がするのですが…

考えるとかじゃないんでしょうか。

公式的な、底辺×高さ÷2的な。

まぁ、先々勉強を進めていけばいつか分かることでしょう…

 

ちょっとわき道に逸れます。(2回目)

Python関連のサイトを検索してみると、高頻度で[ ]で囲まれた場所に0が入っているのです。

これは何の0なんだろう…ということで、調べます。数分ぶりn回目。

リストの頭から何個目かで、1個目に0が附番されてるってことなのかな~と思ったら正解でした。パチパチ

aaa_list=[9,8,7](9,8,7というリストを作る)

aaa_list[0]=9(aaa_listの最初の値を返す)

また一つ勉強が進みました。

わき道から戻ります。

 

3回目の登場

3行目は255(真っ黒)~0(真っ白)を0(真っ白)~16(真っ黒)に直すという話でした。

4行目はきっとflattenというくらいだからフラットにするんでしょう。つるっと。

急に簡単だからもうテキトーです。

 

ここまでが、手書きの数字を8×8の配列に直すパート。

こんなに登ったのにまだn合目ですか…?あと何時間登るんですか…?という気持ちです。

富士山の何合目が低くて最大で何合目まであるのか分からないので例が適当ですみません。(調べるやる気はない)

 

そしてここから、数字を当ててくれた関数の解読をしていきます。

1行目。

もう本当に分からないので単語1個ずつ調べます。

こうなったらヤケクソです。

 

・sklearn:機械学習ライブラリ

ロゴカワイイ

・datasets:データセット。sklearnにあるらしい。

・digits():データセットのうち手書きの数字のやつ。

svmsupport vector machine。なんかわからないけれど最適化問題を解いてくれるやつ。と受け取った。アルゴリズムの1つだそうです。
↓参考
[Python]サポートベクトルマシン(SVM)の理論と実装を徹底解説してみた #Python - Qiita

 

あとSVCsvmとgammaが分かれば、全部分かりそうです。

今日の急成長ぶりがすさまじいです。文字数もすさまじいです。

 

余りにも眠く限界が来たので本日はここまでで寝ることにします。

こちらの3つは明日かどこかで調べてまた更新します。

 

おやすみなさい…

 

追伸

最近猫ミームにハマっています。

大っ嫌いな前の上司の悪口を書きたいが、身バレするので我慢

 

 

2024/2/12更新。「きっとこういうことだろう」が大いに混ざっているので、読んでくれる人が誤解しないよう願います💧

=========================================================

SVC:クラスの1つ。

クラスが分からなかったので調べました。分からないことだらけです。

↓こちらのブログにお邪魔します。

【完全版】Pythonクラスとは?使い方までをわかりやすく解説 (itc.tokyo)

 

・クラス:どうやら、メソッド(関数ではないらしい)を色々まとめておけるもの。

class ●●●():
 def A~~~
 def B~~~

としておいて、

「●●●.A」と書くとAのほうの処理

「●●●.B」と書くとBのほうの処理をしてくれるらしい。

言葉の意味を知っておかないと解説が分からず困ることが多いですね。

 

メソッドという言葉が出てきて「メソッドと関数は何が違うのだ」というぎもんがわきましたので、また調べます。

・関数:単独で呼び出すもの

・メソッド:単独ではなく、「.A」などをつけて呼び出すもの

分かるような分からないような…

ただ、メソッドの「これ」使ってね、と指示をしないと動いてくれないのは何となく上記の理屈で理解できたのでいったん良しとします。

 

そして、モジュールの関数も「.」をつけて呼び出すようです...

複雑。

sklearn.svm.SVC(gamma=0.001)

なら、

sklearn:モジュール

svm:モジュールの中のアルゴリズム

SVC:その中のクラス??

合っているのでしょうか…

 

・gamma:最適化問題を解いてくれる関数を構成する定数(だと思われる)

 

分からなかったことを全て調べ終わりました!!すごい!

関数、メソッド、クラスという概念を理解できたので大進歩です。

そして「.」の意味もおぼろげに分かり始めています。

明日から4日間、生きながらえるとしましょう...

 

おやすみなさい。