Значения объекта не сбрасываются в функции python - PullRequest
0 голосов
/ 03 марта 2020

Вот мой код. В функции calculateOptimalLambda() я пытаюсь объявить копию n и сохранить ее как m, удалить одну точку из m и выполнить некоторые вычисления и построить график. Затем l oop должен перезапуститься, сделать свободную sh копию m, удалить следующую точку и так далее.

Однако при следующей итерации l oop точка была удалена. В конце концов, у меня заканчиваются точки для удаления, и я получаю сообщение об ошибке. Как мне объявить свободную sh копию m, чтобы я мог удалить следующую точку?

import numpy as np
from matplotlib import pyplot as plt

class Data:

   def __init__(self, points, sigma, lamda):
      self.points = points
      self.sigma =  sigma
      self.sample = np.random.uniform(-1,1, (points, 2))
      self.transformedData = np.ones((points, 5))
      self.weight = np.zeros((5,1))
      self.lamda = lamda

   def changeLamda(self,x):
      self.lamda = x

   def removePoint(self, x):
      self.points = self.points - 1
      self.sample = np.delete(self.sample, x, 0)
      self.transformedData = np.delete(self.transformedData, x, 0)

   def transformedFunction(self, x):
     transformedData = np.ones((1, 5)) 
     transformedData[0,1] = x
     transformedData[0,2] = 0.5 * (3*x**2 -1)
     transformedData[0,3]= 0.5 * (5*x**3 - 3*x)
     transformedData[0,4] = 0.125 * (35*x**4 -30*x**2 + 3)  
     return np.dot(transformedData, self.weight)

   def setY(self):
      for i in range(len(self.sample[0:,0])):
         self.sample[i,1] = np.random.normal(0, self.sigma) + self.sample[i,0]**2

   def transform(self):
      for i in range(len(self.sample[0:,0])):
         self.transformedData[i,1] = self.sample[i,0]
         self.transformedData[i,2] = 0.5 * (3*self.sample[i,0]**2 -1)
         self.transformedData[i,3]= 0.5 * (5*self.sample[i,0]**3 - 3*self.sample[i,0])
         self.transformedData[i,4] = 0.125 * (35*self.sample[i,0]**4 -30*self.sample[i,0]**2 + 3)


   def calculateWeight(self):
      z = n.transformedData
      zProd = np.linalg.inv(np.matmul(np.transpose(z), z) + np.identity(5)*self.lamda)
      next1 = np.matmul(zProd,np.transpose(z))
      a = self.sample[0:,1]
      a = a.reshape((-1, 1))
      print(a)
      self.weight = np.matmul(next1,a)

   def calculateError(self):
      error= (np.matmul(self.transformedData, self.weight) - self.sample[1,0:])
      return error/self.points

def calculateOptimalLambda(n, L):
   a = 0
   for i in range(len(L)):
      n.changeLamda(L[i])
      for x in range(n.getPoints()):
         a+=1
         plt.subplot(4,5,a)
         m = n
         m.removePoint(x)
         m.calculateWeight()
         weight = m.getWeight()
         error = m.calculateError() 
         twoD_plot(m)
         print(error)

def twoD_plot(n):
   t = np.linspace(-1, 1, 400)
   x = np.square(t)
   plt.plot(t,x,'b')
   error = 0
   y = x
   for i in range(len(t)):
      y[i] = n.transformedFunction(t[i])
      error += (y[i] - t[i]**2)**2
   """print(error/len(t))"""
   plt.plot(t,y,'r')
   plt.scatter(n.getSample()[0:,0],n.getSample()[0:,1], c = 'g', marker = 'o')

n = Data(5,0.1,0)
n.setY()
n.transform()
n.calculateWeight()
L = [1, 0.01, 0.00001, 0]
calculateOptimalLambda(n, L)
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...