首页 > 解决方案 > 对象值未在 python 函数中重置

问题描述

这是我的代码。在calculateOptimalLambda()函数中,我试图声明 的副本n并将其存储为m,从 中删除一个点m,并进行一些计算和图表。然后,循环应该重新开始,制作一个新的副本m,删除下一​​个点,等等。

但是,在循环的下一次迭代中,一个点已被删除。最终,我用完了要删除的点,并且出现错误。我如何声明一个新的副本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()

标签: pythonnumpy

解决方案


推荐阅读