ML-LSSVM(classifier:FOA优化参数)

import time
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn import preprocessing
from sklearn.model_selection import train_test_split
from sklearn.feature_selection import SelectFromModel
from sklearn.svm import LinearSVC,SVC
from sklearn.metrics import classification_report,precision_score,confusion_matrix

dataset = datasets.load_breast_cancer()
X,y = dataset.data[0:100],dataset.target[0:100]
sigma = 2
gamma = 1

x = preprocessing.StandardScaler().fit_transform(X)

x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.3,random_state=1)

def featureSelction(x,y):
    clf = LinearSVC(penalty='l1',C=1.0,dual=False)
    clf.fit(x,y)
    model = SelectFromModel(clf,prefit=True)
    tmp = model.transform(x)
    common = []
    for index in range(x.shape[1]):
        if x[0,index] in list(tmp[0]):
            common.append(index)
    '''
    [5, 6, 7, 9, 10, 14, 15, 16, 17, 18, 19, 21, 22, 23, 26, 27, 28, 29]
    '''
    return common

common = featureSelction(x_train,y_train)
x_train = x_train[:,common]
x_test = x_test[:,common]

def FOA():
    x_asis = np.random.random((1,2))
    y_asis = np.random.random((1,2))
    samples = 20
    iter_times = 10
    
    def searchPosition(x_asis,y_asis):
        position = []
        smell = []
        for num in range(samples):
            x = x_asis+2*np.random.rand()-1
            y = y_asis+2*np.random.rand()-1
            params = 1/np.sqrt(x**2+y**2)
            accuracy = LSSVMClassifier(params[0,0],params[0,1])
            position.append((x,y))
            smell.append(accuracy)
        index = np.argmax(smell)
        bestX,bestY = position[index]
        bestSmell = smell[index]
        return bestX,bestY,bestSmell
    start = time.time()
    print('---FOA初始化开始---')       
    bestX,bestY,bestSmell = searchPosition(x_asis,y_asis)
    print('time:',time.time()-start)
    
    def searchBestParams(bestX,bestY,bestSmell):
        smell = [bestSmell]
        for num in range(iter_times):
            print(num,':',bestSmell)
            x,y,accuracy = searchPosition(bestX,bestY)
            if accuracy > bestSmell:
                bestX,bestY,bestSmell= x,y,accuracy
            smell.append(bestSmell)
        params = 1/np.sqrt((bestX**2+bestY**2))
        print(params[0])
        print('accuracy by LSSVM:',bestSmell)
    begin = time.time()
    print('---FOA寻优开始---')
    searchBestParams(bestX,bestY,bestSmell)
    print('end:',time.time()-begin)
    
def LSSVMClassifier(sigma,gamma):
    def kernel(x,y,sigma):
        return np.exp(-np.sum((x-y)**2,axis=0)/2*sigma**2)

    def matrixOmega(x,y,sigma):
        num = len(x)
        mat = np.zeros((num,num))
        for i in range(num):
            for j in range(num):
                k = y[i]*y[j]*kernel(x[i],x[j],sigma)
                mat[i,j] = k
        return mat
    
    mat = matrixOmega(x_train,y_train,sigma)
    
    def getparams(x_train,y_train,mat,gamma,sigma):
        length = len(x_train)+1
        A = np.zeros((length,length))
        A[0,1:length] = y_train.T
        A[1:length,0] = y_train
        A[1:length,1:length] = mat+np.eye(length-1)/gamma
        B = np.zeros((length,1))
        B[1:length] = np.ones((length-1,1))
        result = np.linalg.solve(A,B)
        a,b = result[0:-1],result[-1]
        return a,b
    
    a,b = getparams(x_train,y_train,mat,gamma,sigma)
    
    def predictTestData(x_test,y_test,a,b):
        result = np.zeros(len(x_test))
        for i in range(len(x_test)):
            result[i] = b[0]
            for j in range(len(x_train)):
                result[i] += a[i]*y_train[i]*kernel(x_test[i],x_train[j],sigma)
                result[i] = np.sign(result[i])
                accuracy = precision_score(y_test,result)
        return accuracy
        
    accuracy = predictTestData(x_test,y_test,a,b)
    return accuracy

FOA()

def trainModelBySVC():
    clf = SVC()
    clf.fit(x_train,y_train)
    predict = clf.predict(x_test)
    print('accuracy by SVM:',precision_score(y_test,predict))

trainModelBySVC()

猜你喜欢

转载自blog.csdn.net/qq_42394743/article/details/81142310