Beispiel #1
0
def getCorr():
    # global vibData
    # global vibName
    if request.method == 'GET':
        progress_data['getCorr'] = 0
        vibName = request.args.get("vibName")
        dataProcess = request.args.get("dataProcess", type=bool, default=False)
        if vibName + "_FP_col" in os.listdir("Savedfile") and vibName + "_FP_corr" in os.listdir("Savedfile"):
            corr_list = loadFile('Savedfile/' + vibName + '_FP_corr')
            col_list = loadFile('Savedfile/' + vibName + '_FP_col')
            corr = np.array(corr_list)
            col = np.array(col_list)
            vib_FP_highCorr_FP = corr[np.argsort(np.abs(corr))[::-1]].tolist()
            vib_FP_highCol_FP = col[np.argsort(np.abs(corr))[::-1]].tolist()
            progress_data['getCorr'] = float(100)
        else:
            corr_list = []  # 初始化相关性list
            col_list = []  # 初始化变量名list
            zeroCor_191207 = loadFile("Savedfile/zeroCor_191207")
            vibFolder = baseURL + findKey(VIBParamsTrain, vibName)
            # vibFolder = "FTPD-C919-10101-YL-" + trainTime[0] + "-F-01-" + vibFile + ".txt"  # 查找振动数据所在数据包名称
            vibData = readData(vibFolder, vibName, SubSampling)  # 读取振动数据
            vibTime = readTime(vibFolder, SubSampling)  # 读取数据包时间序列
            # 统计飞参个数
            FpNumber = 0
            for file in FPParamsTrain.keys():
                FpNumber += len(FPParamsTrain[file])
            i = 1
            for file in FPParamsTrain.keys():
                time_i = readTime(baseURL + file, SubSampling)  # 读取飞参时间
                for FPParam in FPParamsTrain[file]:
                    if (FPParam in zeroCor_191207):  # 如果某个变量在zeroCor_191207中
                        print(FPParam + " Break!")  # 告知并跳过该变量的计算
                    elif ("Accel" in FPParam):  # 如果某个变量包括"Accel"在变量名称中,该变量为加速度传感器数据
                        print(FPParam + " Break!")  # 告知并跳过该变量的计算
                    else:
                        jCol = readData(baseURL + file, FPParam, SubSampling)  # 读取飞参数据
                        jCol_matched = matchData(vibTime, time_i, jCol)  # 将飞参数据与振动数据时间轴匹配
                        corrJ = scs.pearsonr(jCol_matched, vibData)[0]  # 计算该飞参数据与振动响应数据的相关性
                        corr_list.append(corrJ)  # 将计算的相关性加入corr_list中
                        col_list.append(FPParam)  # 将变量名称加入col_list
                        print("Correlation between " + FPParam + " and " + str(vibName) + " is " + str(
                            corrJ))  # 告知变量名与相关性
                    num_progress = round(i * 100 / FpNumber, 2)
                    print(num_progress)
                    i += 1
                    print(i)
                    progress_data['getCorr'] = num_progress
            print(" Fetching complete!")  # 告知飞参变量的读取完毕
            writeFile("Savedfile/" + vibName + "_FP_corr", corr_list)
            writeFile("Savedfile/" + vibName + "_FP_col", col_list)
            corr = np.array(corr_list)
            col = np.array(col_list)
            vib_FP_highCorr_FP = corr[np.argsort(np.abs(corr))[::-1]].tolist()
            vib_FP_highCol_FP = col[np.argsort(np.abs(corr))[::-1]].tolist()
        result = {"corr_list": vib_FP_highCorr_FP, "col_list": vib_FP_highCol_FP}
        # vibNames.append(vibName)
        return Response(json.dumps(result), mimetype='application/json')
