今天在写一个append操作时,发现前面的数据总是被覆盖
thetas = []
theta = np.ones((n, 1))
while count < maxloop and error > eplsion:
count += 1
h = sigmoid(x, theta)
thetas.append(theta)
theta -= rate * (1.0/m) * x.T * (h-y)
error = J(theta, x, y)
errors.append(error)
if error < eplsion:
break
print thetas
无论怎么修改,结果总是
[array([[ 0.46485318],
[-0.31201893],
[ 1.56900716]]),
array([[ 0.46485318],
[-0.31201893],
[ 1.56900716]]),
array([[ 0.46485318],
[-0.31201893],
[ 1.56900716]]),
array([[ 0.46485318],
[-0.31201893],
[ 1.56900716]]),
array([[ 0.46485318],
[-0.31201893],
[ 1.56900716]])]
后来找到原因:
python中,append只是拷贝了对象的引用而非对象本身,称之为浅拷贝。theta被append给thetas的是一个地址。thetas放在循环外时,每次赋给thetas的只是一个相同的位置,而这个位置的值发生了改变,相应地表现为后面的值覆盖前面的值;
解决方法:
1.把theta的初始化放在循环内,即每循环一次生成一个list,用不同的位置,这样赋给thetas的值就不会发生改变(但是这里因为thetas的值要迭代,所以这个方法不行);
2.使用深拷贝copy.deepcopy:
a.直接复制:对对象的引用;
b.浅拷贝:拷贝父对象,但不拷贝对象内部的子对象;
c.深拷贝:完全拷贝父对象及其子对象,生成一个新的对象,则对原父对象和子对象的改变无法引起新变量的改变,两者完全独立;
在此处使用copy.deepcopy,即每次循环都拷贝theta生成一个新的对象,将其放入thetas。
网友评论