我正在尝试通过实现k-Nearest Neighbor分类器来了解有关Python的更多信息。 KNN的工作原理是根据与其最相似的现有数据标记新数据。因此,对于给定的数据表,您尝试确定3个最相似的点(如果k = 3)并选择更频繁的标签。您可以通过不同的方式确定“相似性”,某种距离函数。因此,您可以实现各种距离函数(余弦距离,曼哈顿,欧几里德等)并选择您想要的任何距离。
我正在尝试制作一些东西,让我可以轻松地交换距离函数,而不需要做任何情况,我到目前为止的解决方案是只存储方法的引用列表。这很好,但是它在深度复制中断了,我想弄清楚如何修复我的实现或者在不需要做案例和让深度复制工作之间达成妥协。
这是我的配对课程
class DataTable:
def __init__(self, filename,TrueSymbol,FalseSymbol):
self.t = self.parseCSV(filename)
self.TrueSymbol = TrueSymbol
self.FalseSymbol = FalseSymbol
# This is the problem line of code
self.distList = [self.euclideanDistance,
self.manhattanDistance,
self.cosineDistance]
def nearestNeighbors(self,entry,k=None,distanceMetric=None):
"""
distanceMetrics you can choose from:
0 = euclideanDistance
1 = manhattanDistance
2 = cosineDistance
"""
if distanceMetric == None:
distanceFunction = self.euclideanDistance
else:
self.distList[distanceMetric]
# etc..
def euclideanDistance(self,entry):
pass
def manhattanDistance(self,entry):
pass
def cosineDistance(self,entry):
pass
# open up that csv
def parseCSV(self,filename):
pass
这是调用它的代码 import deepcopytestDS 导入副本
data = deepcopytestDS.DataTable("ionosphere.data","g","b")
deepCopy = copy.deepcopy(data) # crash.
这是callstack
>>> deepCopy = copy.deepcopy(data)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.6/copy.py", line 162, in deepcopy
y = copier(x, memo)
File "/usr/lib/python2.6/copy.py", line 292, in _deepcopy_inst
state = deepcopy(state, memo)
File "/usr/lib/python2.6/copy.py", line 162, in deepcopy
y = copier(x, memo)
File "/usr/lib/python2.6/copy.py", line 255, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)
File "/usr/lib/python2.6/copy.py", line 162, in deepcopy
y = copier(x, memo)
File "/usr/lib/python2.6/copy.py", line 228, in _deepcopy_list
y.append(deepcopy(a, memo))
File "/usr/lib/python2.6/copy.py", line 189, in deepcopy
y = _reconstruct(x, rv, 1, memo)
File "/usr/lib/python2.6/copy.py", line 323, in _reconstruct
y = callable(*args)
File "/usr/lib/python2.6/copy_reg.py", line 93, in __newobj__
return cls.__new__(cls, *args)
TypeError: instancemethod expected at least 2 arguments, got 0
这次崩溃意味着什么,是否有一些方法可以使深度复制工作无需摆脱交换距离函数的快捷方式?
答案 0 :(得分:4)
这是一个错误:http://bugs.python.org/issue1515
您可以将它放在文件的顶部以使其正常工作:
import copy
import types
def _deepcopy_method(x, memo):
return type(x)(x.im_func, copy.deepcopy(x.im_self, memo), x.im_class)
copy._deepcopy_dispatch[types.MethodType] = _deepcopy_method