纽比标准差法除以z

2024-10-01 07:50:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了一个函数来正则化机器学习算法中的一组特征。它使用一个矩形2dnumpy数组features,并返回其正则化版本reg_features(我使用scikitlearn的波士顿房价数据进行培训)。确切代码:

import tensorflow as tf
import numpy as np
from sklearn.datasets import load_boston
from pprint import pprint

def regularise(features):

    # Regularised features:
    reg_features = np.zeros(features.shape)

    for x in range(len(features)):
        for y in range(len(features[x])):

            reg_features[x][y] = (features[x][y] - np.mean(features[:, y])) / np.std(features[:, y])

    return reg_features

# Get the data
total_features, total_prices = load_boston(True)

# Keep 300 samples for training
train_features = regularise(total_features[:300])        # Works OK
train_prices = total_prices[:300]

# Keep 100 samples for validation
valid_features = regularise(total_features[300:400])     # Works OK
valid_prices = total_prices[300:400]

# Keep remaining samples as test set
test_features = regularise(total_features[400:])         # Does not work
test_prices = total_prices[400:]

请注意,我只在最后一次调用regularise()时收到此错误,即带有total_features[400:]的调用:

/Users/RohanSaxena/Documents/projects/sdc/tensor/reg.py:11: RuntimeWarning: invalid value encountered in double_scalars reg_features[x][y] = (features[x][y] - np.mean(features[:, y])) / np.std(features[:, y])

这段代码的其余部分与最后一个调用有关,即regularise(total_features[400:])

为了检查其中一个标准偏差是否为零,我执行以下操作:

^{pr2}$

它打印所有的0,即:

0.0
0.0
...
0.0

总共features[0].size次。这意味着features中每列的标准偏差为零。在

这看起来很奇怪。所以我打印每一个标准偏差,以确保:

for y in range(len(features[0])):
    print(np.std(features[:, y])

我得到所有非零值:

10.9976293017
23.3483275632
6.63216140033
....
8.00329244499

这怎么可能?就在之前,以if条件为前缀,这段代码给了我所有的零,现在它给出了非零值!这对我来说毫无意义。感谢任何帮助。在


Tags: 代码inimportforlenasnprange
2条回答

通常,当这种情况发生时,第一个猜测是你将分子除以一个比它大的整型数(而不是一个浮点型),所以结果是0。然而,在这里情况并非如此。在

有时除法并不是按你所期望的那样(逐项),而是向量运算。 然而,这里也不是这样。在

这里的问题是如何引用数据帧

reg_features[x][y]

在处理数据帧并将值重新分配给特定单元格时,您希望使用函数loc

你可以在这里阅读更多关于它的http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.loc.html

正是数据total_features[400:]的子集导致了问题。如果您查看该数据,您将看到列total_features[400:, 1]和{}都是0。这会导致代码中出现问题,因为这些列的平均值和标准偏差都是0,结果是0/0。在

您可以使用^{},而不是编写自己的正则化函数。该函数通过返回全部为0的列来处理常量列。在

您可以轻松验证scale与您的regularise执行相同的计算:

In [68]: test
Out[68]: 
array([[ 15.,   1.,   0.],
       [  3.,   4.,   5.],
       [  6.,   7.,   8.],
       [  9.,  10.,  11.],
       [ 12.,  13.,   1.]])

In [69]: regularise(test)
Out[69]: 
array([[ 1.41421356, -1.41421356, -1.20560706],
       [-1.41421356, -0.70710678,  0.        ],
       [-0.70710678,  0.        ,  0.72336423],
       [ 0.        ,  0.70710678,  1.44672847],
       [ 0.70710678,  1.41421356, -0.96448564]])

In [70]: from sklearn.preprocessing import scale

In [71]: scale(test)
Out[71]: 
array([[ 1.41421356, -1.41421356, -1.20560706],
       [-1.41421356, -0.70710678,  0.        ],
       [-0.70710678,  0.        ,  0.72336423],
       [ 0.        ,  0.70710678,  1.44672847],
       [ 0.70710678,  1.41421356, -0.96448564]])

下面显示函数如何处理由零组成的列:

^{pr2}$

相关问题 更多 >