Beispiel #2
0
def train(vib_Name, flightTime, modelPath, num, vib_value, vib_time):
    # 飞参与vib的相关性及其变量名
    vib_191207_FP_corr = loadFile("Savedfile/" + flightTime + "_" + vib_Name +
                                  "_FP_corr")
    vib_191207_FP_col = loadFile("Savedfile/" + flightTime + "_" + vib_Name +
                                 "_FP_col")

    # list转换为np.array
    vib_191207_FP_corr_ary = np.array(vib_191207_FP_corr)
    vib_191207_FP_col_ary = np.array(vib_191207_FP_col)

    # 选择相关性最高的20个飞参
    num = -1 * int(num)
    vib_FP_highCol_FP = vib_191207_FP_col_ary[np.argsort(
        np.abs(vib_191207_FP_corr_ary))][num:]
    # 表示进行频域变换的每个单元监控点的数量
    NUM = 500

    # # 读取经过转换后的测点数据和飞参数据
    # vib_value = np.array(vib_value[:(len(vib_value)-len(vib_value) % NUM)])
    # vib_value = np.reshape(vib_value, (-1, NUM))
    # vib_time = np.array(vib_time[:(len(vib_time) - len(vib_time) % NUM)])
    # vib_time = np.reshape(vib_time, (-1, NUM))
    # vib_time = vib_time[:, 0]
    # FP_time =

    vib_value_191207, FP_value_191207 = readVIB_FPData(vib_Name,
                                                       vib_FP_highCol_FP,
                                                       '191207', NUM)

    vib_abs_191207, vib_ang_191207 = FFTvibData(vib_value_191207, NUM)

    # 需要预测的测点的频率
    select_fre = range(0, 200)
    vib_191207_ary = vib_abs_191207[:, select_fre]
    # 对转换后的频域信号进行滑动时间窗移动平均
    vib_191207_ary = timeWindows(vib_191207_ary, length=10)

    if modelPath == None:
        '''
          线性回归
          预测及结果展示
          '''
        LRreg = LinearRegression().fit(FP_value_191207, vib_191207_ary)
    else:
        with open(modelPath, 'rb') as f:
            LRreg = pickle.load(f)  # 从f文件中提取出模型赋给clf2
        LRreg.fit(FP_value_191207, vib_191207_ary)
    return LRreg
Beispiel #3
0
def getNum():
    global vibNameforTrain
    vibNameforTrain = request.args.get('vibName')
    # vibNameforTrain = "ANF6"
    num = request.args.get('num')
    # 飞参与vib的相关性及其变量名
    vib_191207_FP_corr = loadFile('Savedfile/' + vibNameforTrain + '_FP_corr')
    vib_191207_FP_col = loadFile('Savedfile/' + vibNameforTrain + '_FP_col')
    # list转换为np.array
    vib_191207_FP_corr_ary = np.array(vib_191207_FP_corr)
    vib_191207_FP_col_ary = np.array(vib_191207_FP_col)
    vib_FP_highCol_FP = vib_191207_FP_col_ary[np.argsort(np.abs(vib_191207_FP_corr_ary))[::-1]].tolist()
    # 选择相关性最高的num个飞参
    num = -1 * int(num)
    FPPre = vib_191207_FP_col_ary[np.argsort(np.abs(vib_191207_FP_corr_ary))][num:]
    result = {"col": vib_FP_highCol_FP, "checked": FPPre.tolist()}
    return result
