search this site:

Chaotic Neutral

左にも右にもよらず、自由な生き方探し。

スポンサーサイト


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

Windows Powershell ― Start-Job


 Powershell v1には並列処理を実現する仕組みが備わっていなかった。もちろん、.NETのライブラリを駆使して並列処理を実現できないこともなかったが、それは「スクリプティング」という言葉が意味する範疇を超えてしまっていた、と個人的に思います。
 Powershell v2では「Start-Job」というコマンドレットが用意されていて、子スレッドを生成し、並列処理を実現できます。この「Start-Job」は使い方次第では ― というより、普通に使っていれば ― 副作用を伴わない。
 周知のとおり、子スレッドは非同期の呼び出され、戻り値を返さない。通常のメソッドの呼び出しと比べて、子スレッドの処理結果の受け取りには何かと面倒な工夫が必要です。
 子スレッドの処理結果を受け取るありがちなやり方の1つは、親スレッドでオブジェクトを用意し、子スレッドに渡して上書きさせることです。しかし、メソッドの呼び出しの結果、メソッド本体やそれを含むインスタンスのスコープ外の何かが書きかえられること ― いわゆる、副作用 ― には問題があります。スコープ外のオブジェクトの上書きバグの温床になります。また、複数のスレッドがそのオブジェクトを上書きするのであれば、ロックオブジェクトを用いた排他機構が必要です。ロックの習得と解放の間が子スレッドの処理時間の1/100でも、子スレッド数が100あれば、子スレッドの60%以上がロックが解放されるのを待たされることになります。
 もう1つのありがちなやり方は、各スレッドごとにインターフェイスを用意し、スレッドの結果を受け取ることです。これならば副作用は伴わない。しかし、スレッドの処理が終わらなければ、結果を受け取れない。
 Powershell v2の「Start-Job」を使うと、副作用を伴わず、しかも、処理の途中の暫定結果を受け取ることができます。

PS H:\> $c = {$i = 0; while(1){$i++; $i; sleep 1}}
PS H:\> $d = start-job $c
PS H:\> receive-job $d
1
2
3
4
5
6
7
8
9
PS H:\> receive-job $d
10
11
12
13

 「$i」と変数だけを書いた部分が重要です。これは、Pythonの「yield」やC#のIEnumeratorを使った場合の「yield return」と似ていますが、子スレッドは処理をそこで止めません。
 「Receive-Job」を使うと、その時点での処理結果を配列で受け取ることができます。
 Googleの新言語Goでも、並列処理はこんなに簡単ではない。
 同じことがC#でできるようになれば、プログラミング言語の世界で天下を取れそうです。

スポンサーサイト

Window Powershell ― Textbox経由の貼り付け


$tb = new-object system.windows.forms.textbox
$tb.multiline = $true
$tb.select()
$tb.paste()
$tb.text

これを"ctt.ps1"というファイル名で保存し、パスの通ったフォルダーに放り込んでおきます。

この方法を使うと、テキスト以外のデータをテキストに変換して貼り付けられることがあります。例えば、Excelのセルをクリップボードにコピーしたものは

PS H:\> $c

Tag                  :
PhysicalDimension    : {Width=73, Height=157}
Size                 : {Width=73, Height=157}
Width                : 73
Height               : 157
HorizontalResolution : 96
VerticalResolution   : 96
Flags                : 335888
RawFormat            : [ImageFormat: b96b3caa-0728-11d3-9d7b-0000f81ef32e]
PixelFormat          : Format32bppRgb
Palette              : System.Drawing.Imaging.ColorPalette
FrameDimensionsList  : {7462dc86-6180-4c7e-8e3f-ee7333a7a483}
PropertyIdList       : {}
PropertyItems        : {}
です。

tostring()を使っても、テキストデータを返さず、クラス名を返すだけです。

PS H:\> $c.tostring()
System.Drawing.Bitmap

しかし、Textboxを経由させると、テキストデータを取り出せます。

PS H:\> ctt
CLANNAD.*AFTER STORY

Windows Powershell ― %


.NETのCLR環境の困ったところは、速度よりもむしろ、メモリーを馬鹿食いするところだと個人的には感じている。Powershellでテキストファイルをメモリーに読み込ませると、ファイルの数倍のメモリーを使う。

$table =@{}
foreach($i in (type "list.txt")){
	$c = $i
	$c = ($c.split("第"))[0]
	$a = $c.split(" ")
	$c = [string]::Join(" ", $a[1..($a.count - 1)])
	$table[$c] += 1
}
return $table

