合計 昨日 今日

アバター
GRAM
 
記事: 163
登録日時: 2010年11月02日(火) 21:48
お住まい: 大阪
日記: 日記を見る (148)
日記
- 3月 2017
VBA (0)
   2017年3月17日(金) 22:45

+ 6月 2015
+ 5月 2015
+ 9月 2014
+ 10月 2013
+ 6月 2013
+ 5月 2013
+ 3月 2013
+ 2月 2013
+ 1月 2013
+ 12月 2012
+ 11月 2012
+ 10月 2012
+ 9月 2012
+ 8月 2012
+ 7月 2012
+ 6月 2012
+ 4月 2012
+ 3月 2012
+ 2月 2012
+ 1月 2012
+ 12月 2011
+ 11月 2011
+ 10月 2011
+ 9月 2011
+ 8月 2011
+ 7月 2011
+ 6月 2011
+ 5月 2011
+ 4月 2011
+ 3月 2011
+ 2月 2011
+ 1月 2011
+ 12月 2010
+ 11月 2010
カテゴリ
フィード
次へ

VBA

パーマリンクby GRAM on 2017年3月17日(金) 22:45

今週から会社でやむなくExcelVBAをやり始めました。
VisualStudioでぬくぬくC#やC++を書くことしかしてなかった最近の自分にとってVBAは遅くてデバッグが大変でフラストレーションがたまるやつですが、
一方これまでExcelを使ってきた10年を思うとこいつをもっと早くに習得しておけばと思うことが多いのも事実。。。
ぐぬぬぬ。。。やり切れぬこの思い

コメント数: 0 閲覧数: 1395

この問題

パーマリンクby GRAM on 2015年6月11日(木) 23:16

この問題数学的センス云々はともかく,この手の問題を解けるようになることは案外重要なんじゃないかと思う.
この問題から得られることは多いと思うんですよね.やり方を覚えさえすればちょっと複雑な確率問題から高度なAIまで本質的には同じ考え方でできるんですよ.
あんまり解説してるページが見つからなかったので日記を書いたんですが,
実はこの手の問題は数学的センスがなくても機械的に解くことが可能な手法があります
先に言うとちょっと長いです.
(またこれは国語の問題ではなく,自分が見る限り問題に不備はありません.)

問題:
3枚のカードが袋に入ってます
1枚は両面赤、1枚は両面青、1枚は片面が赤で片面が青です
今、目をつぶって袋からカードを1枚選び、机の上に置いて目を開けたところ、カードは赤でした
このカードの裏が青である確率は?


さてテストでこの問題が出たとして,満点をもらうのに十分な答えを言うとこれだけです.しかし多分半分くらいの人は多分納得しないでしょう.
.png
.png (29.37 KB) 表示数: 301 回

なぜ納得がいかないか.おそらく赤が確定した時点で

①表が赤で裏が赤
②表が赤で裏が青


の2つの場合しかないと思うからでしょう.
それは実際その通りなのですが,実際には①と②は確率で重要な「同様にたしからしい」という条件を満たしてません.
場合の数/場合の数になるのは同様にたしからしいという条件を満たしておく必要があります.
(しかしそんなもん気づかないべという人も多いでしょう.僕も考えればわかりますが直感ではわからない人です.なのでこの話の最後にこの手の問題を機械的に解く方法を紹介します.)

なぜ同様にたしからしいといえないか.その説明をする前に問題を簡単にしておきたいと思います.
実はこの問題,本質的でないところでややこしくしてるポイントがあります.
この問題は実はこれを考えるだけでよいです.
問題:
2枚のカードが袋に入ってます
1枚は両面赤、1枚は片面が赤で片面が青です
今、目をつぶって袋からカードを1枚選び、机の上に置いて目を開けたところ、カードは赤でした
このカードの裏が青である確率は?

この問題の答えも1/3です.
.png
.png (20.55 KB) 表示数: 302 回


なぜ①と②が同様にたしからしくないか,図からお気づきかもですが表が赤で裏も赤という場合は
2パターンあるんですよね.一方裏が青になるのは1パターンしかない.
(つまりこれはコインを2枚投げて表と裏が一枚ずつになる確率はいくつですか?という問題(答え:1/2)とひっかけポイントは同じです)
しかし,赤が確定してるんだから…といいたいこともあるでしょう.直感で納得いかないのであれば,便利ツールを使うという手があります.
そして便利ツールはあまりに強力なので,ベイズの定理という名前がついてます.