Beispiel #4
0
def predict(vib_Name, num):
    # 飞参与vib的相关性及其变量名
    vib_191207_FP_corr = loadFile('Savedfile/' + vib_Name + '_FP_corr')
    vib_191207_FP_col = loadFile('Savedfile/' + vib_Name + '_FP_col')

    # list转换为np.array
    vib_191207_FP_corr_ary = np.array(vib_191207_FP_corr)
    vib_191207_FP_col_ary = np.array(vib_191207_FP_col)

    # 选择相关性最高的20个飞参
    num = -1 * num
    vib_FP_highCol_FP = vib_191207_FP_col_ary[np.argsort(
        np.abs(vib_191207_FP_corr_ary))][num:]

    # 表示进行频域变换的每个单元监控点的数量
    NUM = 500
    # 读取经过转换后的测点数据和飞参数据
    vib_value_191207, FP_value_191207 = readVIB_FPData(vib_Name,
                                                       vib_FP_highCol_FP,
                                                       '191207', NUM)
    vib_value_200102, FP_value_200102 = readVIB_FPData(vib_Name,
                                                       vib_FP_highCol_FP,
                                                       '200102', NUM)
    vib_value_200106, FP_value_200106 = readVIB_FPData(vib_Name,
                                                       vib_FP_highCol_FP,
                                                       '200106', NUM)

    vib_abs_191207, vib_ang_191207 = FFTvibData(vib_value_191207, NUM)
    vib_abs_200102, vib_ang_200102 = FFTvibData(vib_value_200102, NUM)
    vib_abs_200106, vib_ang_200106 = FFTvibData(vib_value_200106, NUM)

    # 需要预测的测点的频率
    select_fre = range(0, 200)

    vib_191207_ary = vib_abs_191207[:, select_fre]
    vib_200102_ary = vib_abs_200102[:, select_fre]
    vib_200106_ary = vib_abs_200106[:, select_fre]

    # 对转换后的频域信号进行滑动时间窗移动平均
    vib_191207_ary = timeWindows(vib_191207_ary, length=10)
    vib_200102_ary = timeWindows(vib_200102_ary, length=10)
    vib_200106_ary = timeWindows(vib_200106_ary, length=10)
    '''
    线性回归
    预测及结果展示
    '''
    LRreg = LinearRegression().fit(FP_value_191207, vib_191207_ary)
    vib_pred_LR_200102 = LRreg.predict(FP_value_200102)
    '''
    支持向量机回归
    预测及结果展示
    '''
    SVRreg = []
    base_SVRreg = make_pipeline(
        SVR(kernel='rbf',
            C=100,
            tol=0.1,
            gamma=0.1,
            epsilon=0.5,
            max_iter=1000))
    for i in range(len(select_fre)):
        SVRreg.append(
            sklearn.base.clone(base_SVRreg).fit(FP_value_191207,
                                                vib_191207_ary[:, i]))
    vib_pred_SVR_200102 = np.array(
        [SVRreg[i].predict(FP_value_200102) for i in range(len(select_fre))]).T
    '''
    人工神经网络
    预测及结果展示
    '''
    ANNreg = make_pipeline(
        StandardScaler(),
        MLPRegressor(hidden_layer_sizes=(100, ),
                     alpha=0.001,
                     learning_rate_init=0.001,
                     random_state=1,
                     max_iter=100))
    ANNreg.fit(FP_value_191207, vib_191207_ary)
    vib_pred_ANN_200102 = ANNreg.predict(FP_value_200102)
    '''
    算法集合体
    预测及结果展示
    '''
    LR_meta = []
    base_LR_meta = LinearRegression()
    for i in range(len(select_fre)):
        vib_pred_ALL_200102 = np.hstack(
            (vib_pred_LR_200102[:, i].reshape(-1, 1),
             vib_pred_SVR_200102[:, i].reshape(-1, 1),
             vib_pred_ANN_200102[:, i].reshape(-1, 1)))
        LR_meta.append(
            sklearn.base.clone(base_LR_meta).fit(vib_pred_ALL_200102,
                                                 vib_200102_ary[:, i]))

    # vib_pred_ALL_200102, vib_200102_ary = TrainDataUnSamping(vib_pred_ALL_200102, vib_200102_ary, 10000)

    vib_pred_LR_200106 = LRreg.predict(FP_value_200106)
    vib_pred_SVR_200106 = np.array(
        [SVRreg[i].predict(FP_value_200106) for i in range(len(select_fre))]).T
    vib_pred_ANN_200106 = ANNreg.predict(FP_value_200106)

    vib_pred_final_200106 = np.array([LR_meta[i].predict(np.hstack((vib_pred_LR_200106[:, i].reshape(-1, 1),
                                                                    vib_pred_SVR_200106[:, i].reshape(-1, 1),
                                                                    vib_pred_ANN_200106[:, i].reshape(-1, 1)))) \
                                      for i in range(len(select_fre))]).T

    # 将预测的频域信号通过快速傅里叶逆变换转换成时域信号,并进行评价和可视化
    # vib_true_200106 = vib_value_200106.reshape(-1)
    vib_true_200106 = ifftOrigin(timeWindows(vib_abs_200106, length=10),
                                 vib_ang_200106)
    vib_pred_200106 = ifftPredict(vib_pred_final_200106, select_fre, NUM)
    print(
        abs(
            np.sqrt(np.mean(vib_true_200106**2)) -
            np.sqrt(np.mean(vib_pred_200106**2))) /
        np.sqrt(np.mean(vib_true_200106**2)))
    plt.figure()
    plt.plot(vib_true_200106)
    plt.plot(vib_pred_200106)
    plt.title('算法集合体预测结果')
