カテゴリー別アーカイブ: programming

ClosedXMLによるC#からのExcelファイル生成/読込を少し試してみる

ClosedXMLによるC#からのExcelファイル生成/読込をもう少し進めて、試してみました。
なお、ClosedXMLのプロジェクトサイトはhttps://closedxml.codeplex.comです。

以下は思ったことです。

  • わりと良い感じで、十分実用になりそう。1000 * 1000のセルへの書き込みで10秒強。
  • インプット値の入力、レポートの出力に使う程度が良いか。あまり複雑なことをやって変になっても嫌ですし。
  • 入力は、Dictionary<string, List>の形で読込み、あとはプログラムで好きなように使用するのが分かりやすそう。
  • 出力は、名前(string)と値(List)を持つRecordクラスを作り、Listを受け取ってExcelに出力するのが分かりやすそう。

コードはこんな感じです。
https://gist.github.com/threecourse/67c18cf9101d94b32220

クラスタリングをやってみる

Society Of ActuariesのCompAct誌に載っているクラスタリング手法について試してみました。
https://www.soa.org/Library/Newsletters/Compact/2009/July/com-2009-iss32.pdf
k近傍法と呼ばれる手法の変形のようで、通常のk近傍法では最も近いセルを統合するところ、この手法では(セル間の距離×セルのサイズ)が最も小さいセルが統合されるようです。

CompAct誌にはRコードが載っていますが、理解のためにPythonで書き直してみました。
https://gist.github.com/threecourse/d69b82a54241afdeccb0#file-cluster_logic_sample-py

これだと速度が遅すぎるので、少し速く動くようにロジックを修正し、C#でも書いてみました。
https://gist.github.com/threecourse/d69b82a54241afdeccb0#file-clustering-cs

クラスタリングを試してみた結果は以下の図のとおりで、なんとなくうまくいっているようです。
青の円がもともとのセル、赤の円がクラスタリング後のセルを表しています。
cluster

しかしながら、計算量O(n^2 * logn)はともかく、メモリ使用量がO(n^2)というのがいまいちで、10000セルくらいで限界を迎えてしまうようです。
KDTreeというものでもう少し効率的にできるらしいので、次回はそれを試してみようとおもいます。