python中如何實(shí)現(xiàn)徑向基核函數(shù)
1、生成數(shù)據(jù)集(雙月數(shù)據(jù)集)
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_moon2、k均值聚類
def k_means(input_cells, k_count):
count = len(input_cells) #點(diǎn)的個(gè)數(shù)
x = input_cells[0:count, 0]
y = input_cells[0:count, 1]
#隨機(jī)選擇K個(gè)點(diǎn)
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)] #存儲(chǔ)每個(gè)簇的索引
#遍歷所有點(diǎn)
for i in range(count):
cp = [x[i], y[i]] #當(dāng)前點(diǎn)
#計(jì)算cp點(diǎn)到所有質(zhì)心的距離
_sse = [distance(k_point[j], cp) for j in range(k_count)]
#cp點(diǎn)到那個(gè)質(zhì)心最近
min_index = _sse.index(min(_sse))
#把cp點(diǎn)并入第i簇
km[min_index].append(i)
#更換質(zhì)心
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):#一直循環(huán)直到聚類中心沒(méi)有變化
k_point = k_new
else:
return k_point,km
3、高斯核函數(shù)
高斯核函數(shù),主要的作用是衡量?jī)蓚€(gè)對(duì)象的相似度,當(dāng)兩個(gè)對(duì)象越接近,即a與b的距離趨近于0,則高斯核函數(shù)的值趨近于1,反之則趨近于0,換言之:
兩個(gè)對(duì)象越相似,高斯核函數(shù)值就越大
作用:
- 用于分類時(shí),衡量各個(gè)類別的相似度,其中sigma參數(shù)用于調(diào)整過(guò)擬合的情況,sigma參數(shù)較小時(shí),即要求分類器,加差距很小的類別也分類出來(lái),因此會(huì)出現(xiàn)過(guò)擬合的問(wèn)題;
- 用于模糊控制時(shí),用于模糊集的隸屬度。
def gaussian (a,b, sigma):
return np.exp(-norm(a-b)**2 / (2 * sigma**2))
4、求高斯核函數(shù)的方差
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))
5、顯示高斯核函數(shù)計(jì)算結(jié)果
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()
6、運(yùn)行結(jié)果

7、完整代碼
# 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函數(shù)和它的導(dǎo)數(shù)
def sigmoid(x):
return 1.0/(1.0+np.exp(-x))
def sigmoid_derivate(x):
return x*(1-x) #sigmoid函數(shù)的導(dǎo)數(shù)
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) #點(diǎn)的個(gè)數(shù)
x = input_cells[0:count, 0]
y = input_cells[0:count, 1]
#隨機(jī)選擇K個(gè)點(diǎn)
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)] #存儲(chǔ)每個(gè)簇的索引
#遍歷所有點(diǎn)
for i in range(count):
cp = [x[i], y[i]] #當(dāng)前點(diǎn)
#計(jì)算cp點(diǎn)到所有質(zhì)心的距離
_sse = [distance(k_point[j], cp) for j in range(k_count)]
#cp點(diǎn)到那個(gè)質(zhì)心最近
min_index = _sse.index(min(_sse))
#把cp點(diǎn)并入第i簇
km[min_index].append(i)
#更換質(zhì)心
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):#一直循環(huán)直到聚類中心沒(méi)有變化
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__':
#計(jì)算平面兩點(diǎn)的歐氏距離
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()
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決Django Static內(nèi)容不能加載顯示的問(wèn)題
今天小編就為大家分享一篇解決Django Static內(nèi)容不能加載顯示的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07
Python+matplotlib實(shí)現(xiàn)量場(chǎng)圖的繪制
matplotlib是基于Python語(yǔ)言的開(kāi)源項(xiàng)目,pyplot提供一系列繪制2D圖形的方法。本文將帶大家學(xué)習(xí)matplotlib.pyplot.quiver()相關(guān)方法屬性并通過(guò)其繪制量場(chǎng)圖2021-12-12
使用Python?matplotlib繪制簡(jiǎn)單的柱形圖、折線圖和直線圖
Matplotlib是Python的繪圖庫(kù), 它可與NumPy一起使用,提供了一種有效的MatLab開(kāi)源替代方案,下面這篇文章主要給大家介紹了關(guān)于使用Python?matplotlib繪制簡(jiǎn)單的柱形圖、折線圖和直線圖的相關(guān)資料,需要的朋友可以參考下2022-08-08
Python re.split方法分割字符串的實(shí)現(xiàn)示例
本文主要介紹了Python re.split方法分割字符串的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
nlp自然語(yǔ)言處理基于SVD的降維優(yōu)化學(xué)習(xí)
這篇文章主要為大家介紹了nlp自然語(yǔ)言處理基于SVD的降維優(yōu)化學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
解決python3.5 正常安裝 卻不能直接使用Tkinter包的問(wèn)題
今天小編就為大家分享一篇解決python3.5 正常安裝 卻不能直接使用Tkinter包的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-02-02
Python實(shí)現(xiàn)剪刀石頭布小游戲(與電腦對(duì)戰(zhàn))
這篇文章給大家分享Python基礎(chǔ)實(shí)現(xiàn)與電腦對(duì)戰(zhàn)的剪刀石頭布小游戲,練習(xí)if while輸入和輸出,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2019-12-12
運(yùn)行Python編寫(xiě)的程序方法實(shí)例
在本篇文章里小編給大家整理了關(guān)于運(yùn)行Python編寫(xiě)的程序方法實(shí)例內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2020-10-10

