python - 对象值未在 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()
解决方案
推荐阅读
- python - 正确地将带有参数的函数分配给 Tkinter 中的按钮
- ssis - 从执行 sql 任务中提取结果集并将其存储在 excel 文件中?
- angular - Angular 中的 FullCalendar - 更改 MonthView 中的日期格式
- ruby - 如何在终端中执行这个看似基本的步骤,“将 Homebrew 添加到您的 PATH”?
- java - Hyperledger Fabric (1.4) EventHub 断开连接且没有详细错误
- uwp - Windows 10 20H2 开始菜单中的灰色背景
- json - 在 Typescript 中使用括号符号更新对象的嵌套属性
- system - 许可设计和返工
- terraform - 在 Windows 中执行“terragrunt plan”时看到“文件名或扩展名太长”
- c++ - 如何在一台机器上构建 C++ 并在另一台机器上执行?