太字にしていますが,ここが重要です.
今、目をつぶって袋からカードを1枚選び、机の上に置いて目を開けたところ、カードは赤でした
という部分です.
実は本質的にはこの問題はこのように分解できます.

問題①:
2枚のカードが袋に入ってます
1枚は両面赤、1枚は片面が赤で片面が青です
今、目をつぶって袋からカードを1枚選び、机の上に置きました.
このカードの裏が青である確率は?

答えはもちろん1/4です.(青を裏にして置く確率)
問題②:
2枚のカードが袋に入ってます
1枚は両面赤、1枚は片面が赤で片面が青です
今、目をつぶって袋からカードを1枚選び、机の上に置きました.
目を開けると表側は赤でした.
このカードの裏が青である確率は?

問題②は内容的に今やってる問題と同じです.
問題①と問題②の違いはズバリ
目を開けると表側は赤でした.
の部分です.
つまり,あとから何か情報が与えられてるかどうかという差です.
裏側が青である確率をP(裏青)としたとき,何も情報のないP(裏青)を事前確率
表が赤であるという条件(赤表)を与えられたとき,裏が青である確率P(裏青|赤表)を事後確率
といったりします.

そして,あとから情報を与えられているときの確率(事後確率)を求めるには,あまりにもあっけない公式があります.
P(A)*P(B|A) =P(A∩B) ( =P(B)*P(A|B) )
これをベイズの定理とか言います.

何を言ってるか,この問題に当てはめると

表が赤である確率 *表が赤であるとわかった時に裏が青である確率 = 表が赤でかつ裏が青である確率です.
なにを当たり前のことをと思うかもですが,これは結構強力な公式です.
これをこの問題に使えば,この問題は機械的に解けます.

今知りたいのは事後事象
P(裏青|赤表) (表が赤であるとわかった時に裏が青である確率)
です.

表が赤になる確率は簡単にわかります.
表の選び方は4通りで,赤の選び方は3つありますので3/4です.

一方表が赤で裏が青となるような選び方も簡単にわかります.
2枚の札から赤青を選んで,さらにそれを正しい向きで置かないといけません.すなわち
1/2*1/2 = 1/4です.

なにを言ってるんだそんなこと今関係ないだろうといいたいかもですが,この一見全く関係のない数字を機械的にベイズの定理に当てはめるとあら不思議答えが出てきます.
P(裏青|赤表) * P(赤表)= P(赤表かつ裏青)
P(裏青|赤表) = P(赤表かつ裏青)/ P(赤表)

P(裏青|赤表) = ( 1/4 ) ÷ (3/4)
P(裏青|赤表) = 1/3


・・・という感じです.
ベイズの定理のすごいのは,別にあんな図を頭に浮かべなくても当たり前の組み合わせで答えが出ることです.
実はもうちょっと複雑な問題でもあっけなく解けます.

そしてもっと応用もききます.これを発展させたものがベイズ推定という方法です.
これは本質的には上とおんなじことをやってるだけなのに高度な機械学習が可能になります.
なぜか.機械学習の目的は与えられた情報をもとにして,ほかの何かを推定するってことですが,何も情報がない状態の初期設定を事前確率,
学習の結果推定に使う確率を事後確率ととらえれば,まさにベイズの定理が使えるからです.
(もし興味がありかつ,くじけない覚悟と樋口さん一枚強を払ってでも勉強してみようというやる気があるのなら,パターン認識と機械学習という本がむちゃくちゃおすすめです.)

ちなみに一番最初の問題もベイズの定理で機械的に解けます

P(表赤): 青か赤かの二択で,同様にたしからしいので明らかに1/2
P(表赤かつ裏青):1\3の確率で赤と青のカードを引いて,正しい表裏でおく.よって確率は1/3*1/2 = 1/6

P(裏青|赤表):求める確率
(1/6) ÷ (1/2 ) = 1/3


ほらね簡単でしょう!!!

