テキスト埋め込みベクトルの分布
そもそもテキスト埋め込みベクトルの分布の形状はどのようなものか
データはXから取得した18129件からTalk to the Cityのextructionで抽出されたargument 7574件
これをtext-embedding-3-largeで3072次元のベクトル空間に埋め込んでいる
OpenAIが返す埋め込みベクトルは正規化されているので全てのベクトルの長さは1である
なので3072次元の球面上に分布している
code:py
def p(x):
print(f"{x.mean()} ± {x.std() * 3}")
norm = np.linalg.norm(embeddings_array, axis=1)
p(norm) # -> 0.999999999999999 ± 1.2314317043463034e-15
各軸の値はSD 0.01程度の狭い範囲に集まっている
code:py
axis_std = embeddings_array.std(axis=0)
pd.DataFrame(axis_std).describe()
https://gyazo.com/ebb5576bf01e407dcd2ebb179200a737
3072次元のうち80次元が6割の情報を持っている
9割の情報が500次元に散っている
https://gyazo.com/30c0213dba12ea74a72737bb6d841a71https://gyazo.com/c8e43b1a3a004cd49867e7b23db9d529
とても高次元だな、2次元だと情報が1割もない
各データの他のデータに対する内積は0.4あたりを平均として0.1~0.7程度
https://gyazo.com/ada46b6a0db24a1bbcb7a9a3a9776aac
順番をシャッフルして隣のベクトルとの内積をとったヒストグラム
各軸の値がSD 0.01程度の狭い範囲で動くのに全体としては結構範囲が広いな〜
これは高次元球面上のベルトが実はとても広いことに起因する感覚のずれか
ユークリッド距離にしておくとこんな感じ
https://gyazo.com/a0f8e6ccf0ed0ae9132327c5cc716656
ほとんどのデータが他のほとんどのデータと0.8~1.4くらい離れている
これはかなり重要な特徴で、DBSCANのepsはデフォルト値だと0.5だから「ほとんどすべての点が隣接してない」になっちゃうわけ
eps float, default=0.5
The maximum distance between two samples for one to be considered as in the neighborhood of the other.
HDBSCANのcondensed_tree_.plot
デフォルトのHDBSCAN(min_cluster_size=5)
https://gyazo.com/81bdadbbdc05533e95a2e2fdfa45d98a
HDBSCAN(min_cluster_size=30)にして推定される密度をなめらかにしたもの
https://gyazo.com/aa714280b2b571514ae5304746851cbe
つまり大雑把にいうと「おおきなひとつのクラスタにちょっと小さなこぶがあるだけ」
lambda 1.0より小さい「密度薄くてもOK」な領域では7000個全てが一つにつながっている
~1.2の領域でクラスタとみなされない小集合が離脱していき1000個程度しか残らない
その小集合が3つに分かれる
min_cluster_size=5ではクラスタとみなす小集合が増えてもっと細かく描かれている