您好,登錄后才能下訂單哦!
這篇文章主要介紹了python中怎么實現徑向基核函數的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇python中怎么實現徑向基核函數文章都會有所收獲,下面我們一起來看看吧。
class moon_data_class(object): def __init__(self,N,d,r,w): self.N=N self.w=w self.d=d self.r=r def sgn(self,x): if(x>0): return 1; else: return -1; def sig(self,x): return 1.0/(1+np.exp(x)) def dbmoon(self): N1 = 10*self.N N = self.N r = self.r w2 = self.w/2 d = self.d done = True data = np.empty(0) while done: #generate Rectangular data tmp_x = 2*(r+w2)*(np.random.random([N1, 1])-0.5) tmp_y = (r+w2)*np.random.random([N1, 1]) tmp = np.concatenate((tmp_x, tmp_y), axis=1) tmp_ds = np.sqrt(tmp_x*tmp_x + tmp_y*tmp_y) #generate double moon data ---upper idx = np.logical_and(tmp_ds > (r-w2), tmp_ds < (r+w2)) idx = (idx.nonzero())[0] if data.shape[0] == 0: data = tmp.take(idx, axis=0) else: data = np.concatenate((data, tmp.take(idx, axis=0)), axis=0) if data.shape[0] >= N: done = False #print (data) db_moon = data[0:N, :] #print (db_moon) #generate double moon data ----down data_t = np.empty([N, 2]) data_t[:, 0] = data[0:N, 0] + r data_t[:, 1] = -data[0:N, 1] - d db_moon = np.concatenate((db_moon, data_t), axis=0) return db_moon
def k_means(input_cells, k_count): count = len(input_cells) #點的個數 x = input_cells[0:count, 0] y = input_cells[0:count, 1] #隨機選擇K個點 k = rd.sample(range(count), k_count) k_point = [[x[i], [y[i]]] for i in k] #保證有序 k_point.sort() global frames #global step while True: km = [[] for i in range(k_count)] #存儲每個簇的索引 #遍歷所有點 for i in range(count): cp = [x[i], y[i]] #當前點 #計算cp點到所有質心的距離 _sse = [distance(k_point[j], cp) for j in range(k_count)] #cp點到那個質心最近 min_index = _sse.index(min(_sse)) #把cp點并入第i簇 km[min_index].append(i) #更換質心 k_new = [] for i in range(k_count): _x = sum([x[j] for j in km[i]]) / len(km[i]) _y = sum([y[j] for j in km[i]]) / len(km[i]) k_new.append([_x, _y]) k_new.sort() #排序 if (k_new != k_point):#一直循環直到聚類中心沒有變化 k_point = k_new else: return k_point,km
高斯核函數,主要的作用是衡量兩個對象的相似度,當兩個對象越接近,即a與b的距離趨近于0,則高斯核函數的值趨近于1,反之則趨近于0,換言之:
兩個對象越相似,高斯核函數值就越大
作用:
用于分類時,衡量各個類別的相似度,其中sigma參數用于調整過擬合的情況,sigma參數較小時,即要求分類器,加差距很小的類別也分類出來,因此會出現過擬合的問題;
用于模糊控制時,用于模糊集的隸屬度。
def gaussian (a,b, sigma): return np.exp(-norm(a-b)**2 / (2 * sigma**2))
Sigma_Array = [] for j in range(k_count): Sigma = [] for i in range(len(center_array[j][0])): temp = Phi(np.array([center_array[j][0][i],center_array[j][1][i]]),np.array(center[j])) Sigma.append(temp) Sigma = np.array(Sigma) Sigma_Array.append(np.cov(Sigma))
gaussian_kernel_array = [] fig = plt.figure() ax = Axes3D(fig) for j in range(k_count): gaussian_kernel = [] for i in range(len(center_array[j][0])): temp = Phi(np.array([center_array[j][0][i],center_array[j][1][i]]),np.array(center[j])) temp1 = gaussian(temp,Sigma_Array[0]) gaussian_kernel.append(temp1) gaussian_kernel_array.append(gaussian_kernel) ax.scatter(center_array[j][0], center_array[j][1], gaussian_kernel_array[j],s=20) plt.show()
# coding:utf-8 import numpy as np import pylab as pl import random as rd import imageio import math import random import matplotlib.pyplot as plt import numpy as np import mpl_toolkits.mplot3d from mpl_toolkits.mplot3d import Axes3D from scipy import * from scipy.linalg import norm, pinv from matplotlib import pyplot as plt random.seed(0) #定義sigmoid函數和它的導數 def sigmoid(x): return 1.0/(1.0+np.exp(-x)) def sigmoid_derivate(x): return x*(1-x) #sigmoid函數的導數 class moon_data_class(object): def __init__(self,N,d,r,w): self.N=N self.w=w self.d=d self.r=r def sgn(self,x): if(x>0): return 1; else: return -1; def sig(self,x): return 1.0/(1+np.exp(x)) def dbmoon(self): N1 = 10*self.N N = self.N r = self.r w2 = self.w/2 d = self.d done = True data = np.empty(0) while done: #generate Rectangular data tmp_x = 2*(r+w2)*(np.random.random([N1, 1])-0.5) tmp_y = (r+w2)*np.random.random([N1, 1]) tmp = np.concatenate((tmp_x, tmp_y), axis=1) tmp_ds = np.sqrt(tmp_x*tmp_x + tmp_y*tmp_y) #generate double moon data ---upper idx = np.logical_and(tmp_ds > (r-w2), tmp_ds < (r+w2)) idx = (idx.nonzero())[0] if data.shape[0] == 0: data = tmp.take(idx, axis=0) else: data = np.concatenate((data, tmp.take(idx, axis=0)), axis=0) if data.shape[0] >= N: done = False #print (data) db_moon = data[0:N, :] #print (db_moon) #generate double moon data ----down data_t = np.empty([N, 2]) data_t[:, 0] = data[0:N, 0] + r data_t[:, 1] = -data[0:N, 1] - d db_moon = np.concatenate((db_moon, data_t), axis=0) return db_moon def distance(a, b): return (a[0]- b[0]) ** 2 + (a[1] - b[1]) ** 2 #K均值算法 def k_means(input_cells, k_count): count = len(input_cells) #點的個數 x = input_cells[0:count, 0] y = input_cells[0:count, 1] #隨機選擇K個點 k = rd.sample(range(count), k_count) k_point = [[x[i], [y[i]]] for i in k] #保證有序 k_point.sort() global frames #global step while True: km = [[] for i in range(k_count)] #存儲每個簇的索引 #遍歷所有點 for i in range(count): cp = [x[i], y[i]] #當前點 #計算cp點到所有質心的距離 _sse = [distance(k_point[j], cp) for j in range(k_count)] #cp點到那個質心最近 min_index = _sse.index(min(_sse)) #把cp點并入第i簇 km[min_index].append(i) #更換質心 k_new = [] for i in range(k_count): _x = sum([x[j] for j in km[i]]) / len(km[i]) _y = sum([y[j] for j in km[i]]) / len(km[i]) k_new.append([_x, _y]) k_new.sort() #排序 if (k_new != k_point):#一直循環直到聚類中心沒有變化 k_point = k_new else: pl.figure() pl.title("N=%d,k=%d iteration"%(count,k_count)) for j in range(k_count): pl.plot([x[i] for i in km[j]], [y[i] for i in km[j]], color[j%4]) pl.plot(k_point[j][0], k_point[j][1], dcolor[j%4]) return k_point,km def Phi(a,b): return norm(a-b) def gaussian (x, sigma): return np.exp(-x**2 / (2 * sigma**2)) if __name__ == '__main__': #計算平面兩點的歐氏距離 step=0 color=['.r','.g','.b','.y']#顏色種類 dcolor=['*r','*g','*b','*y']#顏色種類 frames = [] N = 200 d = -4 r = 10 width = 6 data_source = moon_data_class(N, d, r, width) data = data_source.dbmoon() # x0 = [1 for x in range(1,401)] input_cells = np.array([np.reshape(data[0:2*N, 0], len(data)), np.reshape(data[0:2*N, 1], len(data))]).transpose() labels_pre = [[1] for y in range(1, 201)] labels_pos = [[0] for y in range(1, 201)] labels=labels_pre+labels_pos k_count = 2 center,km = k_means(input_cells, k_count) test = Phi(input_cells[1],np.array(center[0])) print(test) test = distance(input_cells[1],np.array(center[0])) print(np.sqrt(test)) count = len(input_cells) x = input_cells[0:count, 0] y = input_cells[0:count, 1] center_array = [] for j in range(k_count): center_array.append([[x[i] for i in km[j]], [y[i] for i in km[j]]]) Sigma_Array = [] for j in range(k_count): Sigma = [] for i in range(len(center_array[j][0])): temp = Phi(np.array([center_array[j][0][i],center_array[j][1][i]]),np.array(center[j])) Sigma.append(temp) Sigma = np.array(Sigma) Sigma_Array.append(np.cov(Sigma)) gaussian_kernel_array = [] fig = plt.figure() ax = Axes3D(fig) for j in range(k_count): gaussian_kernel = [] for i in range(len(center_array[j][0])): temp = Phi(np.array([center_array[j][0][i],center_array[j][1][i]]),np.array(center[j])) temp1 = gaussian(temp,Sigma_Array[0]) gaussian_kernel.append(temp1) gaussian_kernel_array.append(gaussian_kernel) ax.scatter(center_array[j][0], center_array[j][1], gaussian_kernel_array[j],s=20) plt.show()
關于“python中怎么實現徑向基核函數”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“python中怎么實現徑向基核函數”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。