最後にベイズの定理の強力さがわかる問題
ねじとナットを作る機械が2台あります.(A,Bとします.)
機械Aは一日でねじ100個 ナット200個 を作ります.
機械Bは一日でねじ200個 ナット100個 を作ります.
機械Aは1%の不良品が発生し
機械Bは3%の不良品が発生します.
今ナットに不良品が見つかりました.
どちらの機械から出た不良品である可能性がどれくらい高いですか?
添付ファイル
最後に編集したユーザー GRAM [ 2015年6月12日(金) 00:15 ], 累計 8 回

コメント数: 6 閲覧数: 6554

Gnuplot

パーマリンクby GRAM on 2015年5月26日(火) 00:56

あんまり使いこなせてはいないものの,Gnuplotが便利極まりないのは身をもって体感している今日この頃.
commandをいちいち覚えてはいないものの,gnuplotの精義とかいう本を買ったところ大抵のことはこの本に載っています.

ところでgnuplotは1月にバージョン5.0がでていて,これにはヒアドキュメントとかいう超便利な機能がついてます.
これを使うと,あんまりgnuplotに詳しくない僕のような人間でも,簡単なグラフが簡単にかけてしまいます.
(なおC/C++erの方々にはImportとかいう便利機能もあるみたいですが,これは使い方を勉強する気がおきませんでした…)

解説はグーグルさんに任せるとして,これがC#などからgnuplotを使うのに非常に便利であることを書いておきます.

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
 
namespace GnuplotLib
{
    using XY = Tuple<double, double>;
    using XYZ = Tuple<double, double, double>;
 
    public class Gnuplot
    {
        #region enum
        public enum Position
        {
            left,
            right,
            top,
            bottom,
            outside,
            below,
            unset,
            off
        }
        public enum PlotMode
        {
            Plot,
            Replot
        }
        #endregion
 
        #region Internal
        private static string gnuplotExeFilePath = "gnuplot";
        private System.Diagnostics.Process GnuConsole
        {
            get;
            set;
        }
        private bool Started = false;
        #endregion
 
        #region Property
        public bool SetXaxisLogScale = false;
        public bool SetYaxisLogScale = false;
        public string GraphTitle = "";
        public string XaxisLabel = "";
        public string YaxisLabel = "";
        public string ZaxisLabel = "";
        public Position KeyPosition = Position.unset;
        #endregion
 
        #region Public Method
        public Gnuplot(
            bool redirectStandardInput = true,
            bool createNoWindow = true,
            bool useShellExecute = false
            )
        {
            GnuConsole = new System.Diagnostics.Process();
            GnuConsole.StartInfo.Arguments = "-p";
            GnuConsole.StartInfo.FileName = gnuplotExeFilePath;
            GnuConsole.StartInfo.CreateNoWindow = createNoWindow;
            GnuConsole.StartInfo.UseShellExecute = useShellExecute;
            GnuConsole.StartInfo.RedirectStandardInput = redirectStandardInput;
 
        }
 
       
 
        public void PlotXY(
            string title,
            List<XY> list,
            string style
        )
        {
            string command = "replot";
            if (!Started)
            {
                Start();
                command = "plot";
            }
            else
            {
                WritePreCommandsForGnuConsole();
            }
            string name = Math.Abs(title.GetHashCode()).ToString();
            name = ReplaceNumber(name);
 
            GnuConsole.StandardInput.WriteLine("$" + name + " << EOD");
            foreach (var data in list)
            {
                GnuConsole.StandardInput.WriteLine("{0}\t{1}", data.Item1, data.Item2);
            }
            GnuConsole.StandardInput.WriteLine("EOD");
 
            command += " $" + name + " with " + style + " title" + " \"" + title + "\"";
            GnuConsole.StandardInput.WriteLine(command);
        }
 
        public void PlotXYZ(
            string title,
            List<XYZ> list,
            string style
        )
        {
            string command = "replot";
            if (!Started)
            {
                Start();
                command = "splot";
            }
            else
            {
                WritePreCommandsForGnuConsole();
            }
            string name = Math.Abs(title.GetHashCode()).ToString();
            name = ReplaceNumber(name);
 
            GnuConsole.StandardInput.WriteLine("$" + name + " << EOD");
            foreach (var data in list)
            {
                GnuConsole.StandardInput.WriteLine("{0}\t{1}\t{2}", data.Item1, data.Item2, data.Item3);
            }
            GnuConsole.StandardInput.WriteLine("EOD");
 
            command += " $" + name + " with " + style + " title" + " \"" + title + "\"";
            GnuConsole.StandardInput.WriteLine(command);
        }
 