Beispiel #5
0
def predict():
    input_data = json.loads(str(request.get_data().decode()))
    modelPath = input_data.get("modelPath")
    VIBForPredict = input_data.get('VIBForPredict')
    vib_FP_highCol_FP = input_data.get('FPForPredict')
    zeroCor_191207 = loadFile("Savedfile/zeroCor_191207")
    fpPredict = []
    for key in vib_FP_highCol_FP.keys():
        for v in vib_FP_highCol_FP[key]:
            if v in zeroCor_191207.tolist():
                continue
            fpPredict.append(v)
    with open('model/' + modelPath, 'rb') as f:  # python路径要用反斜杠
        LR = pickle.load(f)
        SVR = pickle.load(f)
        ANN = pickle.load(f)
        LRmeta = pickle.load(f)
    features = loadFile("model/" + modelPath.split('.')[0] + "_input")
    # fpPredict.sort()
    # features.sort()
    # if fpPredict != features:
    #     return Response(json.dumps('模型需要的特征与选择的不一致'), mimetype='application/json')
    # if features !=
    # 表示进行频域变换的每个单元监控点的数量
    if len(fpPredict) < len(features):
        return Response(json.dumps({"code": 500, "msg": "选择的特征数少于该模型需要的特征数,请重选"}), mimetype='application/json')
    else:
        fpPredict = fpPredict[0:len(features)]
    NUM = 500
    # 需要预测的测点的频率
    select_fre = range(0, 200)
    vibNameforPredict = list(VIBForPredict.values())[0]
    vib_value_pre, FP_value_pre = readVIB_FPData(vibNameforPredict, VIBForPredict, features, vib_FP_highCol_FP,
                                                 baseURL, NUM, 'predict')
    vib_abs_pre, vib_ang_pre = FFTvibData(vib_value_pre, NUM)
    # vib_200102_ary = vib_abs_200102[:, select_fre]
    # 对转换后的频域信号进行滑动时间窗移动平均
    # vib_200102_ary = timeWindows(vib_200102_ary, length=10)
    # model = LRreg
    vib_pred_LR = LR.predict(FP_value_pre)
    vib_pred_SVR = np.array([SVR[i].predict(FP_value_pre) for i in range(len(select_fre))]).T
    vib_pred_ANN = ANN.predict(FP_value_pre)
    vib_pred_final = np.array([LRmeta[i].predict(np.hstack((vib_pred_LR[:, i].reshape(-1, 1),
                                                            vib_pred_SVR[:, i].reshape(-1, 1),
                                                            vib_pred_ANN[:, i].reshape(-1, 1)))) \
                               for i in range(len(select_fre))]).T
    progress_data['predict'] = 75.00  # 75%
    vib_true_pre = ifftOrigin(timeWindows(vib_abs_pre, length=10), vib_ang_pre)
    vib_pred_pre = ifftPredict(vib_pred_final, select_fre, 500)
    progress_data['predict'] = 90.00  # 90%
    plt.figure()
    plt.plot(vib_true_pre, label='true')
    plt.plot(vib_pred_pre, label='predict')
    plt.legend()
    plt.savefig(vibNameforPredict + ".png")
    RMSE = abs(np.sqrt(np.mean(vib_true_pre ** 2)) - np.sqrt(np.mean(vib_pred_pre ** 2))) * 100 / np.sqrt(
        np.mean(vib_true_pre ** 2))
    rms = abs(np.sqrt(np.mean(vib_true_pre ** 2)) - np.sqrt(np.mean(vib_pred_pre ** 2)))
    progress_data['predict'] = 100.00
    result = {"code": 200, "msg": "模型预测成功",
              "data": {"trueValue": vib_true_pre.tolist()[::1000], "predictValue": vib_pred_pre.tolist()[::1000],
                       "RMS": rms, "RMSE": RMSE}}
    return Response(json.dumps(result), mimetype='application/json')
