Esempio n. 1
0
 def save_model(self, epoch):
     user_factor_path = os.path.join(
         util.data_home(), 'checkpoint',
         '%s_%d_user.npy' % (self.model_name, epoch))
     item_factor_path = os.path.join(
         util.data_home(), 'checkpoint',
         '%s_%d_item.npy' % (self.model_name, epoch))
     np.save(user_factor_path, self.X)
     np.save(item_factor_path, self.Y)
     print("checkpoint saved!")
Esempio n. 2
0
def kfold_split(matrix, k, coordi_type):
    coordi_list = []
    output_dir = os.path.join(util.data_home(), 'binary_kfold')
    rows, cols = matrix.shape
    for i in range(rows):
        for j in range(cols):
            if matrix[i][j] == 1:
                coordi_list.append((i, j))

    random.shuffle(coordi_list)
    kfold_size = int(len(coordi_list) / k)
    print('start to generate %d fold train/test data, each size: %d' %
          (k, kfold_size))
    for i in range(k):
        kfold_train = np.copy(matrix)
        kfold_test = np.zeros(matrix.shape)
        for j in range(kfold_size):
            cur_coordi = coordi_list.pop()
            if not cur_coordi:
                break
            kfold_train[cur_coordi[0]][cur_coordi[1]] = 0
            kfold_test[cur_coordi[0]][cur_coordi[1]] = 1
        train_npy_path = os.path.join(
            output_dir, coordi_type,
            'train_kfold_%s_%d.npy' % (coordi_type, i))
        test_npy_path = os.path.join(output_dir, coordi_type,
                                     'test_kfold_%s_%d.npy' % (coordi_type, i))
        np.save(train_npy_path, kfold_train)
        np.save(test_npy_path, kfold_test)
        print('%d kfold generated' % (i + 1))
    print('k-fold generate finish')
Esempio n. 3
0
def get_num_lines(input_data):
    print('start read line num')
    input_path = os.path.join(util.data_home(), 'origin', input_data)
    csv_file = csv.reader(open(input_path, "r"))
    count = 0
    for i, line in enumerate(csv_file):
        if i == 0:
            continue
        count += 1
    return count
Esempio n. 4
0
def train_kfold(model_config):
    validate_k = model_config['validate_k']
    coordi_type = model_config['voxel_cluster_type']
    for i in range(validate_k):
        train_matrix_data = 'train_kfold_%s_%d.npy' % (coordi_type, i)
        train_matrix_path = os.path.join(util.data_home(), 'binary_kfold',
                                         coordi_type, train_matrix_data)
        train_matrix = np.load(train_matrix_path)

        validation_matrix_data = 'test_kfold_%s_%d.npy' % (coordi_type, i)
        validation_matrix_path = os.path.join(util.data_home(), 'binary_kfold',
                                              coordi_type,
                                              validation_matrix_data)
        validation_matrix = np.load(validation_matrix_path)

        # 모델을 초기화 한 다음에 학습을 진행한다.
        # 로스 변화 시각화는 train 함수에서 실행하며, 모델의 저장은 각 모델 클래스 파일에 정의되어 있다.
        model = initialize_model(model_config, train_matrix, validation_matrix)
        train(model, model_config, i)
        logger.info('train and save model')
        print('kfold step %d finish' % i)
Esempio n. 5
0
def get_voxel_cluster_dict(coordi_data):
    coordi_path = os.path.join(util.data_home(), 'coordi', coordi_data)
    coordi_df = pd.read_csv(coordi_path)
    coordi_df = coordi_df.drop(columns=['mni_x', 'mni_y', 'mni_z'])

    # 기존 코디네이트 테이블이 1번부터 region index를 매겼기 때문에 1씩 빼준다.
    coordi_df['shen_regionid'] = (coordi_df['shen_regionid'].astype('int64') -
                                  1)
    coordi_df = coordi_df.set_index('voxel_id')

    # max 값에 + 1을 취해주는 것은 각 인덱스를 모조리 -1 해주었기 때문에 0부터 시작한다 그러므로 +1을 해주어야 전체 개수가 된다.
    return coordi_df.to_dict()['shen_regionid'], int(
        coordi_df['shen_regionid'].max()) + 1
Esempio n. 6
0
def get_keyword_dict(keyword_data):
    keyword_path = os.path.join(util.data_home(), 'keyword', keyword_data)
    keyword_csv = csv.reader(open(keyword_path, 'r'))
    keyword_dict = {}
    keyword_count = 0
    for i, row in enumerate(keyword_csv):
        if i == 0:
            continue
        if not keyword_dict.keys().__contains__(row[1]):
            keyword_dict.update({row[1]: keyword_count})
            keyword_count += 1
        else:
            print('dupli!', row)
    return keyword_dict, keyword_count
