天天看點

支援向量機python實作

import numpy as np
import pandas as pd
from sklearn.svm import SVR
from sklearn.metrics import mean_absolute_error, mean_squared_error
import matplotlib.pyplot as plt
import datetime
start = datetime.datetime.now()

df = pd.read_csv("./data/Pb1.csv")
df.columns = ["x", "y", "high", "use", "Cr"]
longtitude = df["x"]
longtitude = np.array(longtitude)
latitude = df["y"]
latitude = np.array(latitude)
elevation = df["high"]
elevation =np.array(elevation)
functional = df["use"]
functional = np.array(functional)
As=df["Cr"]
As=np.array(As)
samplein = np.mat([longtitude,latitude,elevation,functional])
sampleinminmax = np.array([samplein.min(axis=1).T.tolist()[0],samplein.max(axis=1).T.tolist()[0]]).transpose()#對應最大值最小值
sampleout = np.mat([As])
sampleoutminmax = np.array([sampleout.min(axis=1).T.tolist()[0],sampleout.max(axis=1).T.tolist()[0]]).transpose()#對應最大值最小值
sampleinnorm = ((np.array(samplein.T)-sampleinminmax.transpose()[0])/(sampleinminmax.transpose()[1]-sampleinminmax.transpose()[0])).transpose()
sampleoutnorm = ((np.array(sampleout.T)-sampleoutminmax.transpose()[0])/(sampleoutminmax.transpose()[1]-sampleoutminmax.transpose()[0])).transpose()
x_train = sampleinnorm.transpose()
y_train = sampleoutnorm.transpose()

df = pd.read_csv("./data/Pb2.csv")
df.columns = ["x", "y", "high", "use", "Cr"]
longtitude = df["x"]
longtitude = np.array(longtitude)
latitude = df["y"]
latitude = np.array(latitude)
elevation = df["high"]
elevation =np.array(elevation)
functional = df["use"]
functional = np.array(functional)
As=df["Cr"]
As=np.array(As)
input=np.mat([longtitude,latitude,elevation,functional])
inputnorm=(np.array(input.T)-sampleinminmax.transpose()[0])/(sampleinminmax.transpose()[1]-sampleinminmax.transpose()[0])
x_test = inputnorm

rbf_svr = SVR(kernel='rbf',C = 25,gamma = 10)
rbf_svr.fit(x_train, y_train)
y_test = rbf_svr.predict(x_test)
y_test = np.mat(y_test).transpose()
diff = sampleoutminmax[:,1]-sampleoutminmax[:,0]
networkout2 = y_test*diff+sampleoutminmax[0][0]
networkout2 = np.array(networkout2).transpose()
output1=networkout2.flatten()#降成一維數組
output1=output1.tolist()
for i in range(y_test.shape[0]):
    output1[i] = float('%.2f'%output1[i])
# print("the prediction is:",output1)

np.savetxt('./result_Pb/predict_test.csv', output1, delimiter = ',')
output=As

err_test =  output - output1
np.savetxt('./result_Pb/err_test.csv', err_test, delimiter = ',')
mse = sum(np.square(output-output1))/len(output)
rmse = np.sqrt(mse)
mae = sum(np.abs(output-output1))/len(output)
mape=sum(np.abs((output-output1)/output))/len(output)
A = np.ones(len(output))
rmsle = np.sqrt(sum(np.square(np.log(output+A)-np.log(output1+A))) / len(output))

error = np.zeros(5)
error[0] = mse
error[1] = rmse
error[2] = mae
error[3] = mape
error[4] = rmsle
np.savetxt('./result_Pb/error_test.csv', error, delimiter = ',')

end = datetime.datetime.now()
time = end - start
print("運作時間總計:",time)
print("mse:",mse,"rmse:",rmse,"mae:",mae,"mape:",mape,"rmsle:",rmsle)