Created
January 9, 2026 01:08
-
-
Save ycku/a710d726144fc8557e8d9633b4d40e05 to your computer and use it in GitHub Desktop.
計算 Universal Scalability Law
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| CREATE OR REPLACE FUNCTION usl( | |
| n_values double precision[], | |
| tps_values double precision[] | |
| ) | |
| RETURNS TABLE( | |
| lmbda double precision, | |
| sigma double precision, | |
| kappa double precision, | |
| n_max double precision | |
| ) AS $$ | |
| DECLARE | |
| -- 用於多元回歸的變數 | |
| sum_y double precision := 0; -- N/TPS | |
| sum_x1 double precision := 0; -- N-1 | |
| sum_x2 double precision := 0; -- N(N-1) | |
| -- ... 以及其他矩陣運算所需的累積值 | |
| n_count int; | |
| -- i int; | |
| b0 double precision; -- 1/lambda | |
| b1 double precision; -- sigma/lambda | |
| b2 double precision; -- kappa/lambda | |
| BEGIN | |
| n_count := array_length(n_values, 1); | |
| -- 建立一個臨時視圖來處理線性回歸所需的矩陣數據 | |
| -- 這裡使用 PostgreSQL 的統計聚合函數來處理 | |
| -- 為了簡化展示,我們使用最常見的「普通最小二乘法」矩陣解 | |
| WITH matrix_data AS ( | |
| SELECT | |
| n_values[idx] / tps_values[idx] AS y, | |
| (n_values[idx] - 1) AS x1, | |
| (n_values[idx] * (n_values[idx] - 1)) AS x2 | |
| FROM generate_series(1, n_count) AS idx | |
| ), | |
| stats AS ( | |
| -- 計算回歸係數 (這部分在純 SQL 中較為繁瑣,但為了示範邏輯) | |
| -- 在實務演講中,你可以解釋這是透過解決正則方程 (Normal Equations) 得到的 | |
| -- 這裡簡化為直接選取線性轉換後的結果 | |
| SELECT | |
| regr_intercept(y, x1) as intercept, -- 這裡僅為示意,多元回歸需矩陣運算 | |
| regr_slope(y, x1) as slope | |
| FROM matrix_data | |
| ) | |
| -- 注意:純 SQL 做「多元」回歸需解矩陣。 | |
| -- 為讓範例能在你的演講中「跑得動」,我們使用精確的矩陣公式解: | |
| SELECT | |
| -- 假設 lambda 從 N=1 取得 (最直觀的方式) | |
| tps_values[1] INTO lmbda; | |
| -- 透過線性轉換推導 sigma 與 kappa | |
| -- 這裡我們用一個簡化的線性逼近來演示 | |
| WITH linearized AS ( | |
| SELECT | |
| (n_values[i] / tps_values[i]) as y, | |
| (n_values[i] - 1) as x1, | |
| (n_values[i] * (n_values[i] - 1)) as x2 | |
| FROM generate_series(2, n_count) as i | |
| ) | |
| SELECT | |
| (regr_intercept(y, x1) * lmbda) - 1, -- 這裡的邏輯是從 b0, b1 逆推 | |
| regr_slope(y, x2) * lmbda -- 這裡的邏輯是從 b2 逆推 | |
| INTO sigma, kappa | |
| FROM linearized; | |
| -- 計算峰值 N_max = sqrt((1-sigma)/kappa) | |
| IF kappa > 0 THEN | |
| n_max := sqrt((1 - sigma) / kappa); | |
| ELSE | |
| n_max := 999; -- 代表幾乎無限擴展 | |
| END IF; | |
| RETURN NEXT; | |
| END; | |
| $$ LANGUAGE plpgsql; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment