def knn_shapelet_experiment(knnClassifier, X_train, y_train, X_test, y_test, num_resample=1, verbose=True):
    minShapeletLength = 30
    maxShapeletLength = int(X_train.shape[1] * 0.7)
    numShapelet = int(X_train.shape[1] * 0.5)
    lengthIncrement = 20
    positionIncrement = 20
    sum_accuracy = 0
    for i in range(num_resample):
        callSTS = ShapeletTransformSimplicity(X_train, y_train,
                                              minShapeletLength, maxShapeletLength,
                                              lengthIncrement, positionIncrement)
        bestKShapelet = callSTS.train(numShapelet)
        print("bestKShapelet: ", np.shape(bestKShapelet))
        X_train_ = callSTS.transform(bestKShapelet, X_train)
        X_test_ = callSTS.transform(bestKShapelet, X_test)
        X_train_ = np.array(X_train_)
        X_test_ = np.array(X_test_)

        knnClassifier.fit(X_train_, y_train)
        predList = knnClassifier.predict(X_test_)
        iaccuracy = validation.cal_accuracy(y_test, predList)
        sum_accuracy += iaccuracy
        if verbose:
            print(iaccuracy)
        X_train, y_train, X_test, y_test = data_parser.resample_data(X_train, y_train, X_test, y_test)

    return sum_accuracy / num_resample
def benchmark(clf, distf, distparams=None):
    t0 = time()
    clf.set_distfunc(distfunc=distf, distfunc_params=distparams)
    y_pred = clf.predict(X_test)

    duration = time() - t0
    acc = validation.cal_accuracy(y_pred, y_test)
    return acc, duration
def knn_experiment(knnClassifier, X_train, y_train, X_test, y_test, num_resample=1, verbose=True):
    sum_accuracy = 0
    for i in range(num_resample):
        knnClassifier.fit(X_train, y_train)
        predList = knnClassifier.predict(X_test)
        iaccuracy = validation.cal_accuracy(y_test, predList)
        if verbose:
            print(iaccuracy)
        sum_accuracy += iaccuracy
        X_train, y_train, X_test, y_test = data_parser.resample_data(X_train, y_train, X_test, y_test)

    return sum_accuracy / num_resample
    print("file_test", file_test)

    X_train, y_train = data_parser.load_list_data(file_train)
    X_test, y_test = data_parser.load_list_data(file_test)

    print('test class', np.unique(y_train))
    print('train class', np.unique(y_test))

    # print(X_train[0])
    # print(X_test[0])

    # z_normalize
    for id, iTrain in enumerate(X_train):
        X_train[id] = (iTrain - np.mean(iTrain)) / (np.sqrt(np.var(iTrain)) +
                                                    1e-9)

    for id, iTest in enumerate(X_test):
        X_test[id] = (iTest - np.mean(iTest)) / (np.sqrt(np.var(iTest)) + 1e-9)

    # print(X_train[0])
    # print(X_test[0])

    n_neighbors = 1
    n_jobs = 10
    knn_clf = KNeighborsClassifierVariousDim(n_neighbors=n_neighbors,
                                             distfunc=DISTFunc.dist_basic_dtw)
    knn_clf.fit(X_train, y_train)
    predList = knn_clf.predict(X_test)
    acc = validation.cal_accuracy(predList, y_test)
    print(acc)
n_neighbors = 1
n_jobs = 10
k_fold = 10
distfunc = distance.dist_euclidean

# set up knn classifier
knn_clf = KNeighborsClassifier(n_neighbors=n_neighbors,
                               n_jobs=n_jobs,
                               distfunc=distfunc)

result = [['dataset name', 'accuracy']]
for name in dataset_:
    file_train = os.path.join(UCR_DATA_ROOT, name, name + '_TRAIN')
    file_test = os.path.join(UCR_DATA_ROOT, name, name + '_TEST')
    X_train, y_train = data_parser.load_ucr(file_train)
    X_test, y_test = data_parser.load_ucr(file_test)
    acc_sum = 0
    for i in range(k_fold):
        knn_clf.fit(X_train, y_train)
        y_pred = knn_clf.predict(X_test)
        acc_sum += validation.cal_accuracy(y_test, y_pred)
        X_train, y_train, X_test, y_test = data_parser.resample_data(
            X_train, y_train, X_test, y_test)

    acc = acc_sum / k_fold
    result.append((name, acc))
    print(name, acc)

file_out = os.path.join(OUT_ROOT, "%dnn_%dfold_ed.md" % (n_neighbors, k_fold))
table2markdown(file_out, result, description=__doc__)