完全素人からAI技術者を目指します

AIが面白そうなので勉強してます。

全探索をPythonで実装してみた

At Corderに向けたお勉強のアウトプットです。
Pythonで書いていますので、良ければご覧ください。

線形探索法

ここでは「与えられたデータの中から特定のものを探す」方法を扱います。
1重ループなので計算量はO(N)です。

flagを使った方法

リストの中から条件に合致するものがあるか、1つずつ確認していく手法です。
flagを最初Falseに設定しておいて、条件に合致するものがあればTrueに置き換え、ループをbreakします。
flagはbool変数なので、そのままif文の条件分岐に使えます。

N = 5
list = [5,2,4,7,9]
value = 4
flag = False

for i in range(N):
    if list[i] == value:
        flag = True
        break

if flag:
    print("Yes")
else:
    print("No")

条件を満たすものの場所を調べる

条件を満たすものがリストの何番目にあるか調べたいときは、if文の中でiを記憶させます。
下記ではidという変数を定義し、初期値としてiの取りえない値:-1を入れておきます。
線形探索が終わった時点でid==-1であった場合、条件を満たすものがなかったことが分かります。

N = 5
list = [5,2,4,7,9]
value = 4
id = -1

for i in range(N):
    if list[i] == value:
        id = i
        break

if id ==-1:
    print("nothing")
else:
    print(id)

最小値を求める

リストの最小値を求めたい場合は、if文の中で値を更新させます。
ここではmin_valueという値を定義し、min_valueよりも小さなlist[i]が来たら値を更新します。
min_valueの初期値はlist内の値が取りうる最大値を設定しておきます。

N = 5
list = [5,2,4,7,9]
min_value = 999999999999

for i in range(N):
    if list[i] < min_value:
        min_value = list[i]

print("最小値:",min_value)

ペアの全探索

次のような問題には2重ループが使えます。このときの計算量はO(N^2)です。
・最適なペアを探索する
・2組のデータからそれぞれ要素を抜き出す方法を最適化する

最適なペアを探索する

ここでは具体例として、2つのリストから取り出した値の和が最小値となる組み合わせを求めます。
出力するのは最小値をとるリストa,bの値と最小値です。
今回もmin_valueを更新する方式を用います。
尚、リストの長さはいずれもNであるとします。
ここでは扱いませんが、二分探索を使えば計算量をO(NlogN)に抑えて計算できます。

N=5
a = [5,2,4,7,9]
b = [4,7,2,10,11]
min_value = 999999999999

for i in range(N):
    for j in range(N):
        if a[i]+b[j] < min_value:
            min_value = a[i]+b[j]
            a_min = a[i]
            b_min = b[j]

print("最小値:{} (a = {}, b ={})".format(min_value, a_min, b_min))

組み合わせの全探索(bit全探索)

応用編です。理解が難しいかもしれませんが、雰囲気だけでもつかめたら幸いです。

2進法を使った組み合わせの考え方

例として、[a1,a2,a3]のうち和が10となる組み合わせの数を考えます。
まず、すべての組み合わせの数を考えると、選ぶ、選ばないの2択を3回繰り返すため、2**3=8となります。
このとき、選ぶを1、選ばないを0とすれば、すべての組み合わせは2進法で整理できます。
例えば、[a1,a3]のみを選ぶ場合、101なります。詳しくは次の表をご覧ください。

10進法表記 組み合わせ 2進法表記
0 [] 000
1 [a1] 100
2 [a2] 010
3 [a3] 001
4 [a1,a2] 110
5 [a1,a3] 101
6 [a2,a3] 011
7 [a1,a2,a3] 111

2進法を使った全探索とPythonコードの考え方

全探索ですので、すべての組み合わせの和を考えて、条件に合う(=10)組み合わせの数を数えます。
2進数は組み合わせ全パターンを考えるときに使います。
組み合わせの数を2進数に変換し、対応する桁が1の場合にその要素を足し合わせることで計算できます。
上記をコードで表現すると、(i >> j )&1です。
iを2進数表記でj桁右にシフトして下1桁が1なら1(True), 0なら0(False)を返します。
例えばi=5, j=1としたときを考えてみます。
5を2進数表記すると101で、この桁を1つずつ右にずらすと10になります。(1の位は切り捨て)
1桁目が0になるので、この操作ではsumに追加されないことになります。

pythonコード

上記をpythonコードにすると、下記のようになります。
リストaに対し、和が10となる組み合わせを出力しています。
このとき、[3,7]、[4,6]が条件を満たすので、2(通り)が出力されます。

a=[3,7,4,6]
n=len(a)
ans=0
for i in range(2**n):
    sum=0
    for j in range(n):
        if (i >> j)&1:
            sum += a[j]
    if sum==10:
        ans += 1
print(ans)

まとめ

