docs: def predict_dims(self, q, dims_x, dims_y, dims_out, sigma=None, k=None):
          """Provide a prediction of q in the output space
  
          @param xq  an array of float of length dim_x
          @param estimated_sigma  if False (default), sigma_sq=self.sigma_sq, else it is estimated from the neighbor distances in self._weights(.)
          """
          assert len(q) == len(dims_x) + len(dims_y)
          sigma_sq = self.sigma_sq if sigma is None else sigma*sigma
          k = k or self.k       
          
          dists, index = self.dataset.nn_dims(q[:len(dims_x)], q[len(dims_x):], dims_x, dims_y, k=k)
  
          w = self._weights(dists, index, sigma_sq)
          Xq  = np.array(np.append([1.0], q), ndmin = 2)
          X   = np.array([np.append([1.0], self.dataset.get_dims(i, dims_x=dims_x, dims_y=dims_y)) for i in index])
          Y = np.array([self.dataset.get_dims(i, dims=dims_out) for i in index])
          
          W   = np.diag(w)
          WX  = np.dot(W, X)
          WXT = WX.T
  
          B   = np.dot(np.linalg.pinv(np.dot(WXT, WX)),WXT)
  
          self.mat = np.dot(B, np.dot(W, Y))
          
          Yq  = np.dot(Xq, self.mat)
  
          return Yq.ravel()