def __init__(self, n_inputs, n_rules, learning_rate=0.01): self.n = n_inputs self.m = n_rules self.lr = learning_rate # Initialize MF parameters using k-means clustering kmeans = KMeans(n_clusters=self.m) x0 = np.random.rand(100, self.n) # 用于聚类的样本点 kmeans.fit(x0) centroids = kmeans.cluster_centers_ # 获取聚类中心 sigmas = np.ones(self.m) * (kmeans.inertia_ / self.m) ** 0.5 # 计算标准差 self.params = { "mf_params": np.concatenate([centroids.flatten(), sigmas.flatten()]), "out_params": np.random.rand((self.n + 1) * self.m, ) } def gaussmf(self, x, c, sigma): return np.exp(-np.power(x - c, 2.) / (2 * np.power(sigma, 2.))) def predict(self, X): mf_out = np.zeros((len(X), self.n, self.m)) for i in range(self.n): mf_out[:, i, :] = self.gaussmf(X[:, i].reshape(-1, 1), self.params['mf_params'][:self.m], self.params['mf_params'][self.m:])出现 operands could not be broadcast together with shapes (32,3) (0,) 修改
时间: 2024-01-09 21:05:45 浏览: 484
关于tf.nn.dynamic_rnn返回值详解
根据你提供的代码,我发现在predict函数中,如果X的shape是(32, 3),则会出现operands could not be broadcast together with shapes (32,3) (0,)的错误。这是因为在计算mf_out时,对于每个输入X[:, i].reshape(-1, 1),都需要对self.params['mf_params'][:self.m]和self.params['mf_params'][self.m:]进行高斯函数计算,而这两个数组的shape都是(0,),无法与X[:, i].reshape(-1, 1)进行broadcast。
一种可能的修正方法是,在初始化函数__init__中,将标准差sigmas的shape从(3,)修改为(1, 3),即:
```
sigmas = np.ones((1, self.m)) * (kmeans.inertia_ / self.m) ** 0.5
```
这样,在predict函数中计算高斯函数时,就可以使用np.tile函数将self.params['mf_params'][self.m:]沿着第0维复制32次,使其与X[:, i].reshape(-1, 1)的shape相同:
```
def predict(self, X):
mf_out = np.zeros((len(X), self.n, self.m))
for i in range(self.n):
sigma = np.tile(self.params['mf_params'][self.m:], (len(X), 1))
mf_out[:, i, :] = self.gaussmf(X[:, i].reshape(-1, 1), self.params['mf_params'][:self.m], sigma)
```
这样,就可以避免operands could not be broadcast together with shapes的错误。
阅读全文