Thanks for that Gael - I do know nilearn but in this case I did a depth-first search on doing SVM on brain images and ended up here :) The size of 'coef' is (1,205739), the size of mask[mask].T is (205739,)
Same number of elements, different storage layout(?). Turned out that the numpy.ravel() function -pointed out by my colleague- can solve that! >>> wmap[mask]=np.ravel(coef) bw Alle Meije On 5 May 2017 at 07:59, Gael Varoquaux <gael.varoqu...@normalesup.org> wrote: > Hi Alle, > > I think that what has changed between 2014 and today is that the > coefficients coef are now a 2D array (number of hyperplanes x number of > features). In your case, the first direction is of length one, so you > could just do: > > coef = clf.coef_[0] > > and your script should work. > > The code of the Abraham paper cannot be updated, because papers are not > living objects. However, we are maintaining a package that encodes all > these patterns in higher-level construct: http://nilearn.github.io/ > It might be a good idea to use this package, as it is maintained and has > quality assurance. > > Best, > > Gaƫl > > On Thu, May 04, 2017 at 05:52:27PM +0200, Alle Meije Wink wrote: > > I have a script to classify MRI perfusion maps from healthy subjects and > > patients. For the file IO and the classifier I have started with the > example > > code in Abraham et al 2014 [https://arxiv.org/pdf/1412.3919.pdf]. > > > I use the same classifier as in the paper to produce a back-projected > map of > > classification weights, which I then want to 'unmask' like in the paper: > > > coef=clf.coef_ > > coef=featureselection.inverse_transform(coef) > > > and > > > map_name='weights_check.nii.gz' > > wmap=np.zeros(mask.shape, dtype=X.dtype) > > wmap[mask]=coef > > img=nb.Nifti1Image(wmap,np.eye(4)) > > img.to_filename(map_name) > > > But the line "wmap[mask]=coef" throws an error "ValueError: boolean > index array > > should have 1 dimension". I tried the example code from the paper and > that > > works. > > > Is the 'coef' array of back-projected SVM weights in some way different > than > > the masked input image? Or am I doing something else wrong? The error > suggests > > that the mask array is the problem. > > > The complete script is attached. > > > Many thanks for your help! > > Alle Meije > > > # -*- coding: utf-8 -*- > > """ > > classify MR images from controls (CON) and patients (MCI) > > > """ > > > import os > > import numpy as np > > import nibabel as nb > > import sklearn as sl > > > from sklearn.feature_selection import f_classif > > from sklearn import svm > > > def subj_lists( rootdir='/data/a.wink/MR', starts=['CON','MCI'] ): > > > # make and empty list for each patient group > > slists=[] > > for i in range(0,len(starts)): > > slists.append([]); > > > # add subjects to the group based on > > for root, dirs, files in os.walk(rootdir): > > for fname in files: > > for i in range(0,len(starts)): > > if fname.startswith(starts[i]): > > slists[i].append(os.path.join(root,fname)) > > > print('finished building subject lists') > > return slists > > > def mk_mask ( subj_lists=[] ): > > > # check whether mask can be loaded > > mname='mask_check.nii.gz' > > > if os.path.isfile(mname): > > > msk=nb.load(mname).get_data() > > > # or must be built (values >20% in the subject images and >20% grey > matter in the template) > > else: > > > num_im=0; > > for i in range(0,len(subj_lists)): > > for fname in subj_lists[i]: > > imdata=nb.load(fname).get_data() > > if 'msk' not in locals(): > > msk=np.absolute(imdata) > > else: > > msk=msk+np.absolute(imdata) > > num_im+=1 > > > msk/=num_im > > msk/=np.amax(msk) > > msk[msk<.2]=0 > > msk[msk>0]=1 > > > grey=nb.load('/usr/local/spm8/apriori/grey.nii').get_data() > > grey[grey<.2]=0 > > grey[grey>0]=1 > > > msk=msk*grey > > > img=nb.Nifti1Image(msk,np.eye(4)) > > img.to_filename(mname) > > > msk=msk.astype(bool) > > > print('finished building mask') > > return msk, mname > > > def load_images( subj_lists=[], mask=[] ): > > > # load all the images, build a matrix X or subjects (rows) * > inmask-voxels (columns) > > num_im=0; > > for i in range(0,len(subj_lists)): > > for fname in subj_lists[i]: > > imdata=nb.load(fname).get_data() > > num_im+=1 > > print '\r' + str(num_im) +'\r', > > if 'the_matrix' not in locals(): > > the_matrix=imdata[mask].T > > else: > > the_matrix=np.vstack((the_matrix,imdata[mask].T)) > > > print('finished building matrix X') > > return the_matrix > > > def main(): > > > # get the input data > > subjlists = subj_lists() > > y=np.concatenate( ([-1 for _ in range(len(subjlists[0]))], > > [ 1 for _ in range(len(subjlists[1]))]) ) > > mask, mas_name = mk_mask(subjlists) > > X = load_images(subjlists,mask) > > print "number of subjects, voxels: %d, %d" % X.shape > > > # select features > > featureselection=sl.feature_selection.SelectKBest(f_classif, k=8000) > > X_reduced=featureselection.fit_transform(X,y) > > > # classify > > clf=svm.SVC(kernel='linear') > > clf.fit(X_reduced,y) > > > # make discrimination map > > coef=clf.coef_ > > coef=featureselection.inverse_transform(coef) > > > map_name='weights_check.nii.gz' > > wmap=np.zeros(mask.shape, dtype=X.dtype) > > wmap[mask]=coef > > img=nb.Nifti1Image(wmap,np.eye(4)) > > img.to_filename(map_name) > > > if __name__ == "__main__": > > main() > > > > _______________________________________________ > > scikit-learn mailing list > > scikit-learn@python.org > > https://mail.python.org/mailman/listinfo/scikit-learn > > > -- > Gael Varoquaux > Researcher, INRIA Parietal > NeuroSpin/CEA Saclay , Bat 145, 91191 Gif-sur-Yvette France > Phone: ++ 33-1-69-08-79-68 > http://gael-varoquaux.info http://twitter.com/GaelVaroquaux > _______________________________________________ > scikit-learn mailing list > scikit-learn@python.org > https://mail.python.org/mailman/listinfo/scikit-learn >
_______________________________________________ scikit-learn mailing list scikit-learn@python.org https://mail.python.org/mailman/listinfo/scikit-learn