ネットワーク単位で同一の正則化パラメータを使ったら圧縮率が向上した。しかし、単層LPCでやるときのような単調性は認められず。網羅探索が必要。それによってエンコード負荷がまた増えてしまう。
エンコードオプションで、固定1/512か、網羅探索か選べるようにするのが吉と見える。
また、今日は係数の分布に隔たりがあるように見えて、係数を圧縮しようとして係数の分布を見ていた。
結果は音源依存で、一部の音源ではほぼ幾何分布だったが、他ではほぼ一様で、符号無しで128以降で減少する分布が見られた(これはわかる。右シフトによって128以降は出づらくなっている)。エントロピーは6、低くて4とか出ていたが、平均が係数次数などでまちまちなので一般化が困難。次数ごとにHuffmanテーブル作るのは難しそう。また、一層目では明確に零平均ではない傾向が見られた。2層目以降は零平均っぽい分布を見せる。
書き捨てるのももったいないので一応スクリプトを残す。
import sys
import numpy as np
import matplotlib.pyplot as plt
if __name__ == "__main__":
# 係数ファイルを読み込み
# 列(次数)ごとに解析
data = np.loadtxt(sys.argv[1])
for col in range(data.shape[1]):
uniq, counts = np.unique(data[:, col], return_counts=True)
prob = counts / np.sum(counts)
print(-np.sum(prob * np.log2(prob)), np.mean(data[:, col]), np.var(data[:, col]))
# 全体で解析
uniq, counts = np.unique(data.flatten(), return_counts=True)
prob = counts / np.sum(counts)
print(-np.sum(prob * np.log2(prob)), np.mean(data.flatten()), np.var(data.flatten()))
plt.hist(data.flatten(), bins=256, density=True)
# 幾何分布と重ねてみる
mean = np.mean(data.flatten())
p = 1.0 / mean
x = np.arange(0, 256)
plt.plot(x, p * (1 - p) ** x)
plt.show()
右シフトで最悪127だけ損するの、もったいないよなあと振り返る。といっても正規化定数を入れるのはどうなんだろうとも思う。最悪どんくらいの誤差が出るのかまた気になっている。