解决NumPy内存错误:使用稀疏矩阵处理大型Gram矩阵
非常抱歉之前的回答还没有解决你的问题。为了解决内存不足的问题,你可以使用支持稀疏矩阵的库来存储和处理训练数据的Gram矩阵。Scipy库提供了稀疏矩阵的功能,可以有效地处理大型矩阵数据。以下是一个使用稀疏矩阵存储Gram矩阵的示例代码:
import numpy as np
from scipy.sparse import lil_matrix
from sklearn.datasets import fetch_openml
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.svm import SVC
# 加载MNIST数据集
mnist = fetch_openml('mnist_784', version=1, cache=True)
X = mnist.data
y = mnist.target
# 将像素值缩放到0-1范围
X = X / 255.0
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 计算Gram矩阵
n_samples = X_train.shape[0]
gram = lil_matrix((n_samples, n_samples))
for i in range(n_samples):
for j in range(n_samples):
gram[i, j] = np.dot(X_train[i], X_train[j])
# 创建SVM分类器并进行训练
svm = SVC(kernel='precomputed')
svm.fit(gram, y_train)
# 在训练集上进行预测
y_pred_train = svm.predict(gram)
# 计算训练集的准确率
accuracy_train = accuracy_score(y_train, y_pred_train)
print('训练集准确率:', accuracy_train)
# 在测试集上进行预测
n_test_samples = X_test.shape[0]
test_gram = lil_matrix((n_test_samples, n_samples))
for i in range(n_test_samples):
for j in range(n_samples):
test_gram[i, j] = np.dot(X_test[i], X_train[j])
y_pred_test = svm.predict(test_gram)
# 计算测试集的准确率
accuracy_test = accuracy_score(y_test, y_pred_test)
print('测试集准确率:', accuracy_test)
在这个示例中,我们使用Scipy库中的稀疏矩阵lil_matrix来存储Gram矩阵。首先,我们计算训练集的Gram矩阵,然后使用SVC类的kernel='precomputed'参数来指定使用预计算的Gram矩阵作为输入进行训练。在测试集上,我们同样计算了测试数据和训练数据之间的Gram矩阵,并使用它来进行预测。
这种方法可以减少内存的使用,因为稀疏矩阵只存储非零元素,而不需要存储整个矩阵。这样可以有效地处理大型数据集。
希望这个新的代码可以解决你的问题!如有其他问题,请随时提问。
原文地址: https://www.cveoy.top/t/topic/bCaY 著作权归作者所有。请勿转载和采集!