地球温暖化の原因となる二酸化炭素を減らそうと、ある木を育てる実験が静岡県御前崎市で行われています。あっという間に成長するという特徴を生かし、地球温暖化対策はもちろん、高級木材の確保という一石二鳥の効…
はじめに Gitのインデックスの中身、Gitのブランチの実装に続く、Gitの中身を見てみようシリーズです。Gitが管理するオブジェクトの種類や中身について見てみます。基本的にはPro Gitの10. Gitの内側をまとめなおしたものです。 オブジェクトの種類 Gitは、内部でファイルやコミットを「オブジェクト」として.git/objects以下に保存しています。オブジェクトには以下の4種類があります。 blobオブジェクト: ファイルを圧縮したもの。ファイルシステムの「ファイル」に対応 treeオブジェクト: Blobオブジェクトや別のTreeオブジェクトを管理する。ファイルシステムの「ディレクトリ」に対応 コミットオブジェクト: Treeオブジェクトを包んだもの。コミットのスナップショットに対応するTreeオブジェクトに、親コミット、コミットメッセージなどを付加する タグオブジェクト:
はじめに 書籍化 本記事を元に ゲームで学ぶ探索アルゴリズム実践入門~木探索とメタヒューリスティクス という書籍を出版することになりました! 本記事を読んで気になっていただけたらご購入をご検討いただけるとうれしいです! この記事で得られる技術 ゲームルールに適した探索アルゴリズムを選択する ゲーム木探索をするのに適したクラス設計 主要なゲーム木探索アルゴリズムの実装 この記事の特徴 汎用アルゴリズムの実装例による他ゲームへの応用力と、実際に動作可能なサンプルコードによる具体的実装イメージの両視点でわかりやすくした(片方しか記載のない記事が多い) サンプルコード付き日本語記事がほぼないDUCTを解説している サンプルコードは印のついたメソッドを実装したクラスさえ書けば、アルゴリズム部分を変更せずそのまま他のゲームで動作可能になっている この記事で扱わない関連技術 探索の高速化 多様性の確保
こんにちは。LegalForce Researchで研究員をしている神田 (@kampersanda) です。 LegalForce Researchでは現在、高速なパターンマッチングマシン Daachorse(ダークホース)を開発・運用しています。文字列処理の基礎である複数パターン検索を提供するRust製ライブラリです。以下のレポジトリで公開されています。 github.com 本記事はDaachorseの技術仕様を解説します。具体的には、 複数パターン検索に関係する基礎技術(トライ木・Aho–Corasick法・ダブル配列) Daachorseの実装の工夫と性能 を解説します。 以下のような方を読者として想定します。 文字列処理アルゴリズムやデータ構造に興味のある方 自然言語処理の要素技術に興味のある方 Rustライブラリに興味がある方 Daachorseについて 複数パターン検索の基
この記事について この記事では、一部で全方位木DP、Rerooting等と呼ばれているアルゴリズムの紹介/解説と、その実装についての簡単な説明を行います。 全方位木DPなどと物騒そうな名前がついていますが、発想自体は全く難しくありません。また、実装もそこまで難しいものではないです。 前提知識として、最低限のグラフ理論の知識(特に木構造について)を要求します。(有向木の根/部分木等…) 謝辞 この記事中に挿入されている図は、殆どを @259_Momone さんに提供して頂きました。素晴らしく美しい図を提供して頂き、この記事を分かりやすいものとして頂いたことに感謝いたします。 全方位木DPとは 各点から深さ優先探索を行って解くことができる問題のうち特定の条件(後述)を満たすものについて、全頂点についての答えを同等の計算量で求めることができるアルゴリズムです。 まず、全方位木DPで解くことができ
ABEJAでデータサイエンティストをしている小林です。 今回は、もしかしたらいつか業務や機械学習コンペに役立つかもしれない情報、LightGBMで弱教師あり学習を行う方法についてお話します。 コードはこちらで公開しております。 目次 はじめに 弱教師あり学習の例(マルチインスタンス学習) LightGBMで弱教師あり学習がしたい! PU分類 問題設定 解き方 LightGBMの実装 実験 Partial Label Learning 問題設定 解き方 LightGBMの実装 実験 マルチインスタンス学習 問題設定 解き方 LightGBMの実装 実験 おわりに はじめに 機械学習を行うためには、一般的に、大量の入力データと、それら一つ一つに対応した正確なラベルが必要です。 例えば、犬と猫の画像分類を行う場合には、それぞれの画像一つ一つに犬か猫のラベルがついていてほしいですね。 一方で場合に
xgboostでどのような処理が行われているのかを、メモの意味でまとめてみました。 たぶん続きます。なお、あくまで私の理解であり、正確性の保証は無いのでご注意下さい。 ソースコードは以下を参照しています。 https://github.com/dmlc/xgboost (release_0.90を参照) 前提 以下の前提とする: ブースター(booster)はgbtree 決定木のアルゴリズム(tree_method)はexact カスタム目的関数を使わない GPUの使用、マシン並列を行わない xgboostでは、tree_methodオプションで決定木を作成するアルゴリズムを選択できる。 デフォルトではデータ数が一定未満の場合にはexact、それ以上であればapproxが適用される。 (4UL << 20UL = 4194304件が境目、GBTree::PerformTreeMethod
この記事の目的GBDT(Gradient Boosting Decesion Tree)のような、決定木をアンサンブルする手法において、特徴量の重要性を定量化し、特徴量選択などに用いられる”Feature Importance”という値があります。 本記事では、この値が実際にはどういう計算で出力されているのかについて、コードと手計算を通じて納得することを目指します。 なお、この記事は3回シリーズの第2回で、最終的にcatboostのfeature importanceの算出方法を理解するのが目的です。ここでは、用意されているfeature importanceの計算方法がわかりやすいxgboostを使います 第1回: Catboostの推論の仕組みを理解する 第2回: Feature Importanceの計算を理解する (イマココ) 第3回: CatboostのFeature Impor
Includes about 1,130 operating systems so far Last updated: April 2023 In this post you'll find a family tree and timeline of operating systems. I have tried to include all operating systems, no matter how old or obscure. Of course, a complete list is virtually impossible, as there is no way to catalogue all the tiny hobby and embedded systems that may exist somewhere. Please also note that I only
株式会社ブレインパッドでデータサイエンティストをしている23新卒の泉です。 この記事はBrainPad Advent Calender 2023 24日目の記事シリーズ2です。 今日はクリスマスイブですね。ということで「ツリー」に関連して決定木について紹介します。 Bayesian CARTとは Bayesian CART(Bayesian classification and regression tree)は、Chipmanら(1998)において提案されたベイズ的な考え方に基づく決定木です。 Bayesian CARTの概要は次の通りです。 決定木とその終端ノードを確率変数とみなした上で尤度と事前分布を設定し、決定木の事後分布を導出します。 決定木の事後分布からメトロポリス・ヘイスティングス法を用いて大量の決定木をサンプリングします。 サンプリングした決定木の事後確率をもとに「よい」決
近年の研究では、自然の中で過ごすことは脳卒中での生存率が上がったり糖尿病のリスクが下がったりといった健康面でのメリットや、幸福度を向上させる効果があると判明しています。ドイツのライプツィヒに住む約9800人を対象とした調査によって、街路樹に「うつ病の抑止効果」がある可能性が新たに示唆されました。 Urban street tree biodiversity and antidepressant prescriptions | Scientific Reports https://www.nature.com/articles/s41598-020-79924-5 Street trees close to home may reduce the risk of depression | The Independent https://www.independent.co.uk/news/s
As part of a recent personal journey to better understand databases and better learn Rust, I have recently took on the project of writing a simple key-value storage engine. Crazy, right? Lets get started! B-Trees vs LSM TreesThe first thing one must think of when writing a key-value storage engine is -”How should I store my data so that I can perform reads and writes efficiently?”; The two most co
ロンドン(CNN) ローマ帝国時代の英国に築かれた城壁遺跡「ハドリアヌスの長城」で、樹齢200年を超す名木が切り倒されているのが見つかり、警察は16歳の少年を逮捕したことを明らかにした。 切り倒されたシカモア(セイヨウカジカエデ)は、イングランド北部ノーサンバーランド国立公園にあり、ケビン・コスナー主演映画「ロビン・フッド」(1991年)に登場したことで世界的に有名になった。 警察によると、木は28日にかけて切り倒されたとみられる。 現場は「シカモア・ギャップ」と呼ばれる名所で、イングランドで有数の写真映えスポットとして知られる。切り倒された木は2016年のイングランドの木に選ばれた名木だった。
勾配ブースティング決定木 (Gradient Boosting Decision Tree; GBDT) では、以下が経験則として知られている。 学習率 (Learning Rate) を下げることで精度が高まる 一方で、学習にはより多くのイテレーション数 (≒時間) を必要とする しかしながら、上記が実際に実験などで示される機会はさほど無いように思われた。 そこで、今回は代表的な GBDT の実装のひとつである LightGBM と、疑似的に生成した学習データを使ってそれを確かめていく。 確かめる内容としては、以下のそれぞれのタスクで学習率を変化させながら精度と最適なイテレーション数の関係を記録して可視化する。 二値分類タスク 多値分類タスク 回帰タスク 使った環境は次のとおり。 $ sw_vers ProductName: macOS ProductVersion: 12.6.2 Bu
この記事は何か lightGBMやXGboostといったGBDT(Gradient Boosting Decision Tree)系でのハイパーパラメータを意味ベースで理解する。 その際に図があるとわかりやすいので図示する。 なお、ハイパーパラメータ名はlightGBMの名前で記載する。XGboostとかでも名前の表記ゆれはあるが同じことを指す場合は概念としては同じ。ただし、アルゴリズムの違い(Level-wiseとLeaf-wise)によって重要度は変わるし、片方にのみ存在するハイパーパラメータもあるので注意。 lightgbm.readthedocs.io また、記事の構成などは以下を大いに参考にさせていただいた。 nykergoto.hatenablog.jp 網羅的には以下の記事もよさげ qiita.com この記事は何か そもそもGBDTとは ハイパーパラメータ どのような決定木
こんにちは、ももやまです。 今回は2分探索木の4つの走査方法、具体的には 行きがけ順による走査通りがけ順による走査帰りがけ順による走査幅優先探索による走査 の4つの違いについてわかりやすく説明していきたいと思います! 「2分探索木ってどんなやつだっけ」、「2分探索木忘れちゃったよ」という人は下にある記事でわかりやすく2分探索木について説明しているのでぜひご覧ください! www.momoyama-usagi.com 1.2分探索木の全探索 木構造にある各ノードを1度だけ訪問することを探索(走査)と呼びます。 全探索の仕方をおおまかに分けると、 深さ優先探索(DFS)幅優先探索(BFS) の2つとなります。 さらに、深さ優先探索はさらに 行きがけ順(先行順 / 前順 / preorder)通りがけ順(中間順 / 間順 / inorder)帰りがけ順(後行順 / 後順 / postorder)
git init をすると、 .git と言うディレクトリが作られます。 Gitに必要なファイルは全てこのディレクトリに含まれているのですが、普段はあまり意識しない人の方が多いと思います。 今回は .git ディレクトリの中身を少し探検してみましょう。 .gitディレクトリの構成 まずは git init して .git ディレクトリを作成してみます。 .git の中身はこのようになっています。 . ├── HEAD ├── branches ├── config ├── description ├── hooks │ ├── applypatch-msg.sample │ ├── commit-msg.sample │ ├── fsmonitor-watchman.sample │ ├── post-update.sample │ ├── pre-applypatch.sample │
SQLアンチパターン第2章を自分なりに噛み砕く。 階層構造とは いわゆるTree Strcture(木構造)。 例として上げるのであれば、 Reditのコメント ファイラ(フォルダ・ディレクトリ) . WindowsのExplorer . MacのFinder。 Shell ブログのカテゴリ DOM Tree ここではフォルダを想定する。 隣接リスト(Adjacency List) Tree-Structure/adjacency_list at main · teitei-tk/Tree-Structure · GitHub 単純に考えると、各フォルダに親のフォルダを参照させるやり方が想定される。 しかし、このままだとフォルダ構成が深い場合、単一のSQLで取得することが難しい。実際に見てみる。 フォルダ構成は下記 table CREATE TABLE IF NOT EXISTS `adj
Musubi AI在庫管理の機械学習エンジニアをやっている中野です。 こちらの記事は カケハシ Advent Calendar 2023 の1日目の記事になります。 昨年はprophetについて書きましたが今年は勾配ブースティングにしました。 医薬品や食料品、アパレルなどの需要予測において平均値ではなく95%点や99%点を要求されるケースがままあります。 例えばコンビニおにぎりの在庫管理において需要予測の平均値だけ発注していれば2回に1回程度は欠品してしまうでしょう。こういった場合に予測の95%点を発注すれば欠品をおよそ20回に1回へと低減できます。 GBDTでもこのような確率点を返す予測が可能なのですが解釈や使い方には注意が必要そうです。 分位点回帰とは MAEを最小化するモデルが中央値を予測しているのはよく知られていますが分位点回帰はこれを一般化したものです。 分位点回帰では以下のよう
成長が早いエリートツリーは脱炭素の観点からも注目されている Photographer: Takashi Umekawa/Bloomberg 従来種より成長速度が1.5倍、二酸化炭素(CO2)の吸収量も1.5倍。優れた樹木同士を掛け合わせて作られた「エリートツリー」が今、脱炭素の観点から注目を集めている。 温暖化対策にはCO2の排出量削減に加え、森林などの吸収源の確保も不可欠。林業が黒字になりにくい構造的な問題を抱える中で、いかに普及拡大を図れるかが課題となる。 隅田川のほとり、東京都北区にある日本製紙の研究開発本部。敷地内のビニールハウスで栽培されているのがエリートツリーの苗木だ。同社は1月、大手企業では初となるエリートツリーの苗木生産の本格化を発表し、今後は9万ヘクタールの社有林に順次植えていくとしている。 「森林資源は当社グループの事業基盤であり、CO2の吸収効率が高く『早く育つ木』は
概要 コマンドのtreeみたいな感じで、Python上でファイルやディレクトリのツリー構造をいい感じに出力する関数を作ったのでメモ。 結論 下記の関数にツリーで表示したいディレクトリのパスを与えれば良い。Mac用に実装しているので、パスがスラッシュで区切られないような場合は非対応。 import pathlib import glob import os def tree(path, layer=0, is_last=False, indent_current=' '): if not pathlib.Path(path).is_absolute(): path = str(pathlib.Path(path).resolve()) # カレントディレクトリの表示 current = path.split('/')[::-1][0] if layer == 0: print('<'+cur
AtCoder Library (ACL) の atcoder::lazy_segtree をもとにした Segment tree beats の抽象化の方法と,そのいくつかの具体的な使用例を紹介します.Segment tree beats は列に対する複雑な更新・取得処理を高速かつオンラインに実現する強力な手法ですが,実装の際に考慮すべきことが複雑でコーディング量も多く,体系立った実装方法の知見も整理されていないと筆者は認識しています.そこで本稿では,ドキュメントを含め極めて整備された ACL のコードをわずかに変更して Segment tree beats として使用する方法を紹介します.この方法では,様々な Segment tree beats の実装の大部分が共通化され,個別の問題に応じた機能は atcoder::lazy_segtree の利用時と同様にクラスや関数として組み込ま
こんにちは。 平衡二分探索木で2-optを高速化する方法について研究したので、本記事ではそれについて書こうと思います。 2-optとは 2-optは巡回セールスマン問題(TSP)の近似解を求めるヒューリスティックアルゴリズムです。 下図のように、サイクルに対してランダムに二つのパスを選び、パスを組み替えた方がサイクルの長さが短くなる場合、パスを組み替えます。具体的には、A→B + C→D > A→C + B→D の時、辺ABと辺CDを辺ACと辺BDに組み替えます。 しかし、辺を張り直すだけではサイクルにならないので、B~CまたはD~Aの間の順序を逆にする必要があります。 2-opt法では順路を配列などで管理することでこれを実現しています。 そしてこれが`測定で用いた2-optの実装です。 #include<iostream> #include<algorithm> #include<vec
トライ木で高速な辞書を作りたい! トライ木(英: trie)というデータ構造を知ってますか? トライ木はテキストを扱う際に良く用いられているデータ構造で、文字列を非常に高速に検索することができるため、辞書の実装などに利用されています。 本記事では、トライ木の特徴の紹介と構築方法の解説・実装を行っていきます。 最終的に単語とその読み方を入力としたトライ木を構築し、単語を入力することでその読み方を出力する辞書システムを作成します。 トライ木とは トライ木とは、上の図のようなデータ構造で、順序付き木の一つです。 この図は、例として「a」「ab」「abc」「ac」「bc」という5単語が入ったトライ木です。 ノードの左上の数字は、ノードidを表します。 id0のノードの <s> というのは先頭文字を表していて、検索の際はここからスタートします。 丸が二重になっているノードは、そのノードが単語の終端文
はじめに 第1回の記事で原著論文に沿ってXGBoostの基本事項を学習しました。(論文の2.2まで) 第2回は論文読みをさらに進めていきます。 特に勾配ブースティング法で用いられる学習率の概念をXGBoostにもそのまま適用します。学習率とラウンド数のトレードオフについて説明し、この二つのパラメータはチューニングすべきではないことを記述しました。 勾配ブースティング法とその進化版としてのXGBoost(2章) 正則化項$\Omega$(※) 前回 過学習防止のためのテクニック [今回] 木分割のアルゴリズム(3章) オンメモリ処理のための近似手法(※) スパースなデータへの対応 (※) NaNデータへの対応(※) スケールアウトのためのシステムデザイン(4章) 並列処理(+α?未読) 評価(6章) (※がXGBoostとしての特徴) しっかり読むと結構分量が多いですが、できるだけ読み進めて
こんにちは。kzです。 世の中ではやはり解釈性が重要らしいです。 shap値で解釈する前にpermutation-importanceを知る 前回、SHAP含めてモデル解釈の指標についていくつか触れました。やはり一度では僕は残念ながら理解できないので復習も含めて今回この記事を書きます。 前回の復習 上記のリンク先が前回の記事になります。 Permutation ImportancePartial DependenceLIMESHAP 雑におさらいするとPIは対象の変数をシャッフルして精度の変化からその変数の影響力を見る手法。PDは対象の変数以外を周辺化で消すことによってその変数のみの影響力を見る手法。LIMEは対象の入力データ周辺でブラックボックスモデルを線形近似しその重みでそれぞれの変数の寄与具合を見る手法。SHAPはLIMEのモデルに複数の制約(Consistencyなど)を与えてでき
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く