Esempio n. 7
0
def kfold_generate():
    # 세 가지 복셀 클러스터 중 하나 선택: atlas morphome org
    coordi_type = 'org'
    coordi_data = 'coordi_%s.csv' % coordi_type

    # 선택안: keyword_origin.csv, keyword_sample.csv
    keyword_data = 'keyword_origin.csv'

    voxel_cluster_dict, voxel_cluster_count = dataload.get_voxel_cluster_dict(
        coordi_data)
    keyword_dict, keyword_count = dataload.get_keyword_dict(keyword_data)

    binary_matrix_data = 'matrix_%s.npy' % coordi_type
    binary_path = os.path.join(util.data_home(), 'binary_npy',
                               binary_matrix_data)

    binary_marix = np.load(binary_path)
    kfold_split(binary_marix, 4, coordi_type)
Esempio n. 8
0
def main():
    config = (util.readconfig())['preprocess']
    data_dir = os.path.join(util.project_home(), 'data', 'origin')

    # 입력 데이터 설정
    # 선택안: train_origin.csv, test_origin.csv, total_origin.csv
    input_data = 'train_origin.csv'

    # 세 가지 유형의 voxel cluster 중 하나 선택: atlas, morphome, org
    coordi_type = 'org'
    coordi_data = 'coordi_%s.csv' % coordi_type

    # 선택안: keyword_origin.csv, keyword_sample.csv
    keyword_data = 'keyword_origin.csv'

    input_csv = get_input_data(input_data)
    voxel_cluster_dict, voxel_cluster_count = dataload.get_voxel_cluster_dict(
        coordi_data)
    keyword_dict, keyword_count = dataload.get_keyword_dict(keyword_data)

    matrix = np.zeros([keyword_count, voxel_cluster_count])
    for i, row in tqdm(enumerate(input_csv), total=get_num_lines(input_data)):
        if i == 0:
            continue

        if not voxel_cluster_dict.get(row[1]):
            continue

        row_coord = keyword_dict.get(row[0])
        col_coord = voxel_cluster_dict.get(row[1])
        matrix[row_coord][col_coord] += 1

    # 특정 임계치 이상 언급 횟수가 있으면 1, 아니면 0으로 정규화해준다.
    if config['binarize']:
        matrix[matrix < config['positive_limit']] = 0
        matrix[matrix >= config['positive_limit']] = 1

    # 결과 numpy array를 파일 형태로 저장한다.
    np_path = os.path.join(
        os.path.join(util.data_home(), 'binary_npy',
                     'matrix_%s.npy' % coordi_type))
    np.save(np_path, matrix)
Esempio n. 9
0

if __name__ == '__main__':
    config = util.readconfig()
    model_config = config['model_params']

    # 세 가지 유형의 voxel cluster 중 하나 선택: atlas, morphome, org
    coordi_type = 'atlas'
    coordi_data = 'coordi_%s.csv' % coordi_type

    user_factor_path = os.path.join(util.checkpoint_home(),
                                    'als_atlas_kfold_0_5_user.npy')
    item_factor_path = os.path.join(util.checkpoint_home(),
                                    'als_atlas_kfold_0_5_item.npy')

    org_data_path = os.path.join(util.data_home(), 'binary_kfold', 'atlas',
                                 'train_kfold_atlas_0.npy')
    org_matrix = np.load(org_data_path)

    # 선택안: keyword_origin.csv, keyword_sample.csv
    keyword_data = 'keyword_origin.csv'

    voxel_cluster_dict, voxel_cluster_count = dataload.get_voxel_cluster_dict(
        coordi_data)
    keyword_dict, keyword_count = dataload.get_keyword_dict(keyword_data)

    user_factor = np.load(user_factor_path)
    item_factor = np.load(item_factor_path)

    model = ALS(model_config)
    model.predict_initialize(user_factor, item_factor)
Esempio n. 10
0
def get_input_data(input_data):
    input_path = os.path.join(util.data_home(), 'origin', input_data)
    return csv.reader(open(input_path, 'r'))
Esempio n. 11
0
def kfold_check():
    test_kfold = np.load(
        os.path.join(util.data_home(), 'binary_kfold',
                     'test_kfold_atlas_0.npy'))
    np.savetxt('foo.csv', test_kfold.astype(int), fmt='%i', delimiter=',')
    print(test_kfold)