Up

べき法則と対数法則

 

心理物理学においては、感覚の強さを表す関数として対数関数(対数法則)とべき関数(べき法則)がよく知られている。べき関数は、対数関数が不適切であるとして、Stevensにより提案された。しかし、対数関数を取り上げる言説が、現在でも健在である。

小早川達「こころの測り方:こころで捉える味覚と臭覚」(心理学ワールド、Jan.2026, pp.36-37)の図1に塩水の濃度と神経活動のグラフが掲載されている。横軸に対数値をとったグラフがほぼ直線であることから、「濃度の対数値に対して、線形に活動量が増加している」(p.36)と書かれている。べき法則については何も書かれていない。心理物理学の立場からは、べき関数はどのようであるのかも検討される必要があると考え、調べてみた。

 

対数関数は、濃度の対数値と活動量が線形であると書かれているので、次のように設定する。

 

 

べき関数は、次のものを用いる(Gescheider, 1997)。

 

 

式(1)と式(2)をデータに当てはめて、Figure 1の結果を得た。プログラムは、リストに示したものである。

 

Figure 1

 

読み込んだデータ値は、青色の小円で表示した。

赤色の直線は、対数法則(1)のグラフである。横軸を対数値に取ったとき、データがほぼ直線上に並んでいることを表している。しかし、このことはべき法則が成立っていないことを意味してはいない。

緑色の曲線は、べき法則(2)の曲線である。対数法則(1)より、べき法則(2)の方がデータによりよく当てはまっている。

小早川(2026)の図1のデータは、対数法則だけを見れば対数法則がよいように見えるが、べき法則をも考えれば、べき法則の方がよりよく当てはまっていると言えるものである。

 

 

まとめ

 

物理量の対数値を座標軸にとることは、よく行われる。デシベル値も対数値である。対数値を採用すると、広い範囲の物理量が扱いやすくなる。

対数値を座標軸にとったとき、得られたグラフの解釈には注意が必要である。対数値を座標軸とするグラフで簡明な関係が得られ、それが定説とは異なるものであるとき、定説ではどのようなグラフになるのかという検討も必要である。

 

 

参考文献

 

Gescheider, G. A. (1997). Psychophysics: The fundamentals, Third edition. Mahwah: Lawrence Erlbaum Associations, Publishers.

小早川達(2026)「こころの測り方:こころを捉える味覚と臭覚」心理学ワールド、Jan.2026, pp.36-37

岡本安晴(2014)「心理学データ分析と測定」、勁草書房

岡本安晴(2025)「感覚・知覚測定法」 和氣典二・重野純・村上郁也(編)感覚・知覚心理学ハンドブック 第三版(第2章)、誠信書房

Stevens, S. S. (1959). Review of L. L. Thurstone: The measurement of values. Contemporary Psychology, 4, 388-389.

Stevens, S. S. (1966). A metric for social consensus. Science, 151, 530-541.

Stevens, S. S. (1975). Psychophysics: Introduction to its perceptual, neural, and social prospects. New York: Wiley.

 

 

 

リスト1 スクリプトファイルはsample.zipにまとめた。

 

import numpy as np

import matplotlib.pyplot as plt

import scipy.optimize as so

 

"""

     小早川達(2026)「こころで捉える味覚と臭覚」, pp.36-37.

     図1からのデータ値の読み取り

"""

saline = [30, 100, 300, 1000]

neural = [14.3, 24.5, 31.0, 41.2]

 

plt.plot(np.log(saline), neural, 'o', label='Data')     #   データのプロット

plt.xlabel('Salt')

plt.ylabel('Neural Activity')

plt.xticks(np.log(saline), saline)

 

class F_Log():

    """

       対数法則用クラス

    """

    def __init__(self, saline, neural):

        self.saline = saline

        self.neural = neural

 

    def f(self, ab):

        v = 0.0

        for i in range(4):

          v += (self.neural[i] - (ab[0] + ab[1] * np.log(self.saline[i]))) ** 2

        return v

 

f_log = F_Log(saline, neural)

x0 = [10.0, 1.0]

results = so.minimize(f_log.f, x0, method='Nelder-Mead')    #   対数法則の係数

print(results)

 

a = results.x[0]

b = results.x[1]

 

plt.plot([np.log(30), np.log(1000)],

         [a + b*np.log(30), a + b*np.log(1000)],

         label=f"a+b*log(x): a={a:.3f}, b={b:.3f}")

 

class F_Power():

    """

            べき法則用クラス

    """

    def __init__(self, saline, neural):

        self.saline = saline

        self.neural = neural

 

    def f(self, abc):

        c = 30 - abc[2]**2

        v = 0.0

        for i in range(4):

            v += (self.neural[i] - (abc[0] * ((saline[i]-c)**abc[1]))) ** 2

        return v

 

 

f_power = F_Power(saline, neural)

x0 = [1.0, 0.3, 0.0]

results_pwr = so.minimize(f_power.f, x0, method='Nelder-Mead')    #   べき法則の係数

print(results_pwr)

ap = results_pwr.x[0]

bp = results_pwr.x[1]

cp = 30 - results_pwr.x[2]**2

print('ap =', ap, '  bp =', bp, '  cp =', cp)

 

def est_pwr(x):

    """

             べき法則の関数

    """

    return ap * ((x - cp)**bp)

 

x_coord = np.linspace(np.log(30), np.log(1000), 1000)

y_coord = est_pwr(np.exp(x_coord))                      #   べき法則のグラフ値

plt.plot(x_coord, y_coord, label=f"a*((x-c)**b):  a={ap:.3f}, b={bp:.3f}, c={cp:.3f}")

 

plt.legend()

plt.show()

 

 

Home