我正在学习Scikit-learn中的教程,一个部分创建了一个数据集。这样:
#Generate the example datapoints, red and blue.
X, t = sklearn.datasets.make_circles(n_samples=100, shuffle=False, factor=0.3, noise=0.1)
T = np.zeros((100,2))
T[t==1,1] = 1
T[t==0,0] = 1
#Seperate the datapoints by color.
x_red = X[t==0]
x_blue = X[t==1]
print ('shape of X: {}'.format(X.shape))
print ('shape of T: {}'.format(T.shape))
#Plotstuff
plt.plot(x_red[:,0], x_red[:,1], 'ro', label='class red')
plt.plot(x_blue[:,0], x_blue[:,1], 'bo', label='class blue')
plt.grid()
plt.legend(loc=1)
plt.xlabel('$x_1$', fontsize=15)
plt.ylabel('$x_2$', fontsize=15)
plt.axis([-1.5, 1.5, -1.5, 1.5])
plt.title('red vs. blue classes in the input space')
plt.show()
完全正常chart。
但是,当我将其更改为接受命令行输入时:
try:
in1 = (int(float(sys.argv[1])))
in2 = (int(float(sys.argv[2])))
in3 = (int(float(sys.argv[3])))
in4 = (int(float(sys.argv[4])))
except IndexError:
print(
"The program is run as: program.py a b c d \n"
"a = Random seed\n"
"b = Number of samples\n"
"c = Factor\n"
"d = Noise\n"
"Example: python JISIDF-[01].py 1 100 0.3 0.1")
raise SystemExit
np.random.seed(seed=in1)
#Generate the example datapoints, red and blue.
X, t = sklearn.datasets.make_circles(n_samples=in2, shuffle=False, factor=in3, noise=in4)
即使输入相同:
don@don-DELL:~/Code/Tutorials/Peterrolelant$ python3 PeterNet-17.py 1 100 0.3 0.1
我收到错误:
Traceback (most recent call last):
File "PeterNet-17.py", line 27, in <module>
X, t = sklearn.datasets.make_circles(n_samples=in2, shuffle=False, factor=in3, noise=in4)
File "/usr/local/lib/python3.4/dist-packages/sklearn/datasets/samples_generator.py", line 625, in make_circles
X += generator.normal(scale=noise, size=X.shape)
File "mtrand.pyx", line 1902, in mtrand.RandomState.normal (numpy/random/mtrand/mtrand.c:17755)
ValueError: scale <= 0
以前这是一个问题。我该如何解决这个问题?
答案 0 :(得分:1)
从http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.seed.html和http://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_circles.html,请注意seed
和n_samples
int
和noise
factor
需要double
。
当前类型转换的主要问题是in4 = int(float(sys.argv[4]))
的计算结果为0,因为int(float('0.1'))
计算结果为0,但noise
(和scale
)预计为大于0.这就是追溯说ValueError: scale <= 0
的原因。出于同样的原因,int(float(sys.argv[3]))
也评估为0,但您可能希望它为0.3。因此,两种情况的解决方案是删除int
投射。
另一个小问题是,您可以直接执行in1 = int(sys.argv[1])
和in2 = int(sys.argv[2])
,而无需先将sys.argv[1]
和sys.argv[2]
字符串转换为float
。< / p>
因此,总而言之,您应该这样做:
in1 = int(sys.argv[1])
in2 = int(sys.argv[2])
in3 = float(sys.argv[3])
in4 = float(sys.argv[4])