0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

機械学習で素数を理解してみる

Last updated at Posted at 2020-05-18

挨拶

初投稿です。なんならマークダウン方式も初めてです。Pythonも機械学習も経験値はあまりありません。(なので指摘やアドバイスをいただけると幸いです)

今回は素数大好き人間の自分が素数関連のプログラムを作って、その道の途中でたどり着いた機械学習を用いてもっと効率のいい判定法を導こうという話です。

効率はともかく、学習は成功したのではないではないかと思ってます(多分)

事前考察・研究

なんか重いサブタイですが、要はコーディングする前の考え事です。(次の見出しにまとめがあるのでスキップしても構いません)

まずは一番下にあるだろう、参考文献・引用元を総合した結果

「素数は二値分類(YesかNo)で判別することはできない」

という結論に至りました。(その経緯は省略させていただきます)

そこで新たな方法を模索するため、素数の性質を考えます。

・1と自身以外の自然数では割り切れない
・約数は二つ
・合成数ではない

最初に二つ目の特徴に注目しました。すなわち約数の個数です。

機械学習で任意の値の約数の個数を覚えさせ、回帰問題に行き着かせるのはのはどうか、ていう話です。

結果

https://twitter.com/NeoNuc2001/status/1260601923738013696?s=20
惨敗
どうやら訓練データの約数の個数を平均した値と近いものを出すだけのものなってしまったようです。

そこでさらに三つ目の特徴、合成数に注目しました。

合成数の判別方法、例えば3や4,5,6,8,9,11で割り切れるかどうかを調べるにはどうすればいいか。

それはその値のそれぞれの桁に注目すればいいのです。

機械学習は言ってしまえば関数の近似、それも微分可能な連続した関数です。対して上記の値で割り切れるかどうかは10^nで割り切り捨てした値を調べるという非連続的な関数を使わなければいけないのです。なので今回は数値をそのまま入れるのではなく、入力値を桁ごとに分離してみました。

いじったところ

  • 約数の個数で判定する
  • 入力値を桁ごとに分離する
  • ついでに訓練データを素数、非素数半々ずつにする

環境

OS:Windows 7 (64bit)
メモリ:4gb
CPU:Intel(R) Core(TM) i5 M480
GPU:なし
言語:Python 3.8.2
ライブラリ

  • Chainer 7.4.0
  • NumPy 1.18.2
  • sklearn 0.0
  • sympy 1.5.1
  • その他 略(要望があれば追記します)

コード

コメントアウトや不要な処理、間違った記述があると思いますが、お許しください
GitLab:https://gitlab.com/Neonuc2001/primenumber_chainer
(Wikiなどはまだ未設定です、ごめんなさい)

結果

2-999998までの全範囲で行いました。

約数の個数分布(予想)

Figure1.png

モデルの的中率

Per_all.png

素数のみに絞った場合のモデルの的中率

Per_prime.png

過学習とも、未学習とも言えないいい線を行ってるのではないでしょうか。

考察と反省

なんか成功したぽいですね(実際はまだ疑心暗鬼)。
ですが問題点があります。入力層において桁数をあらかじめ指定している以上、特定の範囲でのみしか判別ができないということです。桁数が一つ増えるたびに計算量がどれほど増大するかはよくわかりませんが、素数の最大値を求めさせるにはいささか不安が残りそうな結果です。

また上記に記した環境を見れば一目瞭然ですが、明らかなスペック不足です。なのでこれ以上の桁数については検証できないのがなんとも残念です。

また先述の通り疑心暗鬼なのは機械学習に慣れていない事、素数の割には的中率が高いこと、コードにありうる潜在的バグが気になるなど様々理由があるためです。(みなさんにもやってほしい)

以上で終わります。

追記

モデルの優秀さを計るために別の視点でデータを見たいと思います。
素数のみのデータを集め、その値が「素数である」と判断する確率を調べます。

素数の個数 モデル 乱数(約数の個数1-100) 二値分類(YesかNo)
1-10000 0.83 0.01 0.5
10001-20000 0.82 0.01 0.5
20001-30000 0,83 0.01 0.5
30001-40000 0.81 0.01 0.5
40001-50000 0.80 0.01 0.5
50001-60000 0. 78 0.01 0.5
60001-70000 0. 67 0.01 0.5

上記の通り、ただの乱数より優秀な確率がでてます。

参考文献、引用

https://qiita.com/tanuk1647/items/d868c4eab76a9f79c1d3
https://qiita.com/wataoka/items/5201a1ac8696160828fd

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?