python中怎么实现径向基核函数(python,开发技术)

时间:2024-04-29 12:35:15 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

1、生成数据集(双月数据集)

classmoon_data_class(object):def__init__(self,N,d,r,w):self.N=Nself.w=wself.d=dself.r=rdefsgn(self,x):if(x>0):return1;else:return-1;defsig(self,x):return1.0/(1+np.exp(x))defdbmoon(self):N1=10*self.NN=self.Nr=self.rw2=self.w/2d=self.ddone=Truedata=np.empty(0)whiledone:#generateRectangulardatatmp_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)#generatedoublemoondata---upperidx=np.logical_and(tmp_ds>(r-w2),tmp_ds<(r+w2))idx=(idx.nonzero())[0]ifdata.shape[0]==0:data=tmp.take(idx,axis=0)else:data=np.concatenate((data,tmp.take(idx,axis=0)),axis=0)ifdata.shape[0]>=N:done=False#print(data)db_moon=data[0:N,:]#print(db_moon)#generatedoublemoondata----downdata_t=np.empty([N,2])data_t[:,0]=data[0:N,0]+rdata_t[:,1]=-data[0:N,1]-ddb_moon=np.concatenate((db_moon,data_t),axis=0)returndb_moon

2、k均值聚类

defk_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]]]foriink]#保证有序k_point.sort()globalframes#globalstepwhileTrue:km=[[]foriinrange(k_count)]#存储每个簇的索引#遍历所有点foriinrange(count):cp=[x[i],y[i]]#当前点#计算cp点到所有质心的距离_sse=[distance(k_point[j],cp)forjinrange(k_count)]#cp点到那个质心最近min_index=_sse.index(min(_sse))#把cp点并入第i簇km[min_index].append(i)#更换质心k_new=[]foriinrange(k_count):_x=sum([x[j]forjinkm[i]])/len(km[i])_y=sum([y[j]forjinkm[i]])/len(km[i])k_new.append([_x,_y])k_new.sort()#排序if(k_new!=k_point):#一直循环直到聚类中心没有变化k_point=k_newelse:returnk_point,km

3、高斯核函数

高斯核函数,主要的作用是衡量两个对象的相似度,当两个对象越接近,即a与b的距离趋近于0,则高斯核函数的值趋近于1,反之则趋近于0,换言之:

两个对象越相似,高斯核函数值就越大

作用:

  • 用于分类时,衡量各个类别的相似度,其中sigma参数用于调整过拟合的情况,sigma参数较小时,即要求分类器,加差距很小的类别也分类出来,因此会出现过拟合的问题;

  • 用于模糊控制时,用于模糊集的隶属度。

defgaussian(a,b,sigma):returnnp.exp(-norm(a-b)**2/(2*sigma**2))

4、求高斯核函数的方差

Sigma_Array=[]forjinrange(k_count):Sigma=[]foriinrange(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、显示高斯核函数计算结果

gaussian_kernel_array=[]fig=plt.figure()ax=Axes3D(fig)forjinrange(k_count):gaussian_kernel=[]foriinrange(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、运行结果

python中怎么实现径向基核函数

7、完整代码

#coding:utf-8importnumpyasnpimportpylabasplimportrandomasrdimportimageioimportmathimportrandomimportmatplotlib.pyplotaspltimportnumpyasnpimportmpl_toolkits.mplot3dfrommpl_toolkits.mplot3dimportAxes3Dfromscipyimport*fromscipy.linalgimportnorm,pinvfrommatplotlibimportpyplotaspltrandom.seed(0)#定义sigmoid函数和它的导数defsigmoid(x):return1.0/(1.0+np.exp(-x))defsigmoid_derivate(x):returnx*(1-x)#sigmoid函数的导数classmoon_data_class(object):def__init__(self,N,d,r,w):self.N=Nself.w=wself.d=dself.r=rdefsgn(self,x):if(x>0):return1;else:return-1;defsig(self,x):return1.0/(1+np.exp(x))defdbmoon(self):N1=10*self.NN=self.Nr=self.rw2=self.w/2d=self.ddone=Truedata=np.empty(0)whiledone:#generateRectangulardatatmp_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)#generatedoublemoondata---upperidx=np.logical_and(tmp_ds>(r-w2),tmp_ds<(r+w2))idx=(idx.nonzero())[0]ifdata.shape[0]==0:data=tmp.take(idx,axis=0)else:data=np.concatenate((data,tmp.take(idx,axis=0)),axis=0)ifdata.shape[0]>=N:done=False#print(data)db_moon=data[0:N,:]#print(db_moon)#generatedoublemoondata----downdata_t=np.empty([N,2])data_t[:,0]=data[0:N,0]+rdata_t[:,1]=-data[0:N,1]-ddb_moon=np.concatenate((db_moon,data_t),axis=0)returndb_moondefdistance(a,b):return(a[0]-b[0])**2+(a[1]-b[1])**2#K均值算法defk_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]]]foriink]#保证有序k_point.sort()globalframes#globalstepwhileTrue:km=[[]foriinrange(k_count)]#存储每个簇的索引#遍历所有点foriinrange(count):cp=[x[i],y[i]]#当前点#计算cp点到所有质心的距离_sse=[distance(k_point[j],cp)forjinrange(k_count)]#cp点到那个质心最近min_index=_sse.index(min(_sse))#把cp点并入第i簇km[min_index].append(i)#更换质心k_new=[]foriinrange(k_count):_x=sum([x[j]forjinkm[i]])/len(km[i])_y=sum([y[j]forjinkm[i]])/len(km[i])k_new.append([_x,_y])k_new.sort()#排序if(k_new!=k_point):#一直循环直到聚类中心没有变化k_point=k_newelse:pl.figure()pl.title("N=%d,k=%diteration"%(count,k_count))forjinrange(k_count):pl.plot([x[i]foriinkm[j]],[y[i]foriinkm[j]],color[j%4])pl.plot(k_point[j][0],k_point[j][1],dcolor[j%4])returnk_point,kmdefPhi(a,b):returnnorm(a-b)defgaussian(x,sigma):returnnp.exp(-x**2/(2*sigma**2))if__name__=='__main__':#计算平面两点的欧氏距离step=0color=['.r','.g','.b','.y']#颜色种类dcolor=['*r','*g','*b','*y']#颜色种类frames=[]N=200d=-4r=10width=6data_source=moon_data_class(N,d,r,width)data=data_source.dbmoon()#x0=[1forxinrange(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]foryinrange(1,201)]labels_pos=[[0]foryinrange(1,201)]labels=labels_pre+labels_posk_count=2center,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=[]forjinrange(k_count):center_array.append([[x[i]foriinkm[j]],[y[i]foriinkm[j]]])Sigma_Array=[]forjinrange(k_count):Sigma=[]foriinrange(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)forjinrange(k_count):gaussian_kernel=[]foriinrange(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()
 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:python中怎么实现径向基核函数的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:Numpy数组转置如何实现下一篇:

5 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18