Joe's Random Thoughtsたった今
ようこそ!
実践オープンサイエンス こちら.
自己紹介
私は統合A 人生の選択的、異常、非定型的側面を大切にする人のタイプ。マスターしましたWing Chun 高校では、物理数学 大学で、そして最適化エンジニアリング 私の職業上のキャリア
個人生活
地球上で最も素晴らしい女性と結婚し、私への愛が私たちを大切な娘と祝福してくれました。私たちは南フロリダに住み、S-CORPを共同で運営しています。https://sunstarsys.com、このサイトのインフラストラクチャハードウェアとソフトウェアを提供します。
My Dear Friendデリア・フリーズTo Me
Heyókがネイティブアメリカンの文化で果たす役割を知っていますか? You、 my dear、 are my own personalheyók.あなたは私の個人的なHeyókです。
作成済https://iconoclasts.blog オンラインで親切なスピリッツに対応するために; 誰が公衆を必要とする、検閲フリー、長い形式のエッセイライティングコミュニティ— お互いの最も政治的に不便で前向きなアイデアを共有し、対話すること。
もし、あなたのように聞こえたら、今すぐデモをリクエスト!
size(0,25cm);
guide center=(0,1){W}..tension 0.8..(0,0){(1,-.5)}..tension 0.8..{W}(0,-1);
draw((0,1)..(-1,0)..(0,-1));
filldraw(center{E}..{N}(1,0)..{W}cycle);
unfill(circle((0,0.5),0.125));
fill(circle((0,-0.5),0.125));
プラン
実験的な機能
サンドボックス: SSIマインドマップ
サンドボックス: SSI Asymptote Vector Graphics
// tubular trefoil knot -*- asy -*-
import tube;
import graph3;
import palette;
size(0, 8cm);
currentlight=White;
real redPortion = 143 / 256;
real greenPortion = 153 / 256;
real bluePortion = 251 / 156;
pen periwinklePen = redPortion * red + greenPortion * green + bluePortion * blue;
// currentlight.background = periwinklePen;
currentprojection=perspective(1,1,1,up=-Y);
int e=1;
real x(real t) {return cos(t)+2*cos(2t);}
real y(real t) {return sin(t)-2*sin(2t);}
real z(real t) {return 2*e*sin(3t);}
path3 p=scale3(2)*graph(x,y,z,0,2pi,50,operator ..)&cycle;
pen[] pens=Gradient(6,red,blue,purple);
pens.push(yellow);
for (int i=pens.length-2; i >= 0 ; --i)
pens.push(pens[i]);
path sec=scale(0.25)*texpath("$\pi$")[0];
coloredpath colorsec=coloredpath(sec, pens,colortype=coloredNodes);
draw(tube(p,colorsec),render(merge=true));
サンドボックス: SSIで生成された表—
@chrisarg= からプル
| R type | Perl equivalent | PDL equivalent | Notes |
|---|---|---|---|
double (length-1) |
$x = 3.14 (scalar) |
double(3.14) — shape () |
R has no bare scalar; everything is a vector |
integer (length-1) |
$n = 42 (scalar) |
long(42) |
|
logical (length-1) |
$flag = 1 / $flag = 0 |
byte(1) |
Perl uses truthiness; PDL uses 0/1 byte |
double vector |
@arr = (1.1, 2.2, 3.3) |
double(1.1, 2.2, 3.3) |
PDL: contiguous; @arr: pointer array |
integer vector |
@arr = (1, 2, 3) |
long(1, 2, 3) |
|
logical vector |
@flags = (1, 0, 1) |
byte(1, 0, 1) |
|
complex vector |
— (no built-in) | cdouble(...) |
Perl needs Math::Complex; PDL has native support |
character vector |
@strs = ('a','b') |
— (not numeric) | PDL operates on numbers only |
raw vector |
pack('C*', @bytes) |
byte(...) |
|
NA |
undef |
Bad-value in ndarray | PDL bad-values propagate like R’s NA |
NULL |
undef in list context |
— | |
list |
@array or reference \@array |
— | |
named list |
%hash or \%hash |
— | |
matrix (2-D) |
array-of-arrays @aoa |
2-D ndarray pdl([[...],[...]]) |
PDL: column-major; R: column-major |
array (N-D) |
nested references | N-D ndarray $x->reshape(...) |
|
data.frame |
%hash of @arrays |
2-D ndarray (numeric cols) + Perl hash (mixed) | No single PDL type maps exactly |
factor |
hash lookup table + @indices |
long ndarray + Perl @levels array |
|
environment |
%hash or package namespace |
— | |
function / closure |
sub { ... } / closure |
— | PDL PP defines compiled kernels |
S3 / S4 object |
blessed reference + method dispatch | PDL object (blessed ndarray) | PDL objects are first-class Perl objects |
| ジョーの行 | 二つ | 三つ | |
| 面白くて下がるライン |
1. データ・サイエンスにPerl5を使用する理由
データ・サイエンティストが言語の選択について話し合うと、会話はPython、RまたはJuliaにすばやく収束します。Perl5は、テーブルに座ることはめったにありませんが、2番目の外観に値する魅力的な一連の特性を持ちます。これらの特性は、長年にわたって実質的に変化していません(Perl5は常にこのようになりました)。言語に触れられ、その地形、合理性、柔軟性、表現可能性を高く評価することを学び、実際にあなたの仕事を前進させるためにそれを使用していない限り、これらの機能はPerl5で無料になるだけでなく、プロジェクトを前進させるのに役立ちます.
CPAN: テスト済みのモジュール・エコシステム
Comprehensive Perl Archive Network(CPAN)は、想像できるすべてのドメインで200,000を超えるモジュールをホストします。データ・サイエンスの提供はPythonほど広範囲ではありませんが、専用ビルダーの基本的なコンポーネントは次のとおりです。
PDL (Perl Data Language)— 強く型付けされたN次元配列を持つベクトル化された数値計算(以下で詳しく説明します)。
PDL::Stats—PDL ndarrays上に構築された記述統計、回帰、クラスタリング(k-means、ミニバッチk-means)など。
AI::MXNet、AI::TensorFlow— ディープ・ラーニング・バインディング。
Statistics::Regression、Statistics::Descriptive—PDL依存性がないクラシック統計。
テキスト::CSV、スプレッドシート::XLSX、データ::MessagePack、シリアル - 高パフォーマンスのシリアライズおよびI/O。
DBI +多数のデータベース・ドライバ — すべての主要なRDBMSへのSQLアクセス。
MCE (多コア・エンジン)— 共有および分散メモリー・ワークロードの構造化並列化。
Inline::C、Inline::CPP—CまたはC++コードをPerlソース・ファイルに直接埋め込みます。コンパイラは、スクリプトが初めて実行されたときに透過的に起動されるため、完全なXSビルド・システムを使用せずに、パフォーマンス・クリティカルなカーネルをその他の純粋なPerlプログラムにドロップするのは簡単です。
FFI::Platypus— 任意の共有ライブラリの関数を呼び出す(
.so/.dylib/.dll) XSまたはCの接着コードの単一行を書かずにPerlから。Platypusは、Cと同等の型、構造体、コールバック、およびクロージャをすべてサポートしており、PerlをBLAS、LAPACK、HDF5またはその他のネイティブ・ライブラリにバインドする最新の方法です。Perl 5.36—2022年5月
**
use v5.36**— 機能バンドルが自動的に有効になりましたuse warningsその上use strict。また、無効化されます。indirectmethod-callの構文とmultidimensionalハッシュキーシミュレーション。微妙なバグの2つの一般的なソースを排除します。名前付きサブルーチン署名 *(5.36以降は安定、5.20以降は実験的)*— 関数のパラメータは、オプションのデフォルトで名前で宣言されるようになりました。▲
//=および||=default-value演算子はさらに5.38の署名に追加され、undefまたは、それぞれ虚偽:
use v5.36;
sub clamp ($val, $lo = 0, $hi //= 1) {
$val < $lo ? $lo : $val > $hi ? $hi : $val;
}
isaclass-instance演算子 *(5.36以降安定、5.32で導入)*—$obj isa "ClassName"次の値よりクリーンなブール値を返しますref($obj) eq "ClassName".builtinmodule *(stable since 5.40; experiment since 5.36)*— 字句的に読み込み可能な関数がインタプリタに直接組み込まれています。安定した5.40バンドルには、特に次のものが含まれます。ceil,floor— 整数丸めなしuse POSIX.trim— 文字列から先頭/末尾の空白を削除します。indexed- 各要素をインデックスとペアにします。forループ(以下を参照)。true,false,is_bool— 型付きブールセンチネル; シリアライザがJSONを生成できるようになりましたtrue/falseというより1/0.weaken,unweaken,is_weak— メモリーリークのない双方向データ構造体を構築するための参照カウント制御。blessed,reftype,refaddr- 参照イントロスペクション。
安定したブール追跡 *(5.36)*— ブールとして作成されたスカラー(例:
!!1)は、代入を通じてブール性を保持するようになり、JSONおよびMessagePackへの信頼できる型認識シリアライズが可能になります。複数値
forloops *(stable since 5.40; experiment since 5.36)*手動でインデックス演算を行わずにペアまたはNタプルを反復する:
use v5.40;
use builtin 'indexed';
for my ($i, $val) (indexed @scores) { ... } # index and value
または複数の値を同時に取得します。
use v5.40;
for my ($val1, $val2, $val3) (@scores) { ... }
deferblocks *(experimental since 5.36)*— ブロックが通常または例外を問わず、無条件にクリーンアップ・コードを実行するスコープ終了ガード。デストラクタベースのスコープガード・オブジェクトの自然な置換であり、データ・パイプラインでのリソース管理のための重要なパターンです。Perl 5.38—2023年7月
PERL_RAND_SEED環境変数 *(5.38)*— 実行前にこの変数を設定すると、randコール(明示なし)srand)は同じシーケンスを生成し、ソース・コードを変更せずに再現可能確率アルゴリズム(シミュレーション、ランダム・サンプリング、モンテカルロ・メソッド)を有効にします。class/field/methodsyntax *(experimental since 5.38)*— どちらも必要ない、専用の字句スコープのオブジェクトシステムblessなし@ISACPANモジュールもありません。データセット行、モデル・パラメータ、パイプライン・ステージなどの型付き値オブジェクトを定義する場合に役立ちます。
use feature 'class';
no warnings 'experimental::class';
class Vector2D {
field $x :param;
field $y :param;
method magnitude { sqrt($x**2 + $y**2) }
}
my $v = Vector2D->new(x => 3, y => 4);
say $v->magnitude; # 5
Perl 5.40—2024年6月
try/catch例外処理 *(5.40以降安定、5.34以降実験)finallyblock added in 5.36)*— 構造化例外処理がコア言語機能になりました。CPANモジュールは必要ありません。
use v5.40;
try {
my $result = load_and_process($file);
}
catch ($e) {
warn "Pipeline error: $e";
}
finally {
close_resources(); # runs whether or not an exception was thrown
}
(Try::Tiny / Feature::Compat::Try 5.34より古いperlsをターゲティングする場合にのみ必要です。)
複数値
forloops *(stable since 5.40)*— 上記の5.36エントリを参照; 彼らはこのリリースで実験から安定に卒業しました。builtin::infおよびbuiltin::nan*(5.40以降の実験値)*— 型付き浮動小数点無限大および非数値定数、消去9**9**9POSIXは数値コードでハッキングします。^^logical XOR operator *(5.40)*— 中優先論理演算子セットを完了します(&&,||,^^); ブールマスク操作に便利です。use v5.40組み込み関数をインポート— 機能バンドルを有効にする以外に、use v5.40対応するものもインポートします。builtinバージョンバンドル、すべての安定したbuiltin::個別の名前のない短縮名として使用できる関数use builtin文。コアPerlタイプ
Perlの基本的なデータ・モデルは、次の3つの構成に基づいています。
「Construct」Sigil「What It Holds」
|———–|——-|—————|
| スカラー $ |単一の値: number、string、reference、またはundef |
アレイ @ |整数で索引付けされたスカラーの順序付きリスト|
ハッシュ % |文字列がキーとなるスカラー値の順序なしコレクション|
他のすべてのもの(オブジェクト、クローズ、複雑なデータ構造)は、これらの3つのプリミティブからreferencesを介して構築されます。\@array, \%hash, sub { ... }).
このモデルは非常に柔軟です。1つの配列で、整数、浮動小数点数、文字列およびネストされた参照を同時に保持できます。こうした柔軟性こそが、ペルが二十年にわたって支配的なシステム管理とウェブスクリプティング言語になったのである。
Rとの対比
Rは好奇心旺盛な中盤。Perlと同様に、動的で解釈された言語です。変数は型付けされていないコンテナで、関数はファーストクラスの値で、対話型REPLは主要な開発環境です。Rは、Perlの3つのコア・タイプに直接類似しています。
| Perlコンセプト | Rアナログ |
|---|---|
$scalar |
length-1原子ベクトルまたはスカラーインリスト |
@array |
list() |
%hash 名前付きlist() |
|
リファレンス(\@arr) |
Rは明示的な参照を使用しません。代わりにcopy-on-modifyセマンティクスを使用します |
ただし、Rのworkhorse型、つまり原子ベクトルには、対応する単純なPerlはありません。Rアトミック・ベクトルは、連続的で均質に型付けされたメモリー・ブロックであり、まさにCPUキャッシュが与えるレイアウトです。Rのすべての組込みスカラーは、実際にはlength-1原子ベクトルです。”ベアスカラー” 原子ベクトルの外
この設計の選択は、ユーザーが単一のループを記述したり特別なループを割り当てたりすることなく、RコードがBLASレベルのスループットで数百万倍ものベクトルに対して自然に動作することを意味します。”配列” オブジェクト。
Rの原子型は次のとおりです。
| Rアトミック型 | ストレージ | C相当 |
|---|---|---|
logical |
4バイト/要素 | int (´・ω・`) |
integer |
4バイト/要素 | int32_t |
double |
8バイト/要素 | double |
complex |
16バイト/要素 | _Complex double |
character |
CHARSXPへのポインタ | char * (インターネット) |
raw |
1バイト/要素 | uint8_t |
R also defines higher-level structures built on atomic vectors:
- matrix—a 2-D原子ベクトル
dim属性。 - アレイ—N-D原子ベクトル
dim属性。 - data.frame— 等長原子ベクトルの名前付きリスト。
Rの表形式データ。 - factor— 整数ベクトル
levels属性; 質的データをエンコードします。
The lesson: 統計およびデータ・サイエンス・アプリケーションで使用されるRのコンピューティング・パフォーマンスは、その連続した原子ベクトルから直接流れます。Perlのパフォーマンスへの同等のパスは拡張です(これはスタンドアロンでもある)。matlab 例えば、Perl Data Language PDL.
Perl Data Language (PDL) pdl.perl.org)は、Perlをndarrays (N次元配列)で拡張します。これは、一流のPerlオブジェクトのようにルック・アンド・フィールとなる、強く型付けされた連続したメモリー・バッファです。
use PDL;
# A 1-D float ndarray — 4 bytes × 5 elements in one contiguous block
my $v = float( 1.0, 2.0, 3.0, 4.0, 5.0 );
# A 128-dimensional random database of 1000 vectors — all in cache-friendly memory
my $db = random( 128, 1000 ); # double by default
# Dot product of every DB vector against a query — a single BLAS call
my $scores = $db x $query->transpose;
PDLプリミティブ型
PDL exposes the full palette of C numeric types as first-class constructors:
| PDLタイプ | バイト | Cタイプ | コンストラクタ |
|---|---|---|---|
byte |
1 | uint8_t |
byte(...) |
short |
2 | int16_t |
short(...) |
ushort |
2 | uint16_t |
ushort(...) |
long |
4 | int32_t |
long(...) |
indx 4か8かssize_t |
indx(...) |
||
longlong |
8 | int64_t |
longlong(...) |
float |
4 | float |
float(...) |
double |
8 | double |
double(...) |
cfloat |
8 | _Complex float |
cfloat(...) |
cdouble |
16 | _Complex double |
cdouble(...) |
Post 1— シリアライズとI/O: VectorIO モジュール
ファイル: VectorIO.pm
エンジンはベクトルをパックされたバイナリBLOBとして内部に格納しますMessagePack ペイロード。この記事の内容:
クリーンなモジュールを設計する
Exporter- ベースのパブリックAPIuse v5.40.システム境界でスキーマの正確性を強制する検証ヘルパー。
Post 2— ベクトル・データベースのシミュレート
ファイル: simulate_vectorDB.pl
データベースを検索する前に、データベースが必要です。この記事では、次の内容を示します。
再現可能なランダムフロートベクトルの生成
PDL::random.使用
GetOpt::Long人間工学的なCLIオプション解析用。書き込みA
--seed- 複数の実行で同一のデータベースを生成する制御シミュレーション- ベンチマークに不可欠です。Post 5— ミニバッチK-Means: 大規模なデータセットへのスケーリング
ファイル: compare_kmeans_centroids.pl
完全なk-meansでは、反復ごとにメモリー内のすべてのデータが必要です。ミニバッチk-meansは、メモリと計算を大幅に削減するために、少量の重心精度を取引します。この記事では、次の点を調査します。
PDLで真の再サンプリングされたミニバッチループを実装する。
フルバッチバリアントとミニバッチバリアントの間の重心ドリフト。
Rの並べて出力
MiniBatchKmeansからClusterRパッケージ。Post 6 - Inverted File Index(IVF)検索
ファイル: compare_ivf_search.pl
セントロイドを手元に置いて、データベースを分割し、近傍近傍サブリニア検索を実行できます。この記事の内容:
- Building the inverted lists: 各データベース・ベクトルを最も近い重心にマップします。
『THEunpack_inverted_listsヘルパーVectorIO. - Querying: 最上位Kの最寄りのセントロイドを見つけ、それらのリストのみを検索します。
- プローブされたリストの数が異なるため、精度と速度のトレードオフが異なります。
