はじめに
本稿の目的はある個人が翌日にどの服を選択するかという意思決定プロセスを、確率的な数理モデルを用いて記述することである。
人の服装選択は単なるランダムな行為ではなく、過去の着用履歴や社会的環境といった複数の要因に影響されると考えられる。特に同じ服を短期間に繰り返し着用することへの心理的抵抗や所属するコミュニティの特性(例: ファッションへの関心度)が重要な役割を果たすと仮定する。
本稿では、これらの要因を定量的にモデルへ組み込む。具体的には以下の二点である:
- 過去の着用履歴に基づく時間的ペナルティ
- 個人が所属する複数のコミュニティ特性(訪問頻度とファッション係数)
これらを統合し、ソフトマックス関数を用いて翌日の服装選択確率を表現するモデルを提案する。
モデルの基本要素
変数とパラメータを以下のように定義する。
- $n $: 個人が所有する服の総種類数
- $ L $: 観測開始からの経過日数
- $ a_l $: $ l $ 日目に着用した服($ 1 ≦ l ≦ L $)
- $ N $: 所属するコミュニティの総数
- $ A_k $: コミュニティ $ k $ へ訪れる頻度
- $ B_k $: コミュニティ $ k $ のファッション係数(関心度)
個人の総合的なファッション感度 $ C $ を次式で定義する:
$$
C = \sum_{k=1}^{N} A_k B_k
$$
$ C $ が大きいほど、周囲の目を意識して多様な服装を心がける傾向が強いと解釈できる。
時間ペナルティの導入
過去 $ l $ 日目に着用した服 $ a_l $ を再び選択する際の「非魅力度」を、時間的ペナルティで表す。
$$
\text{TimePenalty}(a_l) = \frac{1}{L + 1 - l}
$$
昨日 ($ l = L $) 着た服に対してペナルティは最大の 1、
最も昔に着た服 ($ l = 1 $) に対しては $ \frac{1}{L} $ となる。
確率モデルの構築
コスト関数の定義
服 $ a_l $ を選択することのコストを次式で定義する:
$$
\text{Cost}(a_l) = C \times \frac{1}{L + 1 - l}
= \frac{\sum_{k=1}^{N} A_k B_k}{L + 1 - l}
$$
スコアへの変換とソフトマックス関数の適用
スコアはコストの符号を反転させて定義する:
$$
\text{Score}(a_l) = -\text{Cost}(a_l)
= -\frac{\sum_{k=1}^{N} A_k B_k}{L + 1 - l}
$$
そして、ソフトマックス関数によって選択確率を定義する:
$$
P(a_{L+1} = a_l) =
\frac{\exp(\text{Score}(a_l))}
{\sum_{j=1}^{L} \exp(\text{Score}(a_j))}
$$
すなわち、
$$
P(a_{L+1} = a_l) =
\frac{\exp\left(-\frac{C}{L+1-l}\right)}
{\sum_{j=1}^{L} \exp\left(-\frac{C}{L+1-j}\right)}
$$
このモデルは、ファッション感度 $ C $ が高いほど、または時間的間隔が短いほど、同じ服を再び選択する確率が指数関数的に減少することを示す。
モデルの拡張:未着用の服の考慮
未着用の服(新しい服)は時間ペナルティを受けないため、スコアを 0 と定義する。
$$
\text{Score(new outfit)} = 0
$$
すると、選択確率は次のように修正される:
$$
P(a_{L+1} = \text{new outfit}) =
\frac{1}{
\sum_{j=1}^{L} \exp\left(-\frac{C}{L+1-j}\right) + 1}
$$
$$
P(a_{L+1} = a_l) =
\frac{\exp\left(-\frac{C}{L+1-l}\right)}{
\sum_{j=1}^{L} \exp\left(-\frac{C}{L+1-j}\right) + 1}
$$
これにより、モデルは未着用の服を常に一定の魅力を持つ選択肢として扱うことができる。
統計力学的導出(ボルツマン分布との対応)
前述のコスト関数を心理的抵抗(エネルギー) $\varepsilon_l$ とみなし、
同じ条件を持つ仮想的な集団 $ M $ 人を考える。
総人数保存:
$$
M = \sum_l m_l
$$
総エネルギー保存:
$$
E = \sum_l m_l \varepsilon_l
$$
状態数 ( W ) は次式で与えられる:
$$
W = \frac{M!}{m_1! m_2! \dots}
$$
スターリングの公式を用いると:
$$
\log W \approx M \log M - \sum_l m_l \log m_l
$$
ラグランジュの未定乗数法により最大化すると:
$$
m_l = C e^{-\beta \varepsilon_l}
$$
確率 ( P(l) = \frac{m_l}{M} ) とすると、
$$
P(l) = \frac{e^{-\beta \varepsilon_l}}{\sum_j e^{-\beta \varepsilon_j}}
$$
これは統計力学におけるボルツマン分布と同じ形であり、
本モデルの確率形式と一致する。
パラメータβの物理的意味:逆温度
$$
P(l) = \frac{e^{-\beta \varepsilon_l}}{\sum_j e^{-\beta \varepsilon_j}}
$$
ここで $ \beta = \frac{1}{T} $ は逆温度を表す。
$ T $ は有効温度 (Effective Temperature) として、意思決定におけるランダム性の度合いを示す。
意思決定における温度 T の役割
-
$ T → 0 $(低温状態)
→ もっともコストが低い服だけを選ぶ。決定的で合理的。 -
$ T → \infty $(高温状態)
→ 全ての服を等確率で選ぶ。完全にランダム。$$
P(l) \to \frac{1}{L}
$$
実装
以下では提案モデルを Python で実装し、1000日分の服装選択をシミュレーションする。
時間ペナルティとファッション感度を組み合わせた確率モデルに基づき、
ソフトマックス分布から毎日の服を確率的に選択する。
import matplotlib.pyplot as plt
import numpy as np
# --- Parameter Settings ---
num_clothes = 10 # 所有している服の種類数
num_days = 1000 # シミュレーションする日数
num_communities = 2 # 所属するコミュニティ数
# 各コミュニティのパラメータ(例)
A = np.array([0.6, 0.4]) # コミュニティ訪問頻度
B = np.array([1.2, 0.8]) # ファッション係数(関心度)
# ファッション感度 C = Σ A_k * B_k
C = np.sum(A * B)
# 温度パラメータ(意思決定のランダム性を制御)
T = 0.01 # 大きいほどランダム,小さいほど合理的
beta = 1 / T # 逆温度
# --- Simulation Initialization ---
history = [] # 着用履歴を記録(服のインデックスを格納)
available_clothes = list(range(num_clothes)) # [0, 1, 2, ..., 9]
# --- Simulation Loop ---
for day in range(num_days):
L = len(history)
scores = []
for i in range(num_clothes):
if i in history:
# 最後に着た日を特定
l = L - 1 - history[::-1].index(i)
# 時間的ペナルティの導入
penalty = 1 / (L + 1 - l) if L > 0 else 0
epsilon = C * penalty # 心理的抵抗(エネルギー)
score = -beta * epsilon # スコア(低いほど選ばれにくい)
else:
# 未着用の服はペナルティなし
score = 0
scores.append(score)
# ソフトマックス分布による選択確率の計算
exp_scores = np.exp(scores - np.max(scores)) # 数値安定化
probs = exp_scores / np.sum(exp_scores)
# 確率的に服を選択
chosen = np.random.choice(range(num_clothes), p=probs)
history.append(chosen)
# 出力(進行表示)
if (day + 1) % 10 == 0:
print(f"Day {day + 1}: Outfit {chosen}")
# --- Visualization ---
plt.figure(figsize=(10, 4))
plt.plot(history, marker="o", markersize=3, linewidth=1)
plt.title(f"Clothing Choice History over {num_days} Days")
plt.xlabel("Day")
plt.ylabel("Outfit Number (0–9)")
plt.grid(True)
plt.tight_layout()
plt.show()
# --- Frequency Visualization ---
unique, counts = np.unique(history, return_counts=True)
plt.figure(figsize=(8, 4))
plt.bar(unique, counts)
plt.title("Number of Times Each Outfit Was Worn")
plt.xlabel("Outfit Number")
plt.ylabel("Count")
plt.tight_layout()
plt.show()
実行例(抜粋):
~/python via 🐍 v3.12.3
❯ python3 cloth_choice.py
Day 10: Outfit 8
Day 20: Outfit 3
Day 30: Outfit 6
Day 40: Outfit 1
Day 50: Outfit 5
...
Day 1000: Outfit 2
この結果、温度 ( T ) を下げると(合理的な状態)、
直近で着た服が選ばれにくくなり、服の選択が周期的に変化する様子が確認できる。
逆に ( T ) を上げると、全ての服がほぼ等確率で選ばれるようになる。
まとめ
本モデルは、服装選択行動をボルツマン分布に基づく確率過程として記述したものである。
ファッション感度 $ C $ と温度 $ T $ をパラメータとすることで、
個人差や合理性・ランダム性のバランスを統一的に表現できる。