Multiple lib changes
This commit is contained in:
@@ -30,22 +30,14 @@ def w_pls_gen(aat,b,n_blocks=None,center=True,index_out=False):
|
||||
b_in = b[inn,:]
|
||||
b_out = b[out,:]
|
||||
if center:
|
||||
# centering projector: I - (1/n)11'
|
||||
# nin = len(inn)
|
||||
# Pc = eye(nin) - outer(ones((nin,)),ones((nin,)))/nin
|
||||
# xxt - x( outer(ones((nin,)),ones((nin,)))/nin ) x.T
|
||||
|
||||
# de jong:
|
||||
h = sum(aat_in,0)[ :,newaxis]
|
||||
h = (h - mean(h)/2)/len(inn)
|
||||
mn_a = h + h.T
|
||||
aat_in = aat_in - mn_a
|
||||
aat_in, mn = outerprod_centering(aat_in)
|
||||
aat_out = aat_out - mn
|
||||
if index_out:
|
||||
yield aat_in,aat_out,b_in,b_out,out
|
||||
else:
|
||||
yield aat_in,aat_out,b_in,b_out
|
||||
|
||||
def pls_gen(a,b, n_blocks=None, center=False, index_out=False,axis=0):
|
||||
def pls_gen(a, b, n_blocks=None, center=False, index_out=False,axis=0, metric=None):
|
||||
"""Random block crossvalidation
|
||||
Leave-one-out is a subset, with n_blocks equals a.shape[-1]
|
||||
"""
|
||||
@@ -56,17 +48,38 @@ def pls_gen(a,b, n_blocks=None, center=False, index_out=False,axis=0):
|
||||
out_ind_sets = [index[i*n_in_set:(i+1)*n_in_set] for i in range(n_blocks)]
|
||||
for out in out_ind_sets:
|
||||
inn = [i for i in index if i not in out]
|
||||
acal = a.take(inn, 0)
|
||||
atrue = a.take(out, 0)
|
||||
bcal = b.take(inn, 0)
|
||||
btrue = b.take(out, 0)
|
||||
if center:
|
||||
a = a - mean(a,0)[newaxis]
|
||||
b = b - mean(b,0)[newaxis]
|
||||
mn_a = acal.mean(0)[newaxis]
|
||||
acal = acal - mn_a
|
||||
atrue = atrue - mn_a
|
||||
mn_b = bcal.mean(0)[newaxis]
|
||||
bcal = bcal - mn_b
|
||||
btrue = btrue - mn_b
|
||||
if metric!=None:
|
||||
acal = dot(acal, metric)
|
||||
if index_out:
|
||||
yield a.take(inn,0),a.take(out,0), b.take(inn,0),b.take(out,0),out
|
||||
yield acal, atrue, bcal, btrue, out
|
||||
else:
|
||||
yield a.take(inn,0),a.take(out,0), b.take(inn,0),b.take(out,0)
|
||||
yield acal, atrue, bcal, btrue
|
||||
|
||||
|
||||
def pca_gen(a,n_sets=None, center=False, index_out=False,axis=0):
|
||||
"""PCA random block crossval generator.
|
||||
def pca_gen(a, n_sets=None, center=False, index_out=False, axis=0):
|
||||
"""Returns a generator of crossvalidation sample segments.
|
||||
|
||||
input:
|
||||
-- a, data matrix (m x n)
|
||||
-- n_sets, number of segments/subsets to generate.
|
||||
-- center, bool, choice of centering each subset
|
||||
-- index_out, bool, return subset index
|
||||
-- axis, int, which axis to get subset from
|
||||
|
||||
ouput:
|
||||
-- V, generator with (n_sets) memebers (subsets)
|
||||
|
||||
"""
|
||||
m = a.shape[axis]
|
||||
index = randperm(m)
|
||||
@@ -76,21 +89,26 @@ def pca_gen(a,n_sets=None, center=False, index_out=False,axis=0):
|
||||
out_ind_sets = [index[i*n_in_set:(i+1)*n_in_set] for i in range(n_sets)]
|
||||
for out in out_ind_sets:
|
||||
inn = [i for i in index if i not in out]
|
||||
acal = a.take(inn, 0)
|
||||
atrue = a.take(out, 0)
|
||||
if center:
|
||||
a = a - mean(a,0)[newaxis]
|
||||
mn_a = acal.mean(0)[newaxis]
|
||||
acal = acal - mn_a
|
||||
atrue = atrue - mn_a
|
||||
if index_out:
|
||||
yield a.take(inn,0),a.take(out,0),out
|
||||
else:
|
||||
yield a.take(inn,0),a.take(out,0)
|
||||
yield acal, atrue, out
|
||||
else:
|
||||
yield acal, atrue
|
||||
|
||||
def w_pls_gen_jk(a,b,n_sets=None,center=True,index_out=False,axis=0):
|
||||
def w_pls_gen_jk(a, b, n_sets=None, center=True,
|
||||
index_out=False, axis=0):
|
||||
"""Random block crossvalidation for wide X (m>>n)
|
||||
Leave-one-out is a subset, with n_sets equals a.shape[-1]
|
||||
|
||||
Returns : X_m and X_m'Y_m
|
||||
"""
|
||||
m = a.shape[axis]
|
||||
ab = dot(a.T,b)
|
||||
ab = dot(a.T, b)
|
||||
index = randperm(m)
|
||||
if n_sets==None:
|
||||
n_sets = m
|
||||
@@ -103,19 +121,18 @@ def w_pls_gen_jk(a,b,n_sets=None,center=True,index_out=False,axis=0):
|
||||
a_in = a[inn,:]
|
||||
mn_a = 0
|
||||
mAB = 0
|
||||
|
||||
if center:
|
||||
mn_a = mean(a,0)[newaxis]
|
||||
mAin = dot(-ones((1,nout)),a[out,:])/nin
|
||||
mBin = dot(-ones((1,nout)),b[out,:])/nin
|
||||
mAB = dot(mAin.T,(mBin*nin))
|
||||
ab_in = ab - dot(a[out,].T,b[out,:]) - mAB
|
||||
mn_a = a_in.mean(0)[newaxis]
|
||||
mAin = dot(-ones((1,nout)), a[out,:])/nin
|
||||
mBin = dot(-ones((1,nout)), b[out,:])/nin
|
||||
mAB = dot(mAin.T, (mBin*nin))
|
||||
ab_in = ab - dot(a[out,].T, b[out,:]) - mAB
|
||||
a_in = a_in - mn_a
|
||||
|
||||
if index_out:
|
||||
yield ain,ab, out
|
||||
yield a_in, ab_in, out
|
||||
else:
|
||||
yield a_in, ab
|
||||
yield a_in, ab_in
|
||||
|
||||
def shuffle_1d_block(a, n_sets=None, blocks=None, index_out=False, axis=0):
|
||||
"""Random block shuffling along 1d axis
|
||||
@@ -185,3 +202,19 @@ def diag_pert(a, n_sets=10, center=True, index_out=False):
|
||||
yield a_out, asarray(out)
|
||||
else:
|
||||
yield a_out
|
||||
|
||||
|
||||
def outerprod_centering(aat, ret_mn=True):
|
||||
"""Returns mean centered symmetric outerproduct matrix.
|
||||
"""
|
||||
n = aat.shape[0]
|
||||
h = aat.sum(0)[:,newaxis]
|
||||
h = (h - mean(h)/2)/n
|
||||
mn_a = h + h.T
|
||||
aatc = aat - mn_a
|
||||
if ret_mn:
|
||||
return aatc, aat.mean(0)
|
||||
return aat - mn_a
|
||||
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user