https://github.com/jiaxx/temporal_learning_paper
Raw File
Tip revision: bb355bb96286db2148c3abdc8f71b5880f657c5f authored by jiaxx on 01 April 2021, 02:44:09 UTC
Update README.md
Tip revision: bb355bb
main.py
# -*- coding: utf-8 -*-
"""
Created on Thu Oct 4 17:55:20 2020

@author: Xiaoxuan Jia
"""

import numpy as np
import scipy
from scipy.stats import norm
import numpy.random as npr
import random

import utils as ut
import learningutil as lt

def d_prime(CF):
    d = []
    for i in range(len(CF[1])):
        H = CF[i, i]/sum(CF[:,i]) # H = target diagnal/target column
        tempCF = scipy.delete(CF, i, 1) # delete the target column
        F = sum(tempCF[i,:])/sum(tempCF)
        d.append(norm.ppf(H)-norm.ppf(F))
    return d


def sample_with_replacement(list):
    l = len(list) # the sample needs to be as long as list
    r = xrange(l)
    _random = random.random
    return [list[int(_random()*l)] for i in r] # using


def compute_CM(neuron, meta, obj, s, train, test):
    metric_kwargs = {'model_type': 'MCC2'} # multi-class classifier
    
    eval_config = {
        'train_q': {'obj': [obj[0], obj[1]]}, # train on all sizes
        'test_q': {'obj': [obj[0], obj[1]], 's': [s]},   #'size_range': [1.3],  
        'npc_train':  train, #smaller than total number of samples in each split_by object
        'npc_test':   test,
        'npc_validate':  0,
        'num_splits':    100,
        'split_by': 'obj',
        'metric_screen': 'classifier', # use correlation matrix as classifier 
        'labelfunc': 'obj',
        'metric_kwargs': metric_kwargs,
    }
    result = ut.compute_metric_base(neuron, meta, eval_config)

    # sum of the CMs is equal to npc_test*number of objs
    CMs = []
    for i in range(eval_config['num_splits']):
        temp = np.array(result['result_summary']['cms'])[:,:,i]
        CMs.append(lt.normalize_CM(temp))
    d =  ut.dprime(np.mean(CMs,axis=0))[0]
    return CMs, d


def compute_CM_samesize(neuron, meta, obj, s, train, test):
    metric_kwargs = {'model_type': 'MCC2'} # multi-class classifier
    
    eval_config = {
        'train_q': {'obj': [obj[0], obj[1]], 's': [s]}, # train on particular size
        'test_q': {'obj': [obj[0], obj[1]], 's': [s]},   #test on particular size 
        'npc_train':  train, #smaller than total number of samples in each split_by object
        'npc_test':   test,
        'npc_validate':  0,
        'num_splits':    100,
        'split_by': 'obj',
        'metric_screen': 'classifier', # use correlation matrix as classifier 
        'labelfunc': 'obj',
        'metric_kwargs': metric_kwargs,
    }
    result = ut.compute_metric_base(neuron, meta, eval_config)

    # sum of the CMs is equal to npc_test*number of objs
    CMs = []
    for i in range(eval_config['num_splits']):
        temp = np.array(result['result_summary']['cms'])[:,:,i]
        CMs.append(lt.normalize_CM(temp))
    d =  ut.dprime(np.mean(CMs,axis=0))[0]
    return CMs, d


def compute_CM_fixed_classifier(neuron, meta, obj, s, train, test):
    metric_kwargs = {'model_type': 'MCC2'} # multi-class classifier
    
    eval_config = {
        'train_q': {'obj': [obj[0], obj[1]], 'test_phase':['Pre']}, # train on all sizes
        'test_q': {'obj': [obj[0], obj[1]], 's': [s], 'test_phase':['Post']},   #'size_range': [1.3],  
        'npc_train':  train, #smaller than total number of samples in each split_by object
        'npc_test':   test,
        'npc_validate':  0,
        'num_splits':    100,
        'split_by': 'obj',
        'metric_screen': 'classifier', # use correlation matrix as classifier 
        'labelfunc': 'obj',
        'metric_kwargs': metric_kwargs,
    }
    result = ut.compute_metric_base(neuron, meta, eval_config)

    # sum of the CMs is equal to npc_test*number of objs
    CMs = []
    for i in range(eval_config['num_splits']):
        temp = np.array(result['result_summary']['cms'])[:,:,i]
        CMs.append(lt.normalize_CM(temp))
    d =  ut.dprime(np.mean(CMs,axis=0))[0]
    return CMs, d
back to top