def predict():
    # vib_name表示需要预测的测点名称
    vib_Name = 'ANT6'
    # 飞参与vib的相关性及其变量名
    vib_191207_vib_corr = loadFile('Savedfile/' + vib_Name + '_vib_corr')
    vib_191207_vib_col = loadFile('Savedfile/' + vib_Name + '_vib_col')

    # list转换为np.array
    vib_191207_vib_corr_ary = np.array(vib_191207_vib_corr)
    vib_191207_vib_col_ary = np.array(vib_191207_vib_col)

    # 选择相关性最高的10个其他测点
    vib_highCol_vib = vib_191207_vib_col_ary[np.argsort(
        np.abs(vib_191207_vib_corr_ary))][-11:-1]

    # 读取相关的测点数据
    vib_191207 = vibMatFetch(vib_highCol_vib, "191207")
    vib_200102 = vibMatFetch(vib_highCol_vib, "200102")
    vib_200106 = vibMatFetch(vib_highCol_vib, "200106")

    # 读取需要预测的测点数据
    ANT6_191207 = np.array(
        readData([
            findFolder(vib_Name)[j] for j in range(3)
            if "191207" in findFolder(vib_Name)[j]
        ][0], vib_Name))
    ANT6_200102 = np.array(
        readData([
            findFolder(vib_Name)[j] for j in range(3)
            if "200102" in findFolder(vib_Name)[j]
        ][0], vib_Name))
    ANT6_200106 = np.array(
        readData([
            findFolder(vib_Name)[j] for j in range(3)
            if "200106" in findFolder(vib_Name)[j]
        ][0], vib_Name))
    # vib_191207_1, ANT6_191207_1 = TrainDataUnSamping(vib_191207, ANT6_191207, 10000)
    '''
    线性回归
    预测及结果展示
    '''
    LRreg = LinearRegression().fit(vib_191207, ANT6_191207)
    vib_pred_LR_200102 = LRreg.predict(vib_200102)
    print(
        abs(
            np.sqrt(np.mean(ANT6_200102**2)) -
            np.sqrt(np.mean(vib_pred_LR_200102**2))) /
        np.sqrt(np.mean(ANT6_200102**2)))
    plt.figure()
    plt.plot(ANT6_200102)
    plt.plot(vib_pred_LR_200102)
    plt.title('线性回归预测结果')
    '''
    支持向量机回归
    预测及结果展示
    '''
    SVRreg = make_pipeline(
        SVR(kernel='rbf',
            C=100,
            tol=0.1,
            gamma=0.1,
            epsilon=0.5,
            max_iter=1000))
    SVRreg.fit(vib_191207, ANT6_191207)
    vib_pred_SVR_200102 = SVRreg.predict(vib_200102)
    print(
        abs(
            np.sqrt(np.mean(ANT6_200102**2)) -
            np.sqrt(np.mean(vib_pred_SVR_200102**2))) /
        np.sqrt(np.mean(ANT6_200102**2)))
    plt.figure()
    plt.plot(ANT6_200102)
    plt.plot(vib_pred_SVR_200102)
    plt.title('支持向量回归预测结果')
    '''
    人工神经网络
    预测及结果展示
    '''
    ANNreg = make_pipeline(
        StandardScaler(),
        MLPRegressor(hidden_layer_sizes=(100, ),
                     alpha=0.001,
                     learning_rate_init=0.01,
                     random_state=1,
                     max_iter=10))
    ANNreg.fit(vib_191207, ANT6_191207)
    vib_pred_ANN_200102 = ANNreg.predict(vib_200102)
    print(
        abs(
            np.sqrt(np.mean(ANT6_200102**2)) -
            np.sqrt(np.mean(vib_pred_ANN_200102**2))) /
        np.sqrt(np.mean(ANT6_200102**2)))
    plt.figure()
    plt.plot(ANT6_200102)
    plt.plot(vib_pred_ANN_200102)
    plt.title('人工神经网络预测结果')
    '''
    算法集合体
    预测及结果展示
    '''
    vib_pred_ALL_200102 = np.hstack(
        (vib_pred_LR_200102.reshape(-1, 1), vib_pred_SVR_200102.reshape(-1, 1),
         vib_pred_ANN_200102.reshape(-1, 1)))
    # vib_pred_ALL_200102, ANT6_200102 = TrainDataUnSamping(vib_pred_ALL_200102, ANT6_200102, 10000)
    LR_meta = LinearRegression().fit(vib_pred_ALL_200102, ANT6_200102)

    vib_pred_LR_200106 = LRreg.predict(vib_200106)
    vib_pred_SVR_200106 = SVRreg.predict(vib_200106)
    vib_pred_ANN_200106 = ANNreg.predict(vib_200106)

    vib_pred_ALL_200106 = np.hstack(
        (vib_pred_LR_200106.reshape(-1, 1), vib_pred_SVR_200106.reshape(-1, 1),
         vib_pred_ANN_200106.reshape(-1, 1)))
    vib_pred_final_200106 = LR_meta.predict(vib_pred_ALL_200106)
    print(
        abs(
            np.sqrt(np.mean(ANT6_200106**2)) -
            np.sqrt(np.mean(vib_pred_final_200106**2))) /
        np.sqrt(np.mean(ANT6_200106**2)))
    plt.figure()
    plt.plot(ANT6_200106)
    plt.plot(vib_pred_final_200106)
    plt.title('算法集合体预测结果')