        public void WriteCommand(string command)
        {
            GnuConsole.StandardInput.WriteLine(command);
        }
 
       
 
        #endregion
 
        #region Private Method
        private void Start()
        {
            try
            {
                GnuConsole.Start();
                Started = true;
                WritePreCommandsForGnuConsole();
            }
            catch (Exception e)
            {
                MessageBox.Show("Error:Gnuplotが見つかりません");
                throw e;
            }
        }
 
 
        private string ReplaceNumber(string s)
        {
            s = s.Replace('0', 'h');
            s = s.Replace('1', 'i');
            s = s.Replace('2', 'j');
            s = s.Replace('3', 'k');
            s = s.Replace('4', 'l');
            s = s.Replace('5', 'm');
            s = s.Replace('6', 'n');
            s = s.Replace('7', 'o');
            s = s.Replace('8', 'p');
            s = s.Replace('9', 'q');
            return s;
        }
 
        private void WritePreCommandsForGnuConsole()
        {
 
            if (SetXaxisLogScale)
            {
                GnuConsole.StandardInput.WriteLine("set logscale x");
 
            }
 
            if (SetYaxisLogScale)
                GnuConsole.StandardInput.WriteLine("set logscale y");
 
            if (!XaxisLabel.Equals(""))
                GnuConsole.StandardInput.WriteLine(@"set xlabel '{0}'", XaxisLabel);
            if (!YaxisLabel.Equals(""))
                GnuConsole.StandardInput.WriteLine(@"set ylabel '{0}'", YaxisLabel);
            if (!ZaxisLabel.Equals(""))
                GnuConsole.StandardInput.WriteLine(@"set zlabel '{0}'", ZaxisLabel);
            if (!GraphTitle.Equals(""))
                GnuConsole.StandardInput.WriteLine(@"set title '{0}'", GraphTitle);
 
            if (!KeyPosition.Equals(Position.unset))
                GnuConsole.StandardInput.WriteLine("set key {0}", KeyPosition.ToString());
        }
       
        #endregion
    }
 
}

gnuplotインストール時に環境変数を設定しておくとすぐ使えます.
使い方はこんな感じ.C#です.
コード[C++]: 全て選択
1
2
3
4
5
6
            var list = new List<XY>();
            /* listに数字を代入*/
            var gnuplot = new GnuplotLib.Gnuplot();
            gnuplot.XaxisLabel = "Speed(m/s)";
            gnuplot.YaxisLabel = "RollAngle(°)";
            gnuplot.PlotXY("V-ViecleRollAngle", list, "lines");


なおコードはこちらを参考にしてます.あんまり原型をとどめてないですが.
こんなグラフとか
951
こんなグラフが書けます.
950
バージョン5.0に対応した本でないかなぁ・・・
最後に編集したユーザー GRAM [ 2015年5月27日(水) 00:09 ], 累計 3 回

コメント数: 0 閲覧数: 4623

8MB病

パーマリンクby GRAM on 2014年9月18日(木) 22:32

今更になってかかってしまった8MB病・・・
はい。Intelの320Seriesとかいう300GBのSSDです。

取りあえずインテルに確認してみたところ新しいのと交換してくれるとのこと。
いってみるもんですね。

入ってたデータはすべて飛んでしまいましたが、まぁほぼ何も入ってなかったのでセーフ。
とはいえWindows7 Ultimateはリカバリディスクで大丈夫なのだろうか。
通らなかったらマイクロソフトに電話しないといけないなぁ…。

コメント数: 0 閲覧数: 5298

ゼファー400

パーマリンクby GRAM on 2013年10月29日(火) 21:48

ふはははは
ようやく買ってしまった。
Araiのフルフェイスのヘルメット付き中古で12万


あす名義変更行って任意保険の手続きして
むふふふふふ

コメント数: 2 閲覧数: 7040

オンラインデータ

登録ユーザー: maru