全てのアルゴリズムの基本となる全探索をpythonで実装してみました。
やはりpythonは教本(C言語)と比べても短いコードで実装できて便利だと感じました。
これらをマスターしたらAt CoderのC問題くらいは解けるらしいです。
初心者の方の参考になれば幸いです。

専門実践教育訓練給付金を申請してみた

こんにちは、puyockyです。ご覧いただきありがとうございます。

E資格取得に向け、専門実践教育給付金を申請しましたのでまとめます。給付金申請を検討されている方の参考になればうれしいです。

 

専門実践教育給付金とは

専門実践教育給付金は、厚生労働省教育訓練給付制度の対象の一つです。指定された講座を受講する際に、最大で受講費用の70%を補助してもらえます。今回、私は約30万円の講座を受講しますので、21万円補助してもらえます。これは大きいですよね。

教育訓練給付制度はデジタル関係のみではなく、大学院や専門学校の過程、業務独占資格(保育士、大型免許など)のような幅広い分野を対象としています。給付条件などの詳しい内容は厚生労働省のサイトをご覧ください。

www.mhlw.go.jp

 

申請の流れ

申請の流れをまとめていきます。何度もハローワークに行かなければいけないので、結構めんどくさいです。必要なものも一緒に記載するので、忘れ物チェックの参考にしてください。漏れがあったら教えてください。

ちなみに受講開始の1カ月前までに申請する必要があるので、早めに申請しましょう。

①支給要件の照会(要:印鑑、身分証明証)

まず、ハローワークで支給要件の照会を行います。事前確認として「いつから受講できるか」と「指定番号」が必要です。事前に受講先に確認しておきましょう。指定番号は前述した厚生労働省のサイトからも確認できます。必要なものは、印鑑と免許証です。

②キャリアコンサルティングの予約

申請前にキャリアコンサルティングを受ける必要があります。私の場合、事前予約制でした。(しかも電話でしか受け付けないという前時代ぶり。)

①の確認の際に、キャリアコンサルティングについても一緒に確認しておきましょう。

③ジョブカードの作成

キャリアコンサルティングに先立ち、ジョブカードというものを作る必要があります。履歴書と職務経歴書みたいな内容のものですが、申請の必要書類として必要です。ジョブカードの内容をもとにコンサルタントと面談し、コンサルタントに内容追記してもらってジョブカードが完成しますので、事前作成が必須です。ジョブカードの詳細は次のサイトをご参考ください。ちなみに結構めんどくさいです。

jobcard.mhlw.go.jp

④キャリアコンサルティング(要:ジョブカード)

ハローワークで、事前作成したジョブカードの内容をもとに、キャリアコンサルタントと面談します。学生時代のことや仕事上のこと、これからのことなどを聞かれました。これ何の意味があるの?と聞いてみたところ、やりたいことの方向性を見つける機会をつくるためとのことです。教育訓練給付の場合、講座決めてる時点でやりたいことも決まってるような気がするんだけどなあ。ちなみに面談は1.5時間くらいかかります。

教育訓練給付金及び教育訓練支援給付金受給資格確認票の提出(要:マイナンバーカード(なければ写真2枚)、通帳、印鑑、ジョブカード)

完成したジョブカードをハローワークの窓口に持っていき、確認票を作成、提出します。コンサルタントとの面談と同じ日に済ませてしまいましょう。

⑥受給資格者証の受け取り(要:マイナンバーカード)

しばらく(10日くらい)してハローワークから連絡がきたら、資格者証をハローワークに取りに行きます。これも全部本人じゃないとダメらしいです。なんで代理じゃだめなんだろうね。

⑦受講終了後、支給申請(要:受給資格者証、支給申請書、修了証明書、領収書、返還金明細書、マイナンバーカード)

受講終了後、講座から発行されたいろいろな書類をもって、ハローワークに行って支給申請します。これで手続き完了となります。

 

非常に面倒ですが、もらえる額も大きいので、ぜひ活用してください!

AI技術者への第一歩としてE資格を目標とした理由

ほとんどゼロの状態からAI技術者を目指すと決め、最初の目標を「E資格の取得」としました。

この経緯を記します。

私の現在地

Pythonを勉強し始めて半年ほど、業務でPythonを使い始めて2週間くらいです。主に100本ノックシリーズ(リンク)で勉強しており、機械学習などもなんとなく実装できますが、原理がわからないため不安を抱えつつ使っています。今回、原理から学びなおしたいと思い、E資格取得を検討しました。

E資格とは

