TypeError:不支持的操作数类型 - :' numpy.ndarray'和' numpy.ndarray'同时尝试做PCA

时间:2015-04-15 20:29:01

标签: python csv numpy scikit-learn

我试图在稀疏矩阵上进行PCA,但我遇到了错误:

TypeError: unsupported operand type(s) for -: 'numpy.ndarray' and 'numpy.ndarray'

这是我的代码:

import sys
import csv
from sklearn.decomposition import PCA

data_sentiment = []
y = []
data2 = []
csv.field_size_limit(sys.maxint)
with open('/Users/jasondou/Google Drive/data/competition_1/speech_vectors.csv') as infile:
    reader = csv.reader(infile, delimiter=',', quotechar='|')
    n = 0
    for row in reader:
        # sample = row.split(',')
        n += 1
        if n%1000 == 0:
            print n
        data_sentiment.append(row[:25000])

pca = PCA(n_components=3)
pca.fit(data_sentiment)
PCA(copy=True, n_components=3, whiten=False)
print(pca.explained_variance_ratio_) 
y = pca.transform(data_sentiment)

输入数据为speech_vector.csv,找到2740 * 50000矩阵available here

以下是完整的错误追溯:

Traceback (most recent call last):
  File "test.py", line 45, in <module>
    y = pca.transform(data_sentiment)
  File "/Users/jasondou/anaconda/lib/python2.7/site-packages/sklearn/decomposition/pca.py", line 397, in transform
    X = X - self.mean_
TypeError: unsupported operand type(s) for -: 'numpy.ndarray' and 'numpy.ndarray'

我不太明白self.mean_在这里指的是什么。

1 个答案:

答案 0 :(得分:1)

您没有正确解析CSV文件。 row返回的每个reader都是一个字符串列表,如下所示:

row = ['0.0', '1.0', '2.0', '3.0', '4.0']

您的data_sentiment因此将是字符串列表,例如:

data_sentiment = [row, row, row]

当你直接将它传递给pca.fit()时,它会在内部转换为numpy数组,同时包含字符串

X = np.array(data_sentiment)
print(repr(X))
# array([['0.0', '1.0', '2.0', '3.0', '4.0'],
#        ['0.0', '1.0', '2.0', '3.0', '4.0'],
#        ['0.0', '1.0', '2.0', '3.0', '4.0']], 
#       dtype='|S3')

numpy没有从另一个字符串数组中减去字符串数组的规则:

X - X
# TypeError: unsupported operand type(s) for -: 'numpy.ndarray' and 'numpy.ndarray'

如果你打算在我的问题中向我们展示data_sentiment的一些内容,那么这个错误很容易被发现。


您需要做的是将字符串转换为浮点数,例如:

data_sentiment.append([float(s) for s in row[:25000]])

更简单的方法是使用np.loadtxt来解析CSV文件:

data_sentiment = np.loadtxt('/path/to/file.csv', delimiter=',')

如果您安装了pandas,那么对于像这样的大型阵列,pandas.read_csv可能会比np.loadtxt更快。