import numpy as np
# Matrix is positive definite if Cholesky Decomposition exists
def PositiveDefiniteMatrix(V):
try: np.linalg.cholesky(V); return True
except np.linalg.LinAlgError: return False
TRICK: How to build a square correlation/covariance matrix that is always positive definite?
BACKGROUND: Correlation matrices are used for simulating distributions.
For univariate distros, we can control with the scale (or standard deviation).
For multivariate distros (which we often need), there is no equivalent single parameter to control the matrix.
having many parameters can produce inconsistencies (matrix no longer positive definite).
Instead of plugging in parameter numbers, then testing for positive definite, here is a technique that allows to control a dependence coefficient of the matrix the first eigenvalue. In other words, a low (or flat eigenvalue vector means low average dependence, the reverse means low average dependence). (Flat eigenvalue vector: all eigenvalues converge to 1)
TECHNIQUE: You randomize (n is sample per variable, d is the number of variables). The relation between n and d determines the dependence coefficient.
THEORY: We are using the properties that small samples are more random than large ones.
m is the number of variables
n is the number of data per variable
runs numbere of Monte Carlo Runs
def Generate_CorrMatrix(m,n):
M = np.random.normal(0,1,(m,n))
V = np.corrcoef(M,rowvar=False)#columns represents variables, rows contain data.
print('\n Matrix M: \n' + str(np.matrix(M)))
print('\n Correlation matrix V: \n' + str(np.matrix(V)))
print('\n Eigenvalues: \n' + str(np.linalg.eig(V)[0]) + '\n')
print('\n Positive definite?')
return PositiveDefiniteMatrix(V)
Generate_CorrMatrix(m=3,n=4)
Matrix M: [[ 0.49604558 -0.12469985 -0.48376557 0.17952923] [ 0.12426166 -0.87510485 -0.82415182 0.63250532] [ 0.20679043 1.27963211 -1.38098702 -0.52312303]] Correlation matrix V: [[ 1. 0.03949668 0.64103297 -0.08874863] [ 0.03949668 1. -0.74159578 -0.99878211] [ 0.64103297 -0.74159578 1. 0.70759398] [-0.08874863 -0.99878211 0.70759398 1. ]] Eigenvalues: [ 1.31547183e+00 2.68452817e+00 -7.68290261e-17 -3.46469883e-16] Positive definite?
False
Generate_CorrMatrix(m=100,n=4)
Matrix M: [[ 7.44257067e-01 -4.07941163e-01 -6.21043462e-01 1.49493184e+00] [ 8.87712295e-01 5.23999197e-01 9.53517715e-01 7.11473854e-01] [ 2.19576519e+00 5.94888053e-01 -7.82697410e-01 2.97605180e-02] [ 1.88319942e+00 2.72331710e-01 -9.06314109e-01 8.69821533e-01] [ 9.71816163e-01 -1.51318972e+00 6.39172532e-01 -1.67087534e+00] [-1.85013036e-01 1.18760048e+00 2.29679462e+00 -3.08092895e-01] [ 4.16335343e-01 4.18222613e-01 9.71624301e-01 -1.94404109e+00] [-6.43134468e-01 5.42125298e-02 -5.13627915e-01 -1.34559720e+00] [-9.29825545e-01 3.03277452e-01 1.57590974e-01 -1.57726177e-01] [ 1.60757228e-01 -1.47630843e+00 -1.09106744e+00 5.21524028e-01] [-2.20663795e-01 -8.74704880e-01 6.60263932e-02 -1.18236881e-01] [-1.81737435e-01 1.18368252e+00 -4.92011890e-01 -1.25471747e+00] [ 3.72031932e-01 3.44652384e-01 1.59392552e+00 -2.52252035e-01] [ 2.74507146e-01 3.82285397e-01 2.45456678e-01 -3.05868835e-01] [-9.35944184e-01 1.94311072e+00 -7.67482058e-01 -3.65733186e-01] [ 5.44869343e-01 8.32422172e-01 2.18946273e+00 -8.22378054e-01] [ 7.39324357e-01 1.26578068e+00 -2.55304708e-01 6.66221995e-02] [ 2.49665609e-01 -6.23838643e-03 -5.47313694e-01 2.25226719e+00] [-2.10594141e+00 1.22273971e+00 1.81145481e+00 -9.13260186e-01] [-1.18554142e-01 -1.96256086e+00 -2.92573786e+00 1.72793283e-01] [-2.17898684e+00 6.37373456e-01 -5.04658267e-01 -1.49475119e-01] [-2.46616083e-03 -1.08696277e-01 -1.52217343e-02 -1.60383269e-01] [-1.52339518e+00 3.53958115e-01 1.84463479e+00 -2.29935302e+00] [ 2.67370878e+00 -5.75769710e-01 2.19450975e-01 -1.19057602e+00] [-1.17646729e+00 -3.44059997e-01 -9.16394686e-01 -1.43803092e+00] [ 2.44148402e-01 2.03164124e-01 -1.93565928e-01 -1.35132208e+00] [-3.87333910e-01 5.02721715e-02 -1.74216232e+00 -1.38884850e+00] [-1.73202334e-01 5.15551019e-01 -2.58590972e+00 -6.45633412e-01] [-6.44109377e-01 1.10096616e+00 -5.18815936e-01 -1.34922312e+00] [-8.96324991e-02 -1.00413657e+00 -9.40838335e-01 7.67878437e-01] [ 2.40212768e-01 2.74298785e-03 -6.14983230e-01 -7.90714508e-01] [-3.91395506e-01 1.89712695e+00 -2.58952152e+00 1.09735342e+00] [ 8.07132845e-01 6.54849118e-01 -7.71417663e-01 4.55095758e-01] [ 1.32034474e+00 2.42162863e-01 6.44116154e-01 6.59926301e-01] [-1.02900481e-01 -5.52782925e-01 1.00285883e+00 -1.00397718e+00] [ 8.79476663e-01 -1.40239248e+00 4.89912596e-01 9.99075238e-01] [-3.80133642e-01 1.50193807e+00 1.59229285e+00 1.85231938e+00] [-5.15015064e-01 -3.43150415e-01 8.50410068e-02 -1.23129376e+00] [-9.02908850e-02 2.62087220e+00 -1.08379201e+00 -8.80347295e-01] [-9.02153697e-02 2.44609329e+00 1.01503722e+00 -2.72497148e-01] [ 2.43495657e-01 -3.43122551e-01 1.83330828e+00 -4.66803745e-01] [ 7.24043171e-01 -2.09900913e-02 -7.81824830e-02 -9.86411695e-01] [-2.33386816e-01 -1.22612201e+00 9.59099517e-01 1.15679446e+00] [ 2.82912110e-01 6.03017237e-01 1.07251238e+00 -1.67985489e-01] [-5.97339347e-01 3.14536016e-01 -1.29208806e+00 -1.01875627e+00] [ 4.06977406e-01 -4.05885876e-01 -4.46752661e-01 -2.54343008e-01] [-4.45903011e-01 -1.15208973e+00 -2.13888473e-01 1.20708337e+00] [ 2.46929909e-01 2.04672053e-01 -5.82940789e-01 -3.52147900e-01] [ 1.14890988e+00 4.14682278e-01 -1.01476878e+00 -1.32425331e-01] [ 1.09851645e+00 4.46633342e-01 -6.55128053e-01 -1.57661670e+00] [ 1.02520173e+00 4.11930690e-01 1.34707976e-01 9.95555428e-01] [-2.84178746e-01 8.88604992e-03 4.70047196e-01 -1.10175954e+00] [-2.32528980e-01 1.21251988e-01 2.21750532e-01 -1.52695561e+00] [ 5.38177545e-01 -8.17226506e-01 1.08634877e+00 -2.37651582e+00] [-2.49612920e+00 5.03430305e-01 3.10842395e-01 6.48705626e-01] [ 5.86673518e-01 -4.09947664e-01 2.32181557e-01 -4.47580742e-01] [ 5.03303346e-01 -1.02591774e+00 2.07316264e-01 1.62338518e-01] [-9.72764286e-01 -2.01439083e+00 -9.79079945e-01 1.02023835e+00] [-7.14951662e-01 -9.48340146e-01 -6.44965104e-01 1.40855408e-01] [ 1.51074183e-01 -2.07518294e+00 6.72028302e-01 -2.76351699e-01] [-2.03352591e+00 -4.04680159e-01 4.10554142e-01 1.32195970e-01] [ 2.36905355e-01 2.41568642e-01 8.80694512e-01 -1.07875039e+00] [-1.35912256e+00 7.62561671e-01 1.11876336e+00 1.22679992e+00] [-1.01339018e+00 -9.16472744e-01 -7.39288968e-02 -9.92599547e-03] [ 1.58961744e+00 4.47423372e-01 2.14907138e+00 3.54096289e-02] [-1.63292215e-01 6.35194068e-01 2.60631628e+00 1.69180958e+00] [ 2.03853762e+00 -5.56118607e-01 1.79652485e+00 -3.13946197e-01] [ 4.83880124e-01 3.27403005e-01 -8.18287067e-01 -2.74069339e-01] [ 3.93691814e-01 -6.02243131e-01 -9.04658819e-01 2.54267429e-01] [-1.36312854e+00 -7.31385331e-01 -6.79530614e-01 -4.59816219e-01] [-6.84912071e-01 4.37926026e-01 -1.55621753e+00 1.69675828e+00] [-2.35359227e-01 -5.05406299e-01 1.31034472e+00 5.90890041e-01] [ 1.46452179e+00 9.74996477e-01 -4.85487402e-01 1.83955984e-02] [-8.77331254e-01 -6.53880120e-01 -1.35581005e+00 -1.47409389e+00] [ 7.47195501e-01 -1.13014129e+00 -1.18182644e+00 -6.86380235e-01] [-4.51766734e-01 -3.55618858e-01 -2.22113879e-01 -5.42652490e-01] [ 8.34295341e-01 1.39363899e+00 -4.66266915e-01 -4.82545163e-01] [ 6.32104853e-01 1.26480266e+00 -4.53728046e-01 1.57358707e+00] [-1.50672962e+00 -9.58941847e-01 -1.45570029e+00 1.19597982e+00] [ 5.50430466e-01 -4.08747783e-01 1.53765260e+00 8.78875220e-02] [ 6.07472937e-01 6.61498377e-01 4.74552271e-01 1.98951127e+00] [-1.61906212e+00 5.48859690e-01 3.18812153e-01 2.49961532e+00] [-3.39355435e-01 -1.52421773e-01 1.90980405e+00 -1.99394295e+00] [-4.54492793e-01 1.72676994e+00 5.17432384e-01 -3.16569998e-01] [ 6.16010866e-01 1.01542901e+00 1.78960549e+00 5.42581448e-01] [ 1.41235844e+00 1.61282975e+00 4.22999579e-01 -2.16987014e-02] [ 7.60885326e-01 -5.57022533e-02 -1.49072248e+00 -1.85456311e+00] [-2.61796571e-01 -2.33805080e+00 2.11749944e-01 5.49361227e-01] [-4.53022065e-01 -6.71962666e-01 5.75895559e-01 -9.70950440e-01] [ 9.97945724e-02 8.06397077e-01 1.60872641e+00 1.43433137e+00] [-4.10260370e-01 1.12417187e+00 -1.05204501e+00 -1.15117349e+00] [-2.72286780e-01 -5.29221476e-03 8.06342995e-02 7.84653884e-01] [-1.64652038e-01 -1.45689731e+00 1.08808393e+00 -1.13411953e+00] [ 2.37609378e-01 8.67528426e-01 -3.84856164e-01 6.09507555e-01] [ 9.99558632e-01 5.63997569e-01 -8.08549859e-01 1.81242408e+00] [ 2.83467599e-01 -3.80576803e-01 -2.04698929e+00 -1.67597362e+00] [ 6.80655499e-01 -8.59413398e-01 3.24625686e-02 1.46031757e+00] [-2.16455316e+00 7.46593662e-01 1.41972846e+00 -6.56037189e-01] [-6.13663959e-01 -5.40153963e-01 -6.62107962e-01 9.38372495e-01] [ 7.55988167e-01 -1.38565463e+00 -3.90831310e-01 -7.12290338e-02]] Correlation matrix V: [[ 1. -0.01097257 0.01755376 0.01479656] [-0.01097257 1. 0.10412532 0.01567658] [ 0.01755376 0.10412532 1. -0.01258119] [ 0.01479656 0.01567658 -0.01258119 1. ]] Eigenvalues: [0.88761319 0.99343832 1.01453559 1.1044129 ] Positive definite?
True