code: def run(self, d, x):
          
          # measure the data and check if the dimmension agree
          N = len(x)
          if not len(d) == N:
              raise ValueError('The length of vector d and matrix x must agree.')  
          self.n = len(x[0])
          # prepare data
          try:    
              x = np.array(x)
              d = np.array(d)
          except:
              raise ValueError('Impossible to convert x or d to a numpy array')
          # create empty arrays
          y = np.zeros(N)
          e = np.zeros(N)
          self.w_history = np.zeros((N,self.n))
          # adaptation loop
          for k in range(N):
              self.w_history[k,:] = self.w
              y[k] = np.dot(self.w, x[k])
              e[k] = d[k] - y[k]
              nu = self.mu / (self.eps + np.dot(x[k], x[k]))
              dw = nu * x[k] * e[k]**3
              self.w += dw
          return y, e, self.w_history
docs: This function filters multiple samples in a row.
  
          **Args:**
  
          * `d` : desired value (1 dimensional array)
  
          * `x` : input matrix (2-dimensional array). Rows are samples,
            columns are input arrays.
  
          **Returns:**
  
          * `y` : output value (1 dimensional array).
            The size corresponds with the desired value.
  
          * `e` : filter error for every sample (1 dimensional array).
            The size corresponds with the desired value.
  
          * `w` : history of all weights (2 dimensional array).
            Every row is set of the weights for given sample.