サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
アメリカ大統領選
fussy.web.fc2.com
ここでは、プログラムなどでよく使用されるアルゴリズムについて紹介したいと思います。 元々は、自分の頭の中を整理することを目的にこのコーナーを開設してみたのですが、最近は継続させることを目的に新しいネタを探すようになってきました。まだまだ面白いテーマがいろいろと残っているので、気力の続く限りは更新していきたいと思います。 今までに紹介したテーマに関しても、新しい内容や変更したい箇所などがたくさんあるため、新規テーマと同時進行で修正作業も行なっています。 アルゴリズムのコーナーで紹介してきたサンプル・プログラムをいくつか公開しています。「ライン・ルーチン」「円弧描画」「ペイント・ルーチン」「グラフィック・パターンの処理」「多角形の塗りつぶし」を一つにまとめた GraphicLibrary と、「確率・統計」より「一般化線形モデル」までを一つにまとめた Statistics を現在は用意していま
(24) 主成分回帰 ( PCR ) と部分最小二乗法 ( PLS ) 最小二乗法を原理とする重回帰モデルは、標本数が推定したい係数 ( 独立変数の種類 ) に対して十分に大きいことを前提としています。しかし、場合によっては十分な標本が得られなかったり、波形データなど、変数の種類が非常に多い場合があり、しかも独立変数どうしで相関があるような場合、通常の重回帰モデルでは処理ができなかったり、処理できたとしても正しい結果が得られないような場合があります。これは、独立変数の種類を少なくして相関を減らすことで回避することができるため、今回はそのための手法である「主成分回帰 ( Principal Component Regression ; PCR )」と「部分最小二乗法 ( Partial Least Squares ; PLS )」を紹介したいと思います。 1) 一般逆行列 ( General
人は、目から得られるたくさんの情報を常に処理し、それに対して判断を行っています。目に映るモノ全てに対してそれが何かをいちいち判断していたのでは、特に瞬時の判断が必要な場合は生死に関わることになる可能性もあります。車の運転中、前の車が急停車したという情報を処理するときは、目の前に近づいてきた車やそのブレーキランプを見て判断すれば充分なのに、周囲の景色や道路標識なども常に処理されていては判断が間に合わなくなります。そのため、本当に注目すべきモノだけに無意識に注意を引くような仕組みが人には備わっています。これは、人に限らず他の動物にもあり、天敵などの危険から逃げたり、逆に獲物を追う時に逃げる対象の動きを瞬時にとらえるなど、常に視覚情報から注意を引く部分を抽出して、それ以外の情報はカットしてしまう機能が必要になる機会は人よりも多いことが想像できます。 今回は、注意を引く対象を見つけるための仕組みと
「分散分析法(ANOVA)」は、各集団の因子(装置ごとの製品処理時間やクラス別の学力テスト結果など)に対する「要因効果」、すなわち全体の平均と各集団における平均の差が、その要因(装置やクラス)だけに依存していることを前提条件としています。しかし、標本の抽出が無作為に行われていないような場合、他の要因によって集団間の差が生じてしまう可能性があります。この影響をできるだけ小さくすることを目的とした検定法として、今回は「共分散分析(ANCOVA)」を紹介します。 1) 名義尺度の線形重回帰モデル 以前紹介した「線形重回帰モデル (Linear Multiple Regression Model)」では、独立変数が連続量であることを前提としていました。しかし、名義尺度の場合も「ダミー変数(Dummy Variable ; Indicator Variable)」を利用することで重回帰分析に含めるこ
前章で紹介したサンプル・プログラムは非常にシンプルな実装である反面、無駄な処理が多いため、実行するのにかなりの時間が必要になります。そこでこの章では、無駄な処理を省くことでアルゴリズムの最適化・高速化を行います。 まず、上の図でシードPから閉領域を塗り潰すとします。シードPから左右方向に境界を探すとまずは線分 ABが得られます。線分 ABを塗り潰したら、その上下にある CD, EF二つのラインから領域色の部分を探します。線分 CDはそのまま領域色で、線分 EFはその中にある GHの部分が領域色なので、それぞれの代表として右端のシードDとHをキューに追加します。これで1ライン分の処理が済んだので、キューから新たなシードを取り出します。ここではシードDが取り出されたとします。 シードDから左右方向に境界を検索するとき、左方向はDからIまで、右方向はDからJまでの範囲を走査することになります。し
今まで紹介してきた確率論や統計学では、ある事象が発生する確率は変化することはないという立場をとってきました。例えば、サイコロを投げて出た目を確率変数とした時、100 回投げて全てが 1 の目であったとしても、サイコロに何も細工がされていなければ、それは偶然におこった事象で、1 の目が出る確率は相変わらず 1 / 6 のままです。100 回も 1 の目が続いたのだから、次も必ず 1 であろうと予想できなくもないですが、あくまでも客観的な立場をとるというのが今までの統計学での考え方です。それに対し、今までの結果を踏まえて確率そのものが変化するという立場を取る考え方を採用したのが「ベイズ統計学(Bayesian Statistics)」です。ベイズ統計学の立場では、1 の目が 100 回出たのだから、1 の目が出る確率もそれだけ大きくなっているだろうと判断することになります。今回は、ベイズ統計学
この章では、現在のデータ圧縮・画像圧縮などで広く用いられているLZ法について説明します。 前章までで説明したハフマン圧縮では、個々のデータをハフマン符号に変換して圧縮を試みるというものでしたが、LZ法では、あるデータ列に着目して、それが以前に出現したことがあるかをチェックし、すでに出現したことがあるのならば、そのデータ列を示す何らかの符号(当然、データ列より短くなければなりません)に置き換える処理を行うことにより、圧縮を行っています。 LZ法には、いくつかの種類があり、その種類によってさらに名称が変わります。しかし、その違いは符号化の方法だけで、処理の内容については全て同じです。 LZ法は、Abraham LempelとJacob Zivの二人による共同開発によって、1977年に誕生しました。正式名称はZiv-Lempel codingですが、間違ってLZ法として紹介したことから、現在の
「正規分布(Normal Distribution)」は別名を「ガウス分布(Gaussian Distribution)」といい、ガウスが論文の中で、「最小二乗法」の正確さが正規分布によって説明できることを示したことからこの名が付けられています。この分布は、統計学において最も基本となる分布の一つであり、またその応用範囲も非常に広いことから最もよく知られた確率分布でもあります。この章では、正規分布とその性質について紹介したいと思います。
この章では、JPEG2000フォーマットで圧縮アルゴリズムとして採用されたことで、一躍有名になったウェーブレット変換(Wavelet Transform)について取り上げたいと思います。 JPEG2000では画像圧縮アルゴリズムとして採用されましたが、元々はフーリエ変換の応用形として、データ解析の利用を目的に考案された手法であり、その内容も多岐に渡っています。全てを説明するのは量的にも、自分の理解度から見ても不可能なため、ここでは離散ウェーブレット変換と、それを用いた解析手法である多重解像度解析を中心に紹介をしたいと思います。 1) フーリエ変換とウェーブレット変換 あるデータや関数の特性を分析する手法としてよく知られたものに、フーリエ変換(Foueier Transform)があります。フーリエ変換は、周期を持った任意の時間関数を正弦波と余弦波の和で表すことができることを利用して、時系
乗算処理を高速化するための手法として、前回は Karatsuba法と Toom-Cook法を紹介しました。どちらの方法も、数値を多項式として表現してその各係数を求めることによって、乗算結果を得ることができるということを利用しています。今回は、多項式を利用した手法としてまずは一般的な解法を考え、最終的には高速フーリエ変換を利用した乗算処理の高速化について説明したいと思います。 ● 「(2)多倍長整数の演算」の加算ルーチンについて 今回紹介するサンプル・プログラムの作成中、「(2)多倍長整数の演算」内の加算ルーチン(operator+=)においてバグが見つかり、修正を行いました。もし利用されている方がいましたら、差し替えをお願いします。バグの内容については、「(2)多倍長整数の演算」ページ下の更新履歴の中で簡単に説明してあります。
行列は、行と列を()で囲んで表現しますが、このドキュメント内では以下のように表現するようにします。 | 3, 2, 1 | | 4, 9, 7 | | 6, 8, 5 | 各行を'|'で囲ったベクトルで表現する形になります(上の例は 3 x 3の行列を表しています)。 また、行ベクトルは通常どおり(3,2,1)のように表現しますが、列ベクトルは縦長になるため、転置行列の記号Tを使って(3,2,1)Tと表現する場合があります。 あらかじめ、御了承ください。 1) 任意の比率での拡大・縮小処理 パターンを任意の比率で縮小するような場合は、パターン上のピクセルを選んで単純にプロットするのではなく、周りのピクセルの色を合成させてプロットすることで画質を向上させることができます。簡単な例をあげると、あるパターンを縦横半分に縮小するのであれば、パターンの左上から 2 x 2 の範囲のピクセルを取って
ヒトをはじめとする哺乳類において、目から入った情報を解析してモノや空間を認識するために脳の中の「視覚野 ( Visual Cortex ) 」と呼ばれる領域が使われていることが知られています。目から入ってきた信号は、最初に大脳の中の「一次視覚野 ( V1 ) 」に到達し、その中の「受容野 ( Receptive Field ) 」が反応することによって処理され、さらに高次の視覚野に伝達されていきます。「デイヴィッド・ハンター・ヒューベル ( David Hunter Hubel ) 」と「トルステン・ニルズ・ウィーセル ( Torsten Nils Wiesel ) 」は、1959 年に、ネコを使って視覚野のニューロンの電気信号を調べる実験の中で、個々の細胞が特定の傾きを持った線分に対して反応することを発見し、この業績によって 1981 年にノーベル生理学・医学賞を受賞しました。さらに、J
人は、目から得られるたくさんの情報を常に処理し、それに対して判断を行っています。目に映るモノ全てに対してそれが何かを一々判断していたのでは、特に瞬時の判断が必要な場合は生死に関わることになる可能性もあります。車の運転中、前の車が急停車したという情報を処理するときは、目の前に近づいてきた車やそのブレーキランプを見て判断すれば充分なのに、周囲の景色や道路標識なども常に処理されていては判断が間に合わなくなります。そのため、本当に注目すべきモノだけに無意識に注意を引くような仕組みが人には備わっています。これは、人に限らず他の動物にもあり、天敵などの危険から逃げたり、逆に獲物を追う時に逃げる対象の動きを瞬時にとらえるなど、常に視覚情報から注意を引く部分を抽出して、それ以外の情報はカットしてしまう機能が必要になる機会は人よりも多いことが想像できます。 今回は、注意を引く対象を見つけるための仕組みとして
RSA暗号の紹介の中で、公開鍵として二つの素数が必要となることを説明しました。サンプル・プログラムの中では非常に小さな数を使って公開鍵を作成したため、素数であるか判別するためには実際に素因数分解できるか試していたのに対し、実際の処理においては数百桁もの数値を扱うため、素因数分解を使って素数であるかを判断することは不可能になります(そもそも RSA暗号は、素因数分解が困難であることを前提にした暗号です)。実は、素数であるかどうかを判定することは、素因数分解を行わなくても可能です。素数でないことが分かったとしても、それを素因数に分解することはできないというのも不思議な気がしますが、例えば以前紹介した「フェルマーの小定理」を使えば、合成数であることは素因数分解をしなくても判断可能です。 この章では、素数であるかどうかを判定する方法について紹介したいと思います。 ● 総和(Σ)と総積(Π)の記法
Range Coder復号化処理による数直線の変化は、以下のようになります。 復号化の場合、数直線は常に0からRangeまでの範囲になります。符号が数直線上のどこに位置しているのかをチェックして、Rangeを復号化されたデータが持つ範囲に変換するところは、やはり算術符号化での処理と本質的に変わりありません。 処理方法は以上になりますが、ここでいくつかの問題を解決する必要があります。まず一つは、符号化と復号化での計算で使用している変数Range / Sizeが0になる可能性があるということで、このときはRangeを計算した結果が0になってしまうため、処理を続けることができなくなります。よってRangeの取り得る最小値は、データのサイズより大きくなければなりません。Range / Sizeが0になった場合、サンプル・プログラムでは単純にエラー終了しています。Rangeの最小値はサンプル・プログ
(3) 公開鍵暗号(Public key encryption) 第二次対戦後、コンピュータの普及により暗号の作成と解読処理にコンピュータが利用されるようになりました。黎明期には政府や軍部でしか活用されていなかったコンピュータも、トランジスタや集積回路の発明により性能が向上する一方、安価に製造できるようになり、商用化されてビジネス界にも普及するようになります。企業間の通信に暗号が利用され、暗号の標準化が求められるようになり、その中で誕生したアメリカの国家暗号規格がDES(Data Encryption Standard)でした。DESはその後、線形解読法や総当たり攻撃(Brute Force Attack)により容易に解読できることが判明し、AES(Advanced Encryption Standard)に取って代わることになります。 DESもAESも、暗号化と復号化には共通の「鍵」が必
前回、コンピュータ上での数値計算処理方法について紹介しました。二進数を使った計算を考えた場合、全ての計算を論理演算から構築することが可能です。今回はこの考え方を応用して、多倍長整数の演算について紹介したいと思います。 1) 多倍長整数の表現 「位取り記数法」を使って、任意の数を基数として数を表現することができることを前回説明しました。通常利用されている「10進法」で25という数が記述されているとき、これを16進法で表すと19、2進法で表すと11001になります。 基数として利用できる数に制限はないので、もっと大きな数を基数に使うこともできます。例えば10進法で表された12345678という数を1000進法で表せば(12)(345)(678)と記述することができます。ここで()内の数は"一桁の数"を表していることになりますが、1000個もの記号を用意するわけにもいかないので、中身は10進法
この章では、現在最も使用率の高い画像圧縮技術である(と思われる)JPEG(Joint Photographic Expert Group)法について説明したいと思います。 自然画のように、階調数が多くて色コードのパターンもより複雑になってしまうと、エントロピーが大きくなり、今まで説明したような符号化圧縮にも限界があります。そこで、今までのような可逆的な圧縮(復号した結果が元の画像と完全に一致するような圧縮法)をやめて、非可逆圧縮法を利用するアプローチが取られるようになりました。その中で誕生したのがJPEG圧縮法になります。 JPEGとはこの画像圧縮法の標準化を行うために、CCIC(Common Component for Image Communication)とISO IEC/JTC1/SC/WG1の二つのグループがジョイントして1986年に設立されたグループ名を意味します。この標準化
この章からはまた図形描画に関するアルゴリズムへ戻り、多角形の塗りつぶしについて紹介します。「塗りつぶし」といっても以前紹介したペイント・ルーチンではなくて、「中身の詰まった多角形を描く」アルゴリズムであるソリッド・スキャン・コンバージョンを使います。 1)ソリッド・スキャン・コンバージョンのアルゴリズム ソリッド・スキャン・コンバージョン(Solid Scan Conversion)のアルゴリズムは、図形の輪郭とスキャン・ライン(走査線 ; 画面の横1ライン)の交点を求め、求めた各点の間を水平線分で結んでいく処理を各スキャン・ラインについて繰り返すことで実現できます(図1)。あるスキャンラインに対して交点がいくつも存在する場合は、x座標の小さいものから順に2点ずつペアを作り、その2点間を結んでいきます。このため、図形の内側にできる閉じた領域は塗りつぶされません(図2)。 このアルゴリズム
ここでは、シード・フィル(seed fill)による閉領域の塗り潰し、いわゆるペイント・ルーチンについて取り上げたいと思います。 シード・フィル アルゴリズムは、以下のような流れになります。 塗り潰しの開始点(シード)として指定した 1ピクセルを塗る 今塗ったシード・ピクセルの周囲から塗り潰すべきピクセルを探す そのピクセルを新たなシードとして 1,2と同様の処理を繰り返す 新たなシードとなるピクセルがなくなった時点で塗り潰しは完了している 2のステップで見つかるシードの候補は一点だけとは限らないので、見つけたシードの候補は全てどこかに記憶しておく必要があります。そのあたりを考慮してアルゴリズムを練り直すと次のようになります。 シードとして指定した 1ピクセルを塗る 今塗ったシードピクセルの周囲から塗り潰すべきピクセルを探し、シードの候補としてその座標をバッファに記憶する バッファから 1
前章では、補間処理を利用した拡大・縮小処理の高画質化を行ってきましたが、補間処理とは異なる方法を使ったエイリアシングの抑制(アンチエイリアシング; Anti-aliasing)として、この章では「スーパーサンプリング(Supersampling)」を紹介したいと思います。 補間処理は、ピクセルの値を利用して連続関数を再現し、ピクセル間の値を求めることによって任意の位置の色コードを決めていました。どの処理についても共通していることとして、ピクセルと同じ位置の値は変化しないということがあります。そのため、例えば画像を縦横ちょうど半分のサイズに縮小するような場合、最近傍法を含むどの補間処理を利用しても結果は同じであり、画像の中の 1/4 の情報は切り捨てられてしまいます。 前の章の最初に紹介した「任意の比率での拡大・縮小処理」において、縮小処理では周囲のピクセルと合成することによって情報の欠落を
前章にて、固有値と固有ベクトルの紹介をしました。空間の一次変換に対し、固有ベクトルは大きさが固有値倍されるだけで、向きを変化させることはありません。この性質は様々な分野で利用され、そのため固有値を解くことが非常に重要なものになります。この章では、様々な分野で広く用いられている対称行列の固有値を求めるためのアルゴリズムを紹介したいと思います。 ● 総和(Σ)の記法について 総和は通常、以下のように記述します。 n Σ k (1からnまでの自然数の和) k=1 しかし、HTML形式のドキュメントで表現しようとすると非常に見づらくなるため、ここでは以下のように表現するようにします。 Σk{1→n}( k )
になるので、x = 0, 1, ... 5 を代入して y = 0, 0.6, ... 3 を求め、その結果を順にプロットしていけばよいことになります(当然、各点の座標値は整数でなければならないため、実際には計算値の小数部を四捨五入して (0,0),(1,1),...(5,3) をプロットします)。 しかし、傾きが急な線分 (m > 1) の場合、Y座標の増分が1より大きくなって、とびとびにプロットされる事になるため、「X座標を変化させつつY座標を求める」のではなく「Y座標を変化させつつX座標を求める」ことになります。 ここで 0≦m<1の場合のみを考えます。この時、直線の傾きは右上がりで 45°より小さくなります。 上の例では各座標毎にxを代入してyを求めていましたが、xが1増えるとyはmずつ増加する事に着目すると、
画像を拡大・縮小する場合、通常利用される方法として、「最近傍法(Nearest Neighbour)」や「線形補間法(Bilinear Interpolation)」に代表されるサンプル補間法があることを以前紹介しました。最近、サンプル補間法とは概念のまったく異なる画像の拡大・縮小方法として「シーム・カービング(Seam Carving)」が注目され、すでに実用的なアプリケーションも誕生しています。この手法は、画像のリサイズ処理だけに限らず、特定のオブジェクトの除外や再配置など、応用範囲が非常に広いため、これからも様々な目的に応用される可能性があるアルゴリズムです。今回は、この「シーム・カービング」について紹介したいと思います。 ブラウザは、世界中に散らばった様々なコンテンツを閲覧することができる便利なツールです。その中で、画像や動画を表示したり、場合によっては音楽を聴くこともできますが、
このページを最初にブックマークしてみませんか?
『Fussy's HOMEPAGE』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く