Beispiel #7
0
def FPCorrCalculator(vibName, flightTime):
    '''
    计算输入变量(vibName)与某个架次(flightTime)飞行参数的Pearson's Correlation
    返回2个变量corr_list, col_list
    corr_list: 相关性系数
    col_list: 与相关性系数对应的变量名
    (corr_list[i]为col_list[i]与vibName的Person's Correlation)
    返回值类型均为list
    '''

    vibFolder = \
        [findFolder(vibName)[i] for i in range(len(findFolder(vibName))) if flightTime in findFolder(vibName)[i]][
            0]  # 查找振动数据所在数据包名称
    vibTime = readTime(vibFolder)  # 读取数据包时间序列
    vibData = readData(vibFolder, vibName)  # 读取振动数据
    zeroCor_191207 = loadFile("Savedfile/zeroCor_191207"
                              )  # zeroCor_191207为191207架次中的衡量变量,与振动响应数据无任何相关性

    print("Vib Fetching complete!")  # 告知振动数据已经提取完毕

    corr_list = []  # 初始化相关性list
    col_list = []  # 初始化变量名list

    # fileList_ = printFiles++()
    # fileFT = [fileList_[i] for i in range(len(fileList_)) if flightTime in fileList_[i]]

    for i in range(7):  # 在全部数据包中搜索
        filenameList = printFiles(os.getcwd())  # 将全部数据包名称存入filenameList变量
        filenameStr = filenameList[i]  # 将搜索至数据包名称存至filenameStr变量

        if (filenameStr.endswith("CAOWEN-664002-32.txt")
                or filenameStr.endswith("CAOWEN-664003-32.txt")
                or filenameStr.endswith("CAOWEN-ANA003-32.txt")
                or filenameStr.endswith("FCS-664002-16.txt")):  # 筛选飞参数据包
            print(filenameStr + " Fetching Started!")  # 告知开始提取某飞参数据包的数据
            # print (filenameStr)
            time_i = readTime(filenameStr)  # 将该飞参数据的时间数据存至time_i变量
            columns_i = printColumns(filenameStr)  # 将该飞参数据的变量名称存至columns_i变量
            print("In total of " + str(len(columns_i)) +
                  " columns")  # 告知一共有多少变量

            for j in range(1, len(columns_i)):  # 搜索提取的变量名称

                print("Start " + str(j) + "/" +
                      str(len(columns_i)))  # 告知开始计算某个变量

                if (columns_i[j] in zeroCor_191207):  # 如果某个变量在zeroCor_191207中
                    print(columns_i[j] + " Break!")  # 告知并跳过该变量的计算

                elif ("Accel"
                      in columns_i[j]):  # 如果某个变量包括"Accel"在变量名称中,该变量为加速度传感器数据
                    print(columns_i[j] + " Break!")  # 告知并跳过该变量的计算

                else:  # 如果不符合以上两种情况
                    jCol = readData(filenameStr, columns_i[j])  # 读取飞参数据
                    jCol_matched = matchData(vibTime, time_i,
                                             jCol)  # 将飞参数据与振动数据时间轴匹配
                    corrJ = scs.pearsonr(jCol_matched,
                                         vibData)[0]  # 计算该飞参数据与振动响应数据的相关性
                    corr_list.append(corrJ)  # 将计算的相关性加入corr_list中
                    col_list.append(columns_i[j])  # 将变量名称加入col_list
                    print("Correlation between " + columns_i[j] + " and " +
                          str(vibName) + " is " + str(corrJ))  # 告知变量名与相关性

            print(filenameStr + " Fetching complete!")  # 告知飞参变量的读取完毕

    return (corr_list, col_list)  # 输出corr_list与col_list