パンダの休日

雑多な書き残し

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
numpyなどを使わずにPure Pythonで。


import os
import math
import wave
AMP = 10000
SMR = 44100

def main1():
import winsound
out=wave.open("mono.wav","w")
out.setnchannels(1)
out.setsampwidth(2)
out.setframerate(SMR)
outbt = b""
for i in range(SMR*1):
wh = int(AMP *math.sin(440*2*math.pi*i/SMR)) #440Hz
bwh = wh.to_bytes(2, "little",signed=True)
outbt += bwh
out.writeframes(outbt)
out.close()
winsound.PlaySound("mono.wav",winsound.SND_FILENAME)

if __name__ == '__main__':
if os.name == "posix":
pass
elif os.name == "nt":
main1()
else:
print("ERROR")

スポンサーサイト
gmailの受信ボックスからメールを取得して返信する奴を作ったので覚書き。
この実装だとgmailからセキュリティ上の安全性がどうのというエラーを頂くことになるが設定変更で使用できるようになる。


import smtplib
import imaplib
import quopri
from email.mime.text import MIMEText

myadd = "***@gmail.com"
mypass = "password"

def send_msg(aite, dai, jibun, honbun):
msg = MIMEText(honbun)
msg["To"] = aite
msg["Subject"] = dai
msg["From"] = jibun
con = smtplib.SMTP_SSL("smtp.gmail.com", 465)
con.login(myadd, mypass)
con.send_message(msg)
con.close()

def get_msg():
con = imaplib.IMAP4_SSL("imap.gmail.com", 993)
con.login(myadd, mypass)
con.list()
con.select("inbox")
res = con.search(None, "(UNSEEN HEADER FROM {})".format("someone@mail.com"))
#con.search returns -> ('OK', [b'150 151'])
#未読メールに振られたIDを取得
usm = res[1][0].split()
if len(usm)==0:
return(None)
for mailid in usm:
data = con.fetch(mailid, '(RFC822)')[1][0][1].decode("iso-2022-jp")
return(data)

def main():
honbun ="you said:"+get_msg()
aite = "someone@mail.com"
dai = "Hello!!"
jibun = myadd
send_msg(aite, dai, jibun ,honbun)


if __name__ == '__main__':
main()

rfg1_4_51.png


今流行のディープラーニング乗り損ね組ですこんばんは。
ディープラーニングは色々調べたのですがどうにも1から書くには数学力が足りないようなのでコスパ最高と名高いランダムフォレストをPythonで書いてみました。
主たる部分の行数が100行と少し。流石コスパ最高。
後から読んで何も分からないような汚いコードを書いてしまったので、ググってもあまり出なかったポイントの独自解釈を載せます。
(この解釈で結果はそこそこ正確でしたがランダムフォレストとして正しいかは分かりません。)


1.入力データ
分類の場合
[float(入力1), float(入力2), float(入力3), ... , str(出力)]
入力は数学関数に使うのでそれに合うもの、出力の型は==で一致が確認できるものならなんでも。
回帰の場合
[float(入力1), float(入力2), float(入力3), ... , float(出力)]
出力は平均をとる必要があるのでintかfloatを。
入力は何元でも良いが出力に2元以上が使えるかは不明。恐らく不可。

2.分岐関数
豆腐に包丁を入れるようにn元空間を平面でひたすら切って細かい空間にするための関数。
  例 : f(x, y) = ax + by + c (2元1次の関数)
2次以上の関数で空間を切る意味がないので1次関数(平面)を使う。
入力次元の平方根の元数を使うのが良いらしい。
傾きや切片を細かくして精度が上がるような仕組みではないので荒くても良い。(傾き10種類で18度ずつ等)
分類の場合は切った左右でエントロピーを計算して重み付けした和が最も小さくなる関数を用いる。
回帰の場合は左右それぞれに「各データの平均からの差の2乗」の和を計算し、左右の値の和が最も小さくなる関数を用いる。

3.データのランダム選択と量
手続:
渡されたデータを重複を許しランダムに7割ほど選ぶ。
→選ばれた7割を上手く分割する関数を探す。
元のデータをその関数で分ける。
分けたデータをそれぞれに同じ関数に再帰的に渡す。
1分岐ごとに半分になるので1木あたり5*2^分岐深度ほどの量が必要。
データの選択は重複を許すがデータ2個で同じものを拾うと分岐が上手くいかずエラーになる可能性がある。

4.木の構成
def 木を作る(データ, 深度):
if 渡されたデータが1種類か深度達成:
return(そのデータの出力値)
else:
ほげほげ
return([条件, 木を作る(真データ, 深度+1), 木を作る(偽データ, 深度+1)])
のようにしておくと
while True:
if type(tree) != type([]):
return tree
if 条件:
tree = tree[1]
else:
tree = tree[2]
のようにして拾いやすい。

5.木の重み付け
データの数がしょぼいと過学習に陥っているように感じる。
(しなくてもいい気がする・・・)

6.判定
分類は単純多数決。100本なら100本の木全てに分類させたいデータを渡して分類させ、最も多いものが判定結果となる。
回帰は上と同様にして得た値の平均が判定結果となる。


上記画像はある点からの距離を回帰でランダムフォレストに判定させたものをリニアングラフをお借りしてグラフ化したもの。
粗い方が趣があるので木50本深さ4。
kabuka5.png

株価シミュレーターのようなものを作ってみた。
25人ほどのトレーダーに色々な指標で取引してもらう感じ。
こんなもんでしょう。

タイトルは思いついたことを書いただけです。
このパターンでPythonやって楽しくなければプログラミングやめて他の趣味さがした方が良さそうです。
Pythonでキーイベント取得する方法を調べたのでメモ。
外部ライブラリを用いずに非アクティブ状態でもキーボードの状態を取得できるようにしてあります。
キーボードの「←」「→」キーで標準出力を変化させるテスト。
ctypesを使ってwindllから関数を借りてきて使います。
WindowsのGetAsyncKeyState関数に仮想キーコードと呼ばれる数を渡すとその対応するキーの状態がよく分からない整数で返ってきます。
その整数を2進数表記した16桁目が1であれば押されている0なら押されていないという意味らしいです。
渡す数は普通の10進数intでもいいのですが仮想キーコード表が16進表記のため16進数で定数にしてあります。
9行目のgetkey関数では2進16桁目のみが1である16進数の0x8000を&演算子で繋いで0か32768かをブール判定で真偽に変えています。
getkeyの真偽を if に渡してポジションを動かしています。
「←」「→」で移動、「↓」で終了します。
os.system("cls")などでコンソールをクリアさせればテトリスとかも作れそうです。


import ctypes
import time

WIDTH = 80
LEFT = 0x25
RIGHT = 0x27
DOWN = 0x28

def getkey(key):
return(bool(ctypes.windll.user32.GetAsyncKeyState(key)&0x8000))

def line000(pos):
pl = [(pos)%WIDTH, (pos+1)%WIDTH, (pos+2)%WIDTH]
rettxt = ""
for i in range(WIDTH):
if i in pl:
rettxt += "0"
else:
rettxt += "-"
return(rettxt)

def main():
POS = 0
while True:
if getkey(LEFT):
POS =(POS-1)%WIDTH
if getkey(RIGHT):
POS =(POS+1)%WIDTH
print(line000(POS))
time.sleep(0.03)
if getkey(DOWN):
break

if __name__ == '__main__':
main()




keytest.png

shader

Author:shader
多趣味飽き性に振り回されて色々やってます。

直接連絡したい方は御気軽にメールしてください。 3日以内には返信させて頂きます。

名前:
メール:
件名:
本文:

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。