Joe 的隨機思維
歡迎!
我們實踐開放科學 這裡.
關於我
我是專案 A 某種類型的人,在一般的生活層面中,會發現一種聰明、不正常的人。我已掌握Wing Chun 在高中,物理數學 大學、最佳化工程 在我的職業生涯中。
個人生活
已婚給地球上最令人讚嘆的女人,她們對我祝福這兩個女兒。我們住在南佛羅里達州,並共同經營我的 S-CORP https://sunstarsys.com,提供此網站的基礎架構硬體和軟體。
親愛的朋友 Delia Frees 給我
你是否熟悉 Heyók (譯音) 在美國原住民文化中扮演的角色?你,我說的,是我自己的個人 Heyók Ca。
我已建立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 Mindmap
封閉測試環境: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 |
| Joe’s Row | 兩個 | 三個 | |
| 其他 | 有趣 | 下方 | 明細行 |
1. 為什麼選擇 Perl5 for Data Science?
當資料科學家討論語言選擇時,對話會快速融合 Python、R 或 Julia。Perl5 很少在桌子上拿了一個座位,但它擁有一套令人注目的特徵,值得一看。這些特徵多年來沒有重大變化 (Perl5 一直都是這種方式!),但除非您接觸到語言並學習欣賞其慈悲、理性、靈活性、可表達性,並實際使用它來推動您的工作,否則您不僅可以透過 Perl5 免費瞭解這些功能,還可以幫助您推動專案向前邁進。.
CPAN:經戰測試的模組生態系統
全方位的 Perl Archive Network (CPAN) 可讓每個網域擁有超過 200,000 個模組。雖然資料科學產品與 Python 幾乎不一樣廣泛,但專屬建構者的基本元件在以下位置:
PDL (Perl Data Language) — 具有強烈鍵入 N 維度陣列的向量化數值運算 (涵蓋在下方深度)。
PDL::Stats — 描述性統計資料,迴歸,叢集 (k-means,mini-batch k-means) 等,建置在 PDL ndarray 上。
AI::MXNet,AI::TensorFlow — 深度學習連結。
**統計資料::迴歸 , 統計資料::描述性 **— 沒有 PDL 相依性的傳統統計資料。
-** 文字::CSV, 試算表::XLSX, 資料::MessagePack, 穀物 **— 高效能序列化和 I/O。
DBI + 數十個資料庫驅動程式 - 對每個主要 RDBMS 的 SQL 存取權。
MCE (多核心引擎) — 共用記憶體和分散式記憶體工作負載的結構化平行程度。
內嵌::C,** 內嵌::CPP** — 將 C 或 C++ 程式碼直接內嵌在 Perl 來源檔案中;第一次執行命令檔時,會以通透的方式呼叫編譯器,讓它在沒有完整 XS 組建系統的情況下,將效能關鍵核心刪除。
FFI::Platypus — 任何共用程式庫中的呼叫函數 (
.so/.dylib/.dll) 從 Perl 而不撰寫單行 XS 或 C 膠條碼。Platypus 支援所有等同於 C 的類型、結構、回呼和關閉,是將 Perl 連結至 BLAS、LAPACK、HDF5 或任何其他原生程式庫的現代化方式。Perl 5.36 — 2022 年 5 月
use v5.36— 功能組合現在會自動啟用use warnings除了use strict。它也會停用indirect方法呼叫語法與multidimensional雜湊金鑰模擬,消除兩個常見的細微錯誤來源。指定的子常式簽章 *(自 5.36 起;自 5.20 起的實驗) * — 現在依名稱宣告函數參數 (選擇性預設值)。繁體中文
//=與||=預設值運算子已進一步新增至 5.38 中的簽名,允許觸發的預設值undef分別或虛度:
use v5.36;
sub clamp ($val, $lo = 0, $hi //= 1) {
$val < $lo ? $lo : $val > $hi ? $hi : $val;
}
**
isa類別實例運算子 ** (自 5.36 起穩定;5.32 導入) —$obj isa "ClassName"傳回布林值;清除時間比ref($obj) eq "ClassName".**
builtin模組 ** (自 5.40 起穩定;自 5.36 起的實驗) — 直接內建於解譯器的詞彙可匯入功能。穩定的 5.40 組合包包括 (其中包括):ceil,floor— 無整數捨入use POSIX.trim— 從字串分割前置 / 尾端空格。indexed— 將每個元素與其索引配對;idiomatic companion to multi-valuefor迴圈 (請參閱下文)。true,false,is_bool— 輸入布林值句子;序列器現在可以發出 JSONtrue/false而非1/0.weaken,unweaken,is_weak— 用於建立雙向資料結構且不會發生記憶體流失的參照計數控制。blessed,reftype,refaddr— 參考自我檢查。
穩定的布林值追蹤 *(5.36) * — 以布林值建立的純量 (例如,
!!1) 現在透過指派來保留其布林性質,以實現對 JSON 和 MessagePack 的可靠類型感知序列化。多重值
for迴圈 *(自 5.40 起穩定;自 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 (自 5.36 起即為實驗性) — 範圍結束保護,可在區塊結束時 (無論是一般還是透過異常狀況) 無條件地執行清除程式碼 - 自然取代以破壞者為基礎的範圍保護物件,以及資料管線中資源管理的重要模式。Perl 5.38 — 2023 年 7 月
**
PERL_RAND_SEED環境變數 ** (5.38) — 在執行前設定此變數,每個rand呼叫 (沒有明確的)srand) 會產生相同的順序,啟用 可重現 隨機演算法 — 模擬、隨機抽樣、Monte Carlo 方法 — 而無需修改原始程式碼。**
class/field/method語法 ** (自 5.38 以來的實驗性) — 專為特定目的而設計的詞彙化物件系統,不需要bless不@ISA或任何 CPAN 模組。可用於定義類型值物件,例如資料集資料列、模型參數或管線階段:
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 起實驗;finally區塊加入 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 的磁柱時才需要使用。)
多重值
for迴圈 *(自 5.40 起穩定) * — 請參閱上方 5.36 項目;它們在本版本中從實驗中畢業到穩定。builtin::inf與builtin::nan(實驗自 5.40 起) — 輸入的浮點數無限和非數字常數,消除9**9**9或 POSIX hacks in numerical code。**
^^邏輯 XOR 運算子 ** (5.40) — 完成中優先順序邏輯運算子集 (&&,||,^^);適用於布林遮罩作業。**
use v5.40匯入內建函數 **— 超出啟用功能組合,use v5.40也會匯入對應的builtin版本組合,使所有穩定builtin::函數可用為不含個別名稱的簡稱use builtin敘述句。核心 Perl 類型
Perl 的三個建構基礎資料模型中心:
| 構造 | Sigil | 它擁有什麼 |
|---|---|---|
| 定量 | $ |
單一值:數字、字串、參照或undef |
| 陣列 | @ |
依整數編製索引的已排序純量清單 |
| 雜湊 | % |
依字串鍵入的純量值未排序集合 |
其他所有項目 (物件、結案、複雜的資料結構) 都是透過 參考資料 從這三個基礎元構建而成 (\@array, \%hash, sub { ... }).
此模型具有額外的彈性。單一陣列可以同時保存整數、浮點數、字串以及巢狀參照。這種靈活性正是 Perl 20 年來主導的系統管理和 Web 文稿語言。
對比 R
R 佔據了好奇的中間地。就像 Perl 一樣,它是動態且解譯的語言 — 變數是未鍵入的容器,函數是一流的值,而互動式 REPL 則是主要開發環境。R 甚至有直接類比到 Perl 的三種核心類型:
| Perl 概念 | R 類比 |
|---|---|
$scalar |
length-1 原子向量或純量列表 |
@array |
list() |
%hash |
名稱list() |
參考 (\@arr) |
R 不使用明確的參照;改為複製修改語意 |
但 R 的 workhorse 類型,即 原子向量 沒有直向的 Perl 對方。R 原子向量是連續的,同質上打字的記憶體區塊 — CPU 快取所獎勵的佈局 。R 中的每個內建純量實際上都是一個長度為 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:
- 矩陣 — 具有 2D 原子向量的
dim屬性。 - 陣列 — N-D 原子向量與
dim屬性。 - data.frame — 具名的等長原子向量清單;lingua franca of
R 中的表格式資料。 - 因素 — 含有 1 個整數向量
levels屬性;將類別資料編碼。
The lesson: 用於統計和資料科學應用程式時,R 的運算效能會直接從其連續的原子向量流動。Perl 的同等效能路徑是擴充套件 (亦是獨立的) matlab 如環境),Perl 資料語言PDL.
Perl Data Language (PDL、pdl.perl.org) 以 ndarrays (N-dimensional Arrays) 擴充 Perl:連續、強式輸入的記憶體緩衝區,其外觀與感覺就像一流的 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
該引擎將向量儲存為內裝的二進制小點MessagePack 有效負載。本文涵蓋:
設計一個乾淨的模組
Exporter- 基礎公用 APIuse v5.40.在系統界限強制實行綱要正確性的驗證協助程式。
Post 2 — 模擬向量資料庫
檔案:simulate_vectorDB.pl
在搜尋資料庫之前,我們需要一個資料庫。此文章顯示:
產生可再現的隨機浮點向量與
PDL::random.使用
GetOpt::Long用於人體工學 CLI 選項剖析。寫一個
--seed- 受控制的模擬會在執行時產生相同的資料庫,對於基準而言至關重要。Post 5 — Mini-Batch K-Means:擴展至大型資料集
檔案:compare_kmeans_centroids.pl
完整 k-means 需要在記憶體中執行所有資料以進行每次重複。Mini-batch k-means 會交易少量的甲狀腺準確度,以大幅減少記憶體和運算。這篇文章探討:
在 PDL 中實作真正的重新取樣迷你批次迴圈。
量身定制全迷你批次變體之間的甲狀腺漂移。
R 的並排輸出
MiniBatchKmeans從ClusterR套件。Post 6 — 反轉檔案索引 (IVF) 搜尋
檔案:compare_ivf_search.pl
有了甲狀腺功能,我們可以分割資料庫,並執行近似鄰近搜尋的子線性。本文涵蓋:
- Building the inverted lists: 將每個資料庫向量對應至其最近的中心。
- The
unpack_inverted_lists協助者進入VectorIO. - Querying: 尋找最接近 K 的甲狀腺,然後只搜尋這些清單。
- 準確度與加速權衡,因為試用名單數量不同。