Module:Harmonic entropy: Difference between revisions
Jump to navigation
Jump to search
ArrowHead294 (talk | contribs) No edit summary |
ArrowHead294 (talk | contribs) Remove already finished Todo |
||
| (5 intermediate revisions by 2 users not shown) | |||
| Line 1: | Line 1: | ||
local limits = require("Module:Limits") | local limits = require("Module:Limits") | ||
local rat = require("Module:Rational") | local rat = require("Module:Rational") | ||
local p = {} | local p = {} | ||
-- | -- Compute Harmonic Shannon entropy for an interval of `c` cents | ||
-- `c`, `deviation`: in cents | -- `c`, `deviation`: in cents | ||
-- `ratios`: an array of rational numbers | -- `ratios`: an array of rational numbers | ||
| Line 12: | Line 11: | ||
return math.sqrt(rat.benedetti_height(ratio)) | return math.sqrt(rat.benedetti_height(ratio)) | ||
end | end | ||
deviation = deviation or | deviation = deviation or 1200 * math.log(1.01, 2) | ||
ratios = ratios | ratios = ratios | ||
or limits.integer_limit(200, function(ratio) | or limits.integer_limit(200, function(ratio) | ||
if math.abs(rat. | if math.abs(rat.cents(ratio) - c) > 3 * deviation then | ||
return 1 / 0 | return 1 / 0 | ||
end | end | ||
| Line 26: | Line 25: | ||
local function weighted_gaussian(ratio) | local function weighted_gaussian(ratio) | ||
return gaussian(rat. | return gaussian(rat.cents(ratio) - c) / norm(ratio) | ||
end | end | ||
Latest revision as of 13:53, 13 June 2024
- This module primarily serves as a library for other modules and has no corresponding template.
This module provides a means to calculate harmonic Shannon entropy of a particular interval.
| Introspection summary for Module:Harmonic entropy | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
| |||||||||||||||||
local limits = require("Module:Limits")
local rat = require("Module:Rational")
local p = {}
-- Compute Harmonic Shannon entropy for an interval of `c` cents
-- `c`, `deviation`: in cents
-- `ratios`: an array of rational numbers
-- `norm`: a function of rational numbers
function p.harmonic_entropy(c, ratios, deviation, norm)
norm = norm or function(ratio)
return math.sqrt(rat.benedetti_height(ratio))
end
deviation = deviation or 1200 * math.log(1.01, 2)
ratios = ratios
or limits.integer_limit(200, function(ratio)
if math.abs(rat.cents(ratio) - c) > 3 * deviation then
return 1 / 0
end
return norm(ratio)
end, 100)
local function gaussian(x)
return math.exp(-x * x / (2 * deviation * deviation)) / (deviation * math.sqrt(2 * math.pi))
end
local function weighted_gaussian(ratio)
return gaussian(rat.cents(ratio) - c) / norm(ratio)
end
local q_norm = 0
for _, ratio in pairs(ratios) do
q_norm = q_norm + weighted_gaussian(ratio)
end
local function probability(ratio)
return weighted_gaussian(ratio) / q_norm
end
local entropy = 0
for _, ratio in pairs(ratios) do
local p_i = probability(ratio)
if p_i > 1e-5 then
entropy = entropy - p_i * math.log(p_i)
end
end
return entropy
end
return p