这是《机器学习在行动》一书中的代码。source code
传递给dataSet
的是一个m*3数组(datingTestSet2.txt
,可以在上级目录中找到)你知道吗
我的问题是:
准备一个矩阵返回有什么好处?(保存内存?)你知道吗
如果我不准备矩阵,它会出错吗?(似乎不是。)
from numpy import *
def autoNorm(dataSet):
minVals = dataSet.min(0)
maxVals = dataSet.max(0)
ranges = maxVals - minVals
normDataSet = zeros(shape(dataSet)) # prepare matrix to return(It's my own comment, not in the source code. )
# Because there is a similar code before it,
# I think it should be the same meaning. Or any means else?
m = dataSet.shape[0]
normDataSet = dataSet - tile(minVals, (m,1))
normDataSet = normDataSet/tile(ranges, (m,1)) #element wise divide
return normDataSet, ranges, minVals
除了不需要初始化normDataSet之外,根本不需要它。您可以直接将
array
数据集点修改为,而不影响传入的array
。你知道吗一般来说,代码过于冗长和复杂,没有充分利用
numpy
。我不知道有一个内置函数可以将array
重新规范化为numpy
中的范围[0,1],但是在numpy
array
上使用元素操作可以很容易地完成:没有优势。在您显示的代码中,对
normDataSet
的第一个赋值没有持久的效果,因为两行之后对normDataSet
还有第二个赋值。此时,以前绑定到normDataSet
的zeros
数组对象的引用计数达到零,旧数组立即被垃圾回收。(当然,这是假设CPython,但是在编写本文时,没有一个替代的Python实现对NumPy有完全的工作支持。)我猜这是作者的一个简单(但相对无害)错误。我建议提交一个bug报告,这样它就可以被修复了。你知道吗
顺便说一下,术语nit:
normDataSet
是一个数组,而不是矩阵。这一点很重要,因为NumPy确实有一个matrix
类型,它在乘法、除法和指数运算上的行为不同于普通的array
。你知道吗相关问题 更多 >
编程相关推荐