python自带rbf函数吗_python-如何在Numpy中实现二次采样的RBF(径向基函数)?

我试图按照CalTech lecture here的描述在Python和Numpy中实现径向基函数.数学对我来说似乎很清楚,所以我发现它不起作用(或似乎不起作用)很奇怪.这个想法很简单,一个人为每个高斯形式选择一个子采样中心的数量,形成一个核矩阵,并试图找到最佳系数.即求解Kc = y,其中K是最小平方的高斯核(克)矩阵.为此,我做到了:

beta = 0.5*np.power(1.0/stddev,2)

Kern = np.exp(-beta*euclidean_distances(X=X,Y=subsampled_data_points,squared=True))

#(C,_,_,_) = np.linalg.lstsq(K,Y_train)

C = np.dot( np.linalg.pinv(Kern), Y )

但是当我尝试用原始数据绘制插值时,它们看起来完全不同:

100个随机中心(来自数据集).我还尝试了10个中心,它们使用训练集中的每个数据点生成的图表基本上相同.我假设使用数据集中的每个数据点或多或少都可以完美地复制曲线,但是并没有(过度拟合).它产生:

这似乎不正确.我将提供完整的代码(可以正常运行):

import numpy as np

from sklearn.metrics.pairwise import euclidean_distances

from scipy.interpolate import Rbf

import matplotlib.pyplot as plt

## Data sets

def get_labels_improved(X,f):

N_train = X.shape[0]

Y = np.zeros( (N_train,1) )

for i in range(N_train):

Y[i] = f(X[i])

return Y

def get_kernel_matrix(x,W,S):

beta = get_beta_np(S)

#beta = 0.5*tf.pow(tf.div( tf.constant(1.0,dtype=tf.float64),S), 2)

Z = -beta*euclidean_distances(X=x,Y=W,squared=True)

K = np.exp(Z)

return K

N = 5000

low_x =-2*np.pi

high_x=2*np.pi

X = low_x + (high_x - low_x) * np.random.rand(N,1)

# f(x) = 2*(2(cos(x)^2 - 1)^2 -1

f = lambda x: 2*np.power( 2*np.power( np.cos(x) ,2) - 1, 2) - 1

Y = get_labels_improved(X , f)

K = 2 # number of centers for RBF

indices=np.random.choice(a=N,size=K) # choose numbers from 0 to D^(1)

subsampled_data_points=X[indices,:] # M_sub x D

stddev = 100

beta = 0.5*np.power(1.0/stddev,2)

Kern = np.exp(-beta*euclidean_distances(X=X,Y=subsampled_data_points,squared=True))

#(C,_,_,_) = np.linalg.lstsq(K,Y_train)

C = np.dot( np.linalg.pinv(Kern), Y )

Y_pred = np.dot( Kern , C )

plt.plot(X, Y, 'o', label='Original data', markersize=1)

plt.plot(X, Y_pred, 'r', label='Fitted line', markersize=1)

plt.legend()

plt.show()

由于图看起来很奇怪,因此我决定阅读有关图函数的文档,但找不到任何明显错误的东西.

解决方法:

插值函数的缩放

主要问题是不幸地选择了用于插值的函数的标准偏差:

stddev = 100

函数的功能(驼峰)的大小约为1.因此,请使用

stddev = 1

X值的顺序

红线乱七八糟,是因为matplotlib的plt按给定的顺序连接了连续的数据点.由于您的X值是随机顺序的,因此会导致左右运动混乱.使用排序的X:

X = np.sort(low_x + (high_x - low_x) * np.random.rand(N,1), axis=0)

效率问题

您的get_labels_improved方法效率低下,它会遍历X的元素.使用Y = f(X),将循环留给低级NumPy内部.

同样,应该使用lstsq完成超定系统的最小二乘解的计算,而不是计算伪逆(计算上昂贵)并乘以它.

这是清理后的代码;使用30个中心非常合适.

import numpy as np

from sklearn.metrics.pairwise import euclidean_distances

import matplotlib.pyplot as plt

N = 5000

low_x =-2*np.pi

high_x=2*np.pi

X = np.sort(low_x + (high_x - low_x) * np.random.rand(N,1), axis=0)

f = lambda x: 2*np.power( 2*np.power( np.cos(x) ,2) - 1, 2) - 1

Y = f(X)

K = 30 # number of centers for RBF

indices=np.random.choice(a=N,size=K) # choose numbers from 0 to D^(1)

subsampled_data_points=X[indices,:] # M_sub x D

stddev = 1

beta = 0.5*np.power(1.0/stddev,2)

Kern = np.exp(-beta*euclidean_distances(X=X, Y=subsampled_data_points,squared=True))

C = np.linalg.lstsq(Kern, Y)[0]

Y_pred = np.dot(Kern, C)

plt.plot(X, Y, 'o', label='Original data', markersize=1)

plt.plot(X, Y_pred, 'r', label='Fitted line', markersize=1)

plt.legend()

plt.show()

标签:machine-learning,neural-network,python,numpy

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值