E資格は2018年から始まった比較的新しい資格で、日本ディープラーニング協会(JDLA)が認定しています。JDLAが認定する資格にG検定というものがありますが、G検定が一般(Generalist)向けで、E資格はエンジニア(Engineer)向けです。そのためG検定よりも深い知識と実装能力などが求められます。(JDLAリンク

E資格を受験するには、過去2年間にJDLA認定講座を修了する必要があります。この費用が大きく、5~80万円の費用負担があります。内容も様々で、すでに実務経験が豊富な方向けは必要最低限の内容で安価ですが、私のような初心者向けの講習は15万円以上必要です。

E資格を目標とした理由

①AI技術の原理から勉強できそうだから

E資格を学んだレビューの多くに、「これまでAIをなんとなく実装していたが、原理に基づいた実装が可能となった」というものがありました。ここはまさに私の学びたいポイントでした。Pythonを使うとライブラリが豊富過ぎて、コードさえ学べば手軽にAIを実装できてしまいます。手法選択はR2やRMSEなどの指標でいくつかのアルゴリズムを比較し、適当に選んでいます。しかし本来であれば指標に頼らず、アルゴリズムごとに特色があり、それに基づいた手法選択をするべきです。まずはこれに取り組みたいと思い、内容がシラバスとしてまとめてあったのがE資格でした。

補助金がある講習があったから

初心者がAI技術を原理から学びたいと考えたとき、講習を受けることは必須と感じています。私はまず書籍で勉強しましたが、数学など理解しきれないところが多々あり、独学の限界を感じていました。

E資格は講習が必須であり、一部講習は教育訓練給付金で最大70%が補助されます。私が受講を決めたAidemyの講習は数学知識などの内容も含む初心者向きで、費用は327,800円ですが、70%還元で約10万円で受講できます。イチから勉強したかった自分としては渡りに船だと感じました。

③資格取得者の情報交換会があったから

AIに興味を持って勉強中ですが、私の周りには同士がいません。これから勉強するうえで、モチベーションの維持が課題だと感じていました。そのなかで情報共有などができる情報交換会は魅力的に感じました。JDLAもこれから力を入れたいとコメントしており、よい刺激をもらえそうだと考えました。

今後の更新について

現在講習を申し込んだばかりです。まずはハローワークでの補助金手続きや独学内容をまとめつつ、講習で学んだ内容をまとめていきたいと考えています。よろしければご覧いただければ幸いです。

子供に残すお金について

最近、"DIE WITH ZERO"という本を読みました。

この本では、"思い出を最大化できるような人生にしよう"という素敵な主張をされているのですが、その中で、子供に受け継ぐお金についての記載がありました。

その内容と、お風呂で自分なりに考えた内容をまとめていきます。

死んでから相続では遅い

"DIE WITH ZERO"では、死んでから大金を相続しても遅いと主張されています。

なぜなら、多くの人にとってお金が足りないのは若い時だからです。

若いうちは体力があるのでたくさんのことにチャレンジできますが、収入が少ないのでチャレンジの内容が絞られてしまいます。したがって、若いうちのネックは金銭面です。

一方年を取ると体力が衰えますが、収入は増える傾向にあります。したがって、思い出を作るネックは体力面になります。

つまり、お金に困るのは若いうちということです。

現在、平均寿命は80歳くらいなので、30歳で子供を産んだとすると、相続するのは50歳になってからです。

体力が衰える前にお金が欲しいというのは納得できますね。

25-34歳にお金を渡すべき

"DIE WITH ZERO"では、子供が25-34歳のうちにお金を渡すべきと主張しています。

確かに、このくらいの年齢は結婚、出産などがあって出費がかさむ一方で、収入が追いつかないですよね。

私も今アラサーですが、結婚した時に親から援助をもらったときはとてもありがたかったです。

今も節約しながらやりくりしてますが、欲を言えばもっと遊びたい。

若い世代の目線でいうと、賛成できる内容です。

自分たちの老後資金は大丈夫なのか

しかし、25-34歳でお金を渡すとすると、自分が50-60代くらいでお金を渡すことになります。

いやいや、老後資金大丈夫?と不安になりますよね。

ここで考えるべきは、いくら渡すかということです。

ライフイベントをベースに考えると、お金がかかるのは結婚式と新婚旅行、新居の準備かなと思います。

実体験をベースに考えると、だいたい500万あれば事足りるかなと思います。

しかし、定年直前に500万渡すのは勇気がいりそうですね。。。

解決策案:積立投資の活用

解決策の1つとして、積立投資があります。

子供が生まれてから月1万の積立を続け、25歳で渡すとすれば、税引き後で491万円を引き渡すことができます。(年成長率:5%、税率:30%として計算)

月1万くらいならなんとかなりそうですし、子供の証券口座に積み立てていけば税金もかかりません。

計画的に進めていけば意外と負担は少なそうに感じました。

まとめ

子供に残すお金として、下記のように考えます。

  • 25歳で渡す
  • 生まれたときから月1万で積み立てる

辛いときに支えてあげれば家族関係も円満になりますし、投資効果としては十分かと思います。ぜひご参考ください。