RBF 模型未提供最佳精度

问题描述

我正在学习 RBF 内核。我在 python 中从头开始实现它们。

我使用了 MNIST 数据集,所以有 10 个质心。

我做了什么:

  1. 将 2d 28x28 图像中的数据展平为 784 个特征

  2. 使用 K-means 找出簇质心,以及每个簇内的方差(这将用于获得 RBF 的 beta)

  3. 使用中心和方差信息得到 rbf 特征 = Nx10(mnists 和 10 个类的 N 个数据点)

  4. 终于用逻辑回归给班级点评了

我不确定我哪里出错或不完美。任何指导都是半途而废的:) 下面是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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...