Математический практикум по Питону.
Корреляция, коварияция и обоснование критерия Шапиро-Уилка.
Это предварительная версия! Любые замечания приветсвуются.
import numpy as np
from matplotlib import pyplot as plt
import scipy.stats as models
Формирование данных
a = np.array( [1, 2, 3, 4, 5] )
b = np.array( [4, 7, 10, 13, 16] )
d = np.array( [4, 4.1, 7, 7.5, 10] )
c = -b
plt.plot( a )
plt.plot( b )
plt.plot( c )
Всякие суммы
a * b # Вспоминаем...по-элементвное произведение элементов
np.sum( a * b ) # Сумма по-элементных произведений.
np.correlate( a, b) # Есть функция для этого.
np.convolve(a, [1, 2]) # Свертка. С Граничным эффектом.
# [2,1] ползет вдоль a.
# 1) 1*1, 2) 2*1 + 1*2, 3) 2*2+ 1*3, 4) 2*3+1*4, 5) 2*4 + 1*5, 6) 2*5
conv = np.convolve(a, b[::-1]) # b в обратном порядке!
conv
conv[4] # Соответсвует корреляции.
np.correlate(a, b[::-1], mode='valid') # Без граничных случаев.
Вспоминая курс статистики
s = np.mean( a * b )
sa = np.mean( a )
sb = np.mean( b )
s, sa, sb
s - sa*sb # Ковариация
np.mean((a - sa)*(b - sb))
np.cov( np.array([a,b]), bias = True)
np.cov( [a,b] )
Нормирование
np.corrcoef([a,b])
np.corrcoef([a,d])
6/np.sqrt(2*18)
6/(np.sqrt(np.std(a)*np.std(b)))
7.5/np.sqrt(2.5*22.5)
Pearson
models.pearsonr(a, b)
models.pearsonr(a, c) #
aa = [1, 2, 1, 3, 1]
bb = [10, 12, 10, 14, 10]
models.pearsonr(aa, bb) # Необязательно монотонный данные.
plt.plot( aa )
plt.plot( bb )
Spearman
a = [1,2,3,4,5]
b = [50,51,60,100,200]
models.pearsonr(a, b)
dict(list( map( lambda x: x[::-1],list(enumerate(a)))))
d=[(1,0),(5,1),(-5,2)]
d.sort()
d
models.rankdata(b)
models.spearmanr(a, b)
plt.plot( [1,2,3,4,5] )
plt.plot( [50,51,60,100,200] )
models.spearmanr([1,2,6,4,5], [50,51,300,100,200])
plt.plot( [1,2,6,4,5] )
plt.plot( [50,51,300,100,200] )
models.spearmanr([1,5,4,3,2], [5,6,7,8,7])
N = 100000
dd = np.zeros((2*N, 6)) #3
for _ in range(N):
d = np.random.randn(6)
#e = d.copy()
#e -= e.mean()
##d /= e.std()
#d = e/e.std();
d.sort()
#t = d[3:] - d[:3][::-1]
t = d
dd[2*_] = t
dd[2*_+1] = -t[::-1]
dd.shape
m = np.mean( dd, axis=0 )
m
#q = (dd-m).T
#np.dot( q, q.T )/200000
V = np.cov( dd.T )
V
L = np.linalg.cholesky(V)
L
L.dot(L.T)
Linv = np.linalg.inv(L)
ddd = Linv.dot( dd.T )
#ddd.shape
Vinv = np.linalg.inv(V)
Vinv
np.cov(ddd)
#m.mean(), m.std()
m /= m.std()
Linv.T.dot(Linv.dot(m))
m.dot(Vinv)
aa11 = Vinv.dot(m) #m.dot(Vinv)
aa11
np.sqrt(np.sum(aa11*aa11))/aa11.std()
#k = np.sqrt(np.sum(a*a))
#k
aa11.mean(), aa11.std()
aa = aa11.copy()/np.sqrt(np.sum(aa11*aa11))
aa
np.sum(aa*aa)
#qa.mean(), qa.std()
aa.mean(), aa.std(), np.sqrt(np.sum(aa*aa))
qa = dd[136].copy()
qa -= qa.mean()
qa /= qa.std()*np.sqrt(6)
np.sum( aa * qa )**2
np.sum( aa * qa )/np.sqrt(np.sum(aa*aa))
np.sum( aa * qa )/( np.sqrt(np.sum(qa*qa)) * np.sqrt(np.sum(aa*aa)) )
np.sum(qa*qa)
#mm = Linv.dot(qa)
#mm.std()/qa.std()
#mm = Linv.dot(m)
#mm.std()/m.std()
p = Linv.dot(qa) #qa#ddd.T[66]
#qa.mean()
p.mean(), p.std(), np.sqrt(np.sum(p*p))
mm = Linv.dot( m )
#m.mean()
#mm -= mm.mean()
#mm /= mm.std()
#mm
mm.mean(), mm.std(), np.sqrt(np.sum(aa11*aa11))
np.std(aa11)/1.424999146
#np.sqrt(np.sum(mm*mm))
np.sum( mm * p )/np.sqrt(np.sum(aa11*aa11))
#np.sum( mm * p )/(np.sqrt(np.sum(aa11*aa11)) * np.sqrt(np.sum(qa*qa)) )
#np.sqrt(np.sum(qa*qa)) * np.sqrt(np.sum(aa*aa)), np.sqrt(np.sum(mm*mm)) * np.sqrt(np.sum(p*p)), np.std(qa) * np.std(aa)
qs = []
for ii in dd:
qa = ii.copy()
qa -= qa.mean()
s = np.sum( aa * qa )/np.sqrt(np.sum(qa*qa))
qs.append(s**2)
qs.sort()
plt.plot(qs)
qs[int(len(qs)*0.5)]
qs[int(len(qs)*0.02)]
Проверка
aa
ddв = np.random.randn(6)
ee = ddd.copy()
ee -= ee.mean()
ee.sort()
(np.sum( aa * ee )/np.sqrt(np.sum(ee*ee)))**2
models.shapiro( ddd ) # Есть готовая функция.
ddd = np.array([0., 0., 0., 1., -2., 2.])
ee = ddd.copy()
ee -= ee.mean()
ee.sort()
(np.sum( aa * ee )/np.sqrt(np.sum(ee*ee)))**2
models.shapiro( dd[136] )