MySQLdb: подключиться к MariaDB через сокет

Я изначально разместил тесты ниже с целью рекомендовать numpy.corrcoef, по глупости не понимая, что исходный вопрос уже использует corrcoef и на самом деле спрашивает о том, что полином более высокого порядка подходит. Я добавил фактическое решение вопроса о квадратичном r-квадрате с использованием шаблонов statsmodels, и я оставил исходные тесты, которые, хотя и вне темы, потенциально полезны кому-то.


statsmodels имеет возможность правильно вычислить r^2 полиномиального соответствия, вот 2 метода ...

import statsmodels.api as sm
import stasmodels.formula.api as smf

# Construct the columns for the different powers of x
def get_r2_statsmodels(x, y, k=1):
    xpoly = np.column_stack([x**i for i in range(k+1)])    
    return sm.OLS(y, xpoly).fit().rsquared

# Use the formula API and construct a formula describing the polynomial
def get_r2_statsmodels_formula(x, y, k=1):
    formula = 'y ~ 1 + ' + ' + '.join('I(x**{})'.format(i) for i in range(1, k+1))
    data = {'x': x, 'y': y}
    return smf.ols(formula, data).fit().rsquared

Чтобы дополнительно воспользоваться statsmodels, следует также взглянуть на подгонку модели сводку, которую можно распечатать или отобразить в виде богатой таблицы HTML в ноутбуке Jupyter / IPython. Объект результатов обеспечивает доступ ко многим полезным статистическим метрикам в дополнение к rsquared.

model = sm.OLS(y, xpoly)
results = model.fit()
results.summary()

Ниже мой оригинальный ответ, где я сравнивал различные методы линейной регрессии r ^ 2 ...

Функция corrcoef , используемая в Вопросе, вычисляет коэффициент корреляции r только для одной линейной регрессии, поэтому она не затрагивает вопрос о r^2 для более высокого порядка полином подходит. Однако, для того, что стоит, я пришел к выводу, что для линейной регрессии это самый быстрый и самый прямой метод вычисления r.

def get_r2_numpy_corrcoef(x, y):
    return np.corrcoef(x, y)[0, 1]**2

Это были мои временные результаты от сравнения куча методов для 1000 случайных (x, y) точек:

  • Pure Python (прямой расчет r) 1000 циклов, лучше всего 3: 1,59 мс за цикл
  • Numpy polyfit (применимо к полиномам n-й степени) 1000 циклов, лучше всего 3: 326 мкс на петлю
  • Руководство по вычислению чисел (прямой расчет r) 10000 циклов, лучше всего 3: 62,1 мкс на loop
  • вычисление Numpy corrcoef (прямой расчет r) 10000 циклов, лучше всего 3: 56,6 мкс за цикл
  • Scipy (линейная регрессия с r в качестве выхода) 1000 циклов, наилучшее из 3: 676 мкс за цикл
  • Statsmodels (может выполнять многочлен n-й степени и многие другие возможности) 1000 циклов, лучше всего 3: 422 мкс на петлю

Метод corrcoef узко бьет, вычисляя r ^ 2 «вручную», используя numpy методы. Это> 5X быстрее, чем метод polyfit и ~ 12X быстрее, чем scipy.linregress. Чтобы укрепить то, что делает numpy для вас, это на 28 раз быстрее, чем чистый python. Я не разбираюсь в таких вещах, как numba и pypy, поэтому кому-то придется заполнить эти пробелы, но я думаю, что для меня это довольно убедительно, что corrcoef - лучший инструмент для вычисления r для простой линейной регрессия.

Вот мой бенчмаркинг. Я скопировал из Jupyter Notebook (трудно не называть его IPython Notebook ...), поэтому я приношу свои извинения, если что-то сломается. Для команды% timeit magic требуется IPython.

import numpy as np
from scipy import stats
import statsmodels.api as sm
import math

n=1000
x = np.random.rand(1000)*10
x.sort()
y = 10 * x + (5+np.random.randn(1000)*10-5)

x_list = list(x)
y_list = list(y)

def get_r2_numpy(x, y):
    slope, intercept = np.polyfit(x, y, 1)
    r_squared = 1 - (sum((y - (slope * x + intercept))**2) / ((len(y) - 1) * np.var(y, ddof=1)))
    return r_squared

def get_r2_scipy(x, y):
    _, _, r_value, _, _ = stats.linregress(x, y)
    return r_value**2

def get_r2_statsmodels(x, y):
    return sm.OLS(y, sm.add_constant(x)).fit().rsquared

def get_r2_python(x_list, y_list):
    n = len(x)
    x_bar = sum(x_list)/n
    y_bar = sum(y_list)/n
    x_std = math.sqrt(sum([(xi-x_bar)**2 for xi in x_list])/(n-1))
    y_std = math.sqrt(sum([(yi-y_bar)**2 for yi in y_list])/(n-1))
    zx = [(xi-x_bar)/x_std for xi in x_list]
    zy = [(yi-y_bar)/y_std for yi in y_list]
    r = sum(zxi*zyi for zxi, zyi in zip(zx, zy))/(n-1)
    return r**2

def get_r2_numpy_manual(x, y):
    zx = (x-np.mean(x))/np.std(x, ddof=1)
    zy = (y-np.mean(y))/np.std(y, ddof=1)
    r = np.sum(zx*zy)/(len(x)-1)
    return r**2

def get_r2_numpy_corrcoef(x, y):
    return np.corrcoef(x, y)[0, 1]**2

print('Python')
%timeit get_r2_python(x_list, y_list)
print('Numpy polyfit')
%timeit get_r2_numpy(x, y)
print('Numpy Manual')
%timeit get_r2_numpy_manual(x, y)
print('Numpy corrcoef')
%timeit get_r2_numpy_corrcoef(x, y)
print('Scipy')
%timeit get_r2_scipy(x, y)
print('Statsmodels')
%timeit get_r2_statsmodels(x, y)

0
задан geekQ 18 January 2019 в 14:53
поделиться

1 ответ

Это была не корневая учетная запись без пароля. Это был один с паролем по умолчанию. mysql просто прочитайте его автоматически из папки /etc/my.cnf.d/

[client]
socket   = /var/lib/mysql/mysql.sock
host     = localhost
user     = root
password = ...

Для отладки mysql поведения CLI и поведения Python MySQLdb вы можете запустить

mysql --no-defaults

, который уже воспроизвел поведение для меня, поэтому я продолжил:

mysql --no-defaults --socket=/var/lib/mysql/mysql.sock
mysql --no-defaults --socket=/var/lib/mysql/mysql.sock --user=root

затем пришла идея покопаться глубже в папку /etc/my.cnf.d/.

0
ответ дан geekQ 18 January 2019 в 14:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: