Я использую Python 3.8
По сути, учитывая набор значений x и y, я написал кое-что, что дает мне приближение с использованием линейной регрессии, но для экспоненциальных моделей. Мне интересно, потому что ожидаемый результат 2 1
на 100% точен, что я сделал специально. Я выбрал полномочия 2. Первая версия программы дает мне примерно 99.99999% точного ответа, но вторая дает мне 100% точный ответ. Кто-нибудь может сказать мне, почему это? Кроме того, мне интересно, является ли log2 в целом более точным в использовании, чем log10, или это просто «случайность» из-за указанных значений c, которые были у меня в points
Кроме того, я посмотрел на поле «Похожие вопросы» и ничего не подошло, что казалось похожим на мой вопрос.
Версия 1:
from math import log10, exp
from decimal import Decimal
points = {'1': '2', '2': '4', '5': '32', '6': '64'}
t = Decimal(str(len(points)))
p = Decimal('0')
q = Decimal('0')
r = Decimal('0')
s = Decimal('0')
for key, value in points.items():
p += Decimal(key)
q += Decimal(key) * Decimal(key)
r += Decimal(log10(Decimal(value)))
s += Decimal(key) * Decimal(log10(Decimal(value)))
a = (t * s - p * r) / (t * q - p * p)
b = (r - a * p) / t
a = Decimal(Decimal('10') ** a)
b = Decimal(Decimal('10') ** b)
print(a, b)
Вот результат, который я получил:
1.999999999999999960280230758 1.000000000000000060150187915
Версия 2:
from math import log2
from decimal import Decimal
points = {'1': '2', '2': '4', '5': '32', '6': '64'}
t = Decimal(str(len(points)))
p = Decimal('0')
q = Decimal('0')
r = Decimal('0')
s = Decimal('0')
for key, value in points.items():
p += Decimal(key)
q += Decimal(key) * Decimal(key)
r += Decimal(log2(Decimal(value)))
s += Decimal(key) * Decimal(log2(Decimal(value)))
a = (t * s - p * r) / (t * q - p * p)
b = (r - a * p) / t
a = Decimal(Decimal('2') ** a)
b = Decimal(Decimal('2') ** b)
print(a, b)
Вот результат, который я получил:
2 1
Я попробовал другой тест со значениями, которые не являются степенями 10 или 2, но я не знаю, какой из них более точный:
from math import log2, log10
from decimal import Decimal
points = {'1': '3', '2': '7', '5': '26', '6': '62'}
t = Decimal(str(len(points)))
p = Decimal('0')
q = Decimal('0')
r = Decimal('0')
s = Decimal('0')
for key, value in points.items():
p += Decimal(key)
q += Decimal(key) * Decimal(key)
r += Decimal(log2(Decimal(value)))
s += Decimal(key) * Decimal(log2(Decimal(value)))
a = (t * s - p * r) / (t * q - p * p)
b = (r - a * p) / t
a = Decimal(Decimal('2') ** a)
b = Decimal(Decimal('2') ** b)
print(a, b)
points = {'1': '3', '2': '7', '5': '26', '6': '62'}
t = Decimal(str(len(points)))
p = Decimal('0')
q = Decimal('0')
r = Decimal('0')
s = Decimal('0')
for key, value in points.items():
p += Decimal(key)
q += Decimal(key) * Decimal(key)
r += Decimal(log10(Decimal(value)))
s += Decimal(key) * Decimal(log10(Decimal(value)))
a = (t * s - p * r) / (t * q - p * p)
b = (r - a * p) / t
a = Decimal(Decimal('10') ** a)
b = Decimal(Decimal('10') ** b)
print(a, b)
Мой результат:
1.752690522119211309696792535 1.902951630457180834208048103
1.752690522119211322362489659 1.902951630457180751134992738