def classiy(data, target):
    num_k = 10
    score_SVC = 0
    skf = StratifiedKFold(n_splits=num_k)
    for train_index, test_index in skf.split(data, target):
        X_train, X_test = data[train_index], data[test_index]
        y_train, y_test = target[train_index], target[test_index]
        n, d = X_train.shape
        # 这里的gamma好像也是可以训练出来的
        gamma = 1.0 / d
        kernel_functions = [
            k_helpers.create_linear_kernel,
            # k_helpers.create_rbf_kernel(gamma),
            # k_helpers.create_poly_kernel(3, gamma),
            # k_helpers.create_exponential_kernel(gamma),
            # k_helpers.create_histogram_kernel,
            # k_helpers.create_histogram_kernel,
            # k_helpers.create_exponential_kernel(gamma),
            # k_helpers.create_sigmoid_kernel(gamma)
        ]
        for j in range(y_train.size):
            if y_train[j] != 0:
                y_train[j] = -1
            else:
                y_train[j] = 1
        for i in range(y_test.size):
            if y_test[i] != 0:
                y_test[i] = -1
            else:
                y_test[i] = 1
        # 核函数与权重之间进行线性组合 形成新的合成后的核函数 给SVM 进行分类
        clf = svm.SVC(kernel='precomputed')
        kernel_matrices = k_helpers.get_all_kernels(X_train, kernel_functions)
        # 固定权重设置
        # new_train = k_helpers.get_combined_kernel(kernel_matrices, weight_train)
        # clf.fit(new_train, y_train)
        # 训练权重
        # 惩罚数值 C:penalty value => 0<=alpha_i<=C
        C = 1
        M = len(kernel_functions)
        pointD = np.ones(M) / M
        weights, combined_kernel, J, alpha, duality_gap, final_gamma = algo1.find_kernel_weights(pointD, kernel_matrices, C, y_train, 1, gamma)
        print('************************最后算到的结果************************')
        print('weights', weights)
        # # print('combined_kernel', combined_kernel)
        # # print('J', J)
        # # print('alpha', alpha)
        # # print('duality_gap', duality_gap)
        print('gamma', final_gamma)
        # 训练出权重了以后,接下来就是合成新的矩阵
        clf.fit(combined_kernel, y_train)

        # 这里的测试集需要重新调整一下
        final_test_data = test_kernel_processing(X_train, X_test, kernel_functions, weights)
        # no train
        # final_test_data = test_kernel_processing(X_train, X_test, kernel_functions, weight_train)

        score_SVC += clf.score(final_test_data, y_test)
        print('一次循环的精度为%s' % (clf.score(final_test_data, y_test)))
    print('SVC最后的分类精度:%s' % (score_SVC / num_k))
예제 #2
0
def kernel_chose(feature, kernel_type, gamma):
    if kernel_type == 'linear':
        kernel_functions = [k_helpers.create_linear_kernel]
    elif kernel_type == 'rbf':
        kernel_functions = [k_helpers.create_rbf_kernel(gamma)]
    elif kernel_type == 'poly':
        kernel_functions = [k_helpers.create_poly_kernel(2, gamma)]
    elif kernel_type == 'exponential':
        kernel_functions = [k_helpers.create_exponential_kernel(gamma)]
    elif kernel_type == 'sigmoid':
        kernel_functions = [k_helpers.create_sigmoid_kernel(gamma)]
    else:
        kernel_functions = [k_helpers.create_histogram_kernel]
    kernel_matrices = k_helpers.get_all_kernels(feature, kernel_functions)
    return kernel_matrices
예제 #3
0
def train_kernel(train_data, train_labels):
    n, d = train_data.shape
    nlabels = train_labels.size

    # Make labels -1 and 1
    for i in range(nlabels):
        if train_labels[i] != 0:
            train_labels[i] = -1
        else:
            train_labels[i] = 1

    gamma = 1.0 / d

    kernel_functions = [
        k_helpers.create_linear_kernel,
        # k_helpers.create_rbf_kernel(gamma),
        # k_helpers.create_poly_kernel(2, gamma),
        # k_helpers.create_poly_kernel(3, gamma),
        # k_helpers.create_poly_kernel(4, gamma),
        # k_helpers.create_sigmoid_kernel(gamma),
    ]

    M = len(kernel_functions)

    # The weights of each kernel
    # Initialized to 1/M
    d = np.ones(M) / M
    # Stores all the individual kernel matrices
    kernel_matrices = k_helpers.get_all_kernels(train_data, kernel_functions)
    # 惩罚数值 C:penalty value => 0<=alpha_i<=C
    C = 1
    weights, combined_kernel, J, alpha, duality_gap, gamma = algo1.find_kernel_weights(
        d, kernel_matrices, C, train_labels, 1, gamma)
    print('************************最后算到的结果************************')
    print('weights', weights)
    print('combined_kernel', combined_kernel)
    print('J', J)
    print('alpha', alpha)
    print('duality_gap', duality_gap)
    print('gamma', gamma)
    return weights
def my_kernel(u):
    kernel_matrices = k_helpers.get_all_kernels(u, kernel_functions)
    combined_kernel_matrix = k_helpers.get_combined_kernel(
        kernel_matrices, weight_train)
    return combined_kernel_matrix