如何标准化特定范围内csv文件中的数据

时间:2019-01-13 19:56:43

标签: python python-3.x

我有一个csv文件,如下所示:

1,1.23,1.53,1.22,0.96,0.24,1.22,1.22,2.12,0.76,0.99
2,1.17,1.52,0.67,0.93,0.14,1.60,1.23,2.22,0.55,0.65
3,2.21,1.52,0.66,0.33,0.15,1.72,1.18,1.45,0.98,0.33

我想读取csv文件中的所有数据,但每行中的第一个值除外。

然后我想将数据标准化到特定范围。

由于stackoverflow,我学会了读取相关数据,并设法研究了足够的Python来对数据进行规范化。

此数据(如果我的代码正确)会将数据标准化为0到1。

但是我无法弄清楚如何将数据规范化到另一个范围(例如0.001到1)。

import numpy

array = numpy.genfromtxt('Anaconda3JamesData/james_test_3.csv', delimiter=',')

# get minimum and maximum values of 
# all data except the first value in each row
maximum=array[:, 1:].max()
minimum=array[:, 1:].min()   

print (minimum)
print (maximum)

# display the contents of the csv file except the first value in each row
print (array[:,1:])

# normalise all data in the array except 
# the first value of each row
x = (array[:,1:] - minimum)/(maximum - minimum)

print (x)

我的输出是:

0.14
2.22

[[1.23 1.53 1.22 0.96 0.24 1.22 1.22 2.12 0.76 0.99]
 [1.17 1.52 0.67 0.93 0.14 1.6 1.23 2.22 0.55 0.65]
 [2.21 1.52 0.66 0.33 0.15 1.72 1.18 1.45 0.98 0.33]]

[[0.52403846 0.66826923 0.51923077 0.39423077 0.04807692 0.51923077
  0.51923077 0.95192308 0.29807692 0.40865385]
 [0.49519231 0.66346154 0.25480769 0.37980769 0. 0.70192308
  0.52403846 1. 0.19711538 0.24519231]
 [0.99519231 0.66346154 0.25 0.09134615 0.00480769 0.75961538
  0.5 0.62980769 0.40384615 0.09134615]]

这确实看起来像我的规范化代码是正确的。它在0到1之间对所需的数据进行标准化。但是,如何在0.001到1之间对数据进行标准化?谢谢。

1 个答案:

答案 0 :(得分:0)

我认为您正在尝试缩放归一化范围并引入和拦截以避免归一化0值。这就是我的做法。

您当前的变换等效于下式:

(x - min)/(max - min) = n/1

要将其缩放到大小为0.999的范围,请执行以下转换:

(x - min)/(max - min) = n/0.999
((x - min)/(max - min)) * 0.999 = n

但是,这将使您的归一化范围为[0,0.999]。因此,您需要引入0.001的截距,以使归一化范围为[0.001,1]

0.001 + ((x - min)/(max - min)) * 0.999 = n

将其应用于您的脚本将给出:

x = 0.001 + ((array[:,1:] - min)/(max - min)) * 0.999