Webサイトは一種のフィードバックシステム

大学院の講義で、ロボットとかの制御システムで使う、フィードバック制御についての講義を受けているんですが、研究には役立ちそうにありません。でもせっかくなので遊んでみることにした。

Webサイトをフィードバックのあるシステムと見立て、記事を投稿してからのPVの移り変わりを再現してみます。

まず、ある日のサイトの状態\mathbf{x}を定義します。サイトの状態はベクトルとして表現します。
\mathbf{x}=\left( \begin{matrix} x_1 \\ x_2 \\ x_3 \\ x_4 \end{matrix}\right)

各要素は以下の通り

x_1
サイトの評価。常連が居る場合この値が高くなる。
x_2
記事の話題性。今後取り上げられる記事ほどこの値が高いものになる。
x_3
サイト盛り上がり度。今現在サイトにたくさんの人が来ている時は、この値が高いものになる。
x_4
記事の知識量。この値が高いほど検索エンジンに引っかかり易くなると考える。

そして、ある日のPV yはサイトの状態\mathbf{x}から以下の様に出力されるものとします。
\mathbf{b}=\left( \begin{matrix} 1 & 1 & 1 & 0 \end{matrix}\right)
y=\mathbf{b}\mathbf{x}

これは別の書き方をすると、
y=x_1 + x_2 + x_3
なので、サイトの評価と記事の話題性とサイトの盛り上がり度の合計がPVとなります。

そして、サイトの状態の各要素の性質ですが、以下のように定義してみました。

サイト評価は記事の話題性を上げる
有名なサイトほど、記事は高く評価されます
記事の話題性はサイト評価を上げる
よい記事を書いたサイトは評価が上がります
記事の話題性はサイト盛り上がり度を上げる
よい記事が書かれれば、引用や紹介されることにより、サイトが盛り上がります
サイト評価、記事の話題性、サイトの盛り上がり度は時間の経過と共に減少する
放置されたサイトは忘却されます。それと同じです。


まずは検索エンジンが存在しないものとして考えてみました。
そうすると、常微分方程式は以下のように書けます。

\mathbf{A}=\left( \begin{matrix} -a & b & c & 0 \\ d & -e & 0 & 0 \\  0 & f & -g & 0 \\ 0 & 0 & 0 & 0 \end{matrix}\right)
a \geq 0,b \geq 0,c \geq 0,d \geq 0,e \geq 0,f \geq 0,g \geq 0
 \frac{d\mathbf{x}}{dt}=\mathbf{A}\mathbf{x}

a〜gについては後で適当な数値を入れてみます。以上をまとめると、

y=\mathbf{b}\mathbf{x}
 \frac{d\mathbf{x}}{dt}=\mathbf{A}\mathbf{x}
\mathbf{A}=\left( \begin{matrix} -a & b & c & 0 \\ d & -e & 0 & 0 \\  0 & f & -g & 0 \\ 0 & 0 & 0 & 0 \end{matrix}\right)
\mathbf{b}=\left( \begin{matrix} 1 & 1 & 1 & 0 \end{matrix}\right)

と書くことができます。

scilabで実行してみます。

A = [-1,1,0,0;1,-2,0,0;0,5,-1,0;0,0,0,0]
B = [0;1;0;0]
C = [1,1,1,0]

S1=syslin('c',A,B,C);
t=0:0.1:10;

deff("y=none(x)","y=0");
x1 = [0;100;0;0];

[y1,z1] = csim(none,t,S1,x1);

a = z1(1,:);
b = z1(2,:);
c = z1(3,:);
clf();

plot(t,y1,'ro-')
plot(t,a,'bo-')
plot(t,b,'go-')
plot(t,c,'ko-')

実行結果

赤色がPVです。確かに、記事を一回投稿して後放置だと確かにこんな曲線描きますね。


様々なサイトの状態を比べてみました。

A = [-1,1,0,0;1,-2,0,0;0,5,-1,0;0,0,0,0]
B = [0;1;0;0]
C = [1,1,1,0]

S1=syslin('c',A,B,C);
t=0:0.1:10;

deff("y=none(x)","y=0");
x1 = [0;100;0;0];
x2 = [100;100;0;0];
x3 = [0;100;100;0];
x4 = [100;100;100;0];

y1 = csim(none,t,S1,x1);
y2 = csim(none,t,S1,x2);
y3 = csim(none,t,S1,x3);
y4 = csim(none,t,S1,x4);
clf();

plot(t,y1,'ro-')
plot(t,y2,'bo-')
plot(t,y3,'go-')
plot(t,y4,'ko-')

実行結果

サイトの評価が全くない赤とある青とでは、PVが倍ぐらい違うこともさることながら、サイトの評価がある青の方がPVの山が長いですね。
盛り上がっているサイトでは、評価高いサイトに太刀打ちできていません。これは単なる係数の問題だとは思うんですけどね。


検索エンジンを考慮して、以下の性質を追加してみます。

記事の知識量は記事の話題性を上げる
知識を与える記事ほど、記事は高く評価されます
記事の知識量は時間の経過とともに減少することはない
検索エンジンで記事を探す場合、1年前とかの記事に辿りつくこともあります。時間の経過とともに知識量が減ることは全くないか、あったとしても減少速度は遅いでしょう。

\mathbf{A}を再定義してみます。

\mathbf{A}=\left( \begin{matrix} -a & b & c & 0 \\ d & -e & 0 & h \\  0 & f & -g & 0 \\ 0 & 0 & 0 & 0 \end{matrix}\right)

A = [-1,1,0,0;1,-2,0,1;0,5,-1,0;0,0,0,0]
B = [0;1;0;0]
C = [1,1,1,0]

S1=syslin('c',A,B,C);
t=0:0.1:20;

deff("y=none(x)","y=0");
x1 = [100;100;0;5];


[y1,z1] = csim(none,t,S1,x1);

a = z1(1,:);
b = z1(2,:);
c = z1(3,:);
clf();

plot(t,y1,'ro-')
plot(t,a,'bo-')
plot(t,b,'go-')
plot(t,c,'ko-')

実行結果

最初のグラフより、山が長くなっているのが判ります。そして、最終的に0にならず、ある定数で安定しています。

Webサイトが得るPVの動きを上手く再現出来てると思うんですが、どう思いますか?