TypeError: unsupported operand type(s) for -: 'numpy.ndarray' and 'numpy.ndarray' whilst trying to do PCA
TypeError: unsupported operand type(s) for -: 'numpy.ndarray' and 'numpy.ndarray' whilst trying to do 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_
这里指的是什么
您没有正确解析 CSV 文件。您的 reader
returns 中的每个 row
都将是一个字符串列表,如下所示:
row = ['0.0', '1.0', '2.0', '3.0', '4.0']
因此,您的 data_sentiment
将是 字符串的列表列表 ,例如:
data_sentiment = [row, row, row]
当你直接将它传递给 pca.fit()
时,它会在内部转换为一个 numpy 数组,还包含 strings:
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
更快。
我正在尝试对稀疏矩阵进行主成分分析,但遇到错误:
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_
这里指的是什么
您没有正确解析 CSV 文件。您的 reader
returns 中的每个 row
都将是一个字符串列表,如下所示:
row = ['0.0', '1.0', '2.0', '3.0', '4.0']
因此,您的 data_sentiment
将是 字符串的列表列表 ,例如:
data_sentiment = [row, row, row]
当你直接将它传递给 pca.fit()
时,它会在内部转换为一个 numpy 数组,还包含 strings:
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
更快。