问题描述
我正在学习 RBF 内核。我在 python 中从头开始实现它们。
我使用了 MNIST 数据集,所以有 10 个质心。
我做了什么:
-
将 2d 28x28 图像中的数据展平为 784 个特征
-
使用 K-means 找出簇质心,以及每个簇内的方差(这将用于获得 RBF 的 beta)
-
使用中心和方差信息得到 rbf 特征 = Nx10(mnists 和 10 个类的 N 个数据点)
-
终于用逻辑回归给班级点评了
我不确定我哪里出错或不完美。任何指导都是半途而废的:) 下面是python代码。
有了这个,我在 mnist 数据上获得了 69% 的准确率。
class RBFkernel:
def __init__(self):
self.normalizer=normalizer()
self.scalar=StandardScaler()
pass
def fit(self,X,y):
#flatten dataset
X=X.reshape(len(X),-1)
#preprocess
X=self.normalizer.fit_transform(X)
X=self.scalar.fit_transform(X)
# get number of classes
self.no_of_classes = len(np.unique(y))
# get cluster_centers,variance within cluster for each class using kmeans
self.cluster_centers,self.cluster_variances = self._kmeansfit(X,y,self.no_of_classes)
# get beta = 1/variance for each cluster
self.rbfbetas=1/np.array(self.cluster_variances)
# no of rbfs used = no of unique classes
#transform using rbf kernel
rbffeatures = self._RBF(X)
# fit logistic LogisticRegression (set weight for each rbf)
self._tuneweights(rbffeatures,y)
# prediction
def predict(self,X):
X=X.reshape(len(X),-1)
X=self.normalizer.transform(X)
X=self.scalar.transform(X)
return self._weighttuner.predict(self._RBF(X))
# accuracy score
def score(self,y):
return accuracy_score(self.predict(X),y)
# sklearn kmeans
def _kmeansfit(self,c):
self._kmeans = KMeans(n_clusters=c)
self._kmeans.fit(X,y)
cluster_variances=[]
for i,center in enumerate(self._kmeans.cluster_centers_):
rel_coord = X[y==self._kmeans.labels_]-center
var = (rel_coord**2).sum(axis=1).mean()
cluster_variances.append(var)
return self._kmeans.cluster_centers_,cluster_variances
# rbf kernel implementation
def _RBF(self,X):
newX = X.reshape(len(X),1,X.shape[-1])
distFromEachCenter = ((newX-self.cluster_centers)**2).sum(axis=2)
weighteddistFromEachCenter = self.rbfbetas.reshape(1,-1)*distFromEachCenter
return np.exp(-weighteddistFromEachCenter)
# logistic regression
def _tuneweights(self,rbffeatures,y):
self._weighttuner=LogisticRegression()
self._weighttuner.fit(rbffeatures,y)
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)