これ↑をやると、list.txtが100MBを超えたあたりで、HDDがページファイルの読み書きでうるさくなる。100MBのテキストファイルを読み込むと、Powershellのメモリー占有量は1GBくらいにまで膨らんでしまう。

$table = @{}
type "list.txt" | %{
	$c = $_
	$c = ($c.split("第"))[0]
	$a = $c.split(" ")
	$c = [string]::Join(" ", $a[1..($a.count - 1)])
	$table[$c] += 1
}
return $table

これ↑なら大丈夫。foreach()と違って、%は1個ずつ文字列をメモリーに読み込み、処理に渡し、捨ててくれる。

Windows Powershell ― 人工知能開発に至る(ことを諦めない)長い道 ― II


PS H:\> [float]"1.1" + [int]"1" 2.10000002384186
PS H:\> 

文字列"1.1"をFloat(浮動小数点)型の数値にキャストし、文字列"1"をint(整数)型の数値にキャストし、両者を加えてみた。計算誤差が生じています。

PS H:\> 1.1 + 1
2.1
PS H:\> 

単に2つの数値をを足すと、大丈夫のようです。

PS H:\> (1.1).gettype()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Double                                   System.ValueType


PS H:\>

つまり、Powershellでは数値1.1のデータ型はデフォルトでDouble(倍精度浮動小数点)型になっているのです。

PS H:\> (1 / 2).gettype()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Double                                   System.ValueType


PS H:\>

整数 / 整数が整数にならない場合、自動的にDouble型に変えられます。

株価データは全部整数なんですが、先々に商品先物まで扱うことを視野に入れれば、整数だろうがなんだろうが、数値は全部Double型で扱っておいたほうがよさそうです。

 


さて、人工知能の話です。

実際の脳では、知覚も複雑な神経回路で実装されているんですが、その部分は知能とは直接関係がない。つまり、データに対して最初に興奮するノード ― 今後、"Pノード"と呼ぶことにしましょう ― は特に神経回路を真似なくてもよさそうです。

また、システム全体の成功と失敗を認知するRノードも、株の売買を対象としている限り、やはり神経回路を真似しなくてもいい。

Pノードから興奮を信号として受け取り、他のノードへの信号を伝えるCノードのみを神経回路のようにつなげばいいのです。

Windows Powershell ― 人工知能開発に至る(ことを諦めない)長い道 ― I


株の売買のうち、デイトレードより長く、中長期より短いものがしんどくなってきた。

デイトレードはあまりに期間が短いので、圧倒的な利益を上げ続ける少数のトレーダーがいても、トレーダー全体の手法はそれほど進歩しないので、平均よりもほんのちょっと賢ければ稼げる。

スウィングトレードでは、毎日の相場が終わった後、チャートをじっくりと眺め、コンピュータでじっくりと分析できるので、手法の進化が著しい。ある手法で稼げたとしても、長続きしない。ずっと有効な手法は確かに存在するが、その手法が使える条件が整う局面が減ってしまう。手法をどんどん変えていかなければいけない。

そこで、人工知能でも作ってみようと思ったよ。

なぜだか、LISPやPythonではなく、Powershellで!

まずは、株価データの読み込みから。2497.txtはタブ区切りテキストファイル。

$RawData = type 2497.txt
$StringData = @()
foreach($i in $RawData){
	$StringData += , $i.split("`t")
}

この , $i.split("`t"), を思いつくのに、8時間もかかった。以下のことをやってようやく気がついた。

PS H:\> $a = (1, 2, 3)
PS H:\> $a[0]
1
PS H:\> $a = , (1, 2, 3)
PS H:\> $a[0]
1
2
3

","は配列を作る演算子なので、","に配列をくっつけると、配列の配列を作れる。


タイトルに"人工知能"が含まれているので、人工知能の話も … 目指すのは、遺伝的アルゴリズムじゃなくて、ニューロ。

我々人間はお脳の方を使って考えている。けれど、脳の各細胞は自分が何をやっているのか知らない。脳細胞の集合体が成功すれば快楽が、失敗すれば苦痛がホルモンで伝えられ、細胞と細胞がつながったり、細胞が死んだりする。

ニューロな人工知能でも、成功につながる信号を出したノードと、失敗につながる信号出したノードを個別に区別しないほうがいい、はず。

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