【问题标题】:preserve the elements value in matrix保留矩阵中的元素值
【发布时间】:2018-05-06 18:38:29
【问题描述】:

我有一个带有标签和图像的文本数据集。标签是表示手写数字的一维元素。 Dimension:(1010,)。图片为 28*28 像素大小的图片。Dimension:(1010, 784)。从文本数据集读取后,我有以下数据集 reformatData['data']reformatData['target'] - 分别是 [n_samples, n_features][n_samples]

同样,这些尺寸:(1010, 784) (1010,) 打印时reformatData

现在我正在尝试进行二进制分类并将数字引入矩阵,我尝试使用以下函数来完成。

digits1=[8]
digits2=[1]


def read(digits):
    rows=28
    cols=28
    #lbl = array("b", reformatData['target'])
    lbl = reformatData['target']
    img=reformatData['data']
    #img = array("B", reformatData['data'])

    ind = [ k for k in xrange(len(lbl)) if lbl[k] in digits]
    images =  matrix(0, (len(ind), rows*cols))
    labels = matrix(0, (len(ind), 1))
    for i in xrange(len(ind)):
        images[i, :] = img[ ind[i]*rows*cols : (ind[i]+1)*rows*cols ]
        labels[i] = lbl[ind[i]]
    return images, labels

print read(digits=digits1)

输出

(<0x784 matrix, tc='i'>, <0x1 matrix, tc='i'>)

我预计:

(<1010x784 matrix, tc='i'>, <1010x1 matrix, tc='i'>)

我该如何解决这个问题?

【问题讨论】:

  • 如果您尝试将特征矩阵和目标向量提供给 sklearn 中的分类算法,则无需将两者连接起来。除非我误解了你的问题
  • 这正是我想要做的。我不担心矩阵连接。我的问题是如何在该矩阵中引入“数字”,以便我可以执行二进制 SVM 分类:就像这里 cvxopt.org/applications/svm/index.html
  • 也许我仍然不清楚您要做什么。您的特征矩阵的大小应为 [n_samples, n_features],正如您在上面阐明的那样,您的目标向量的大小应为 [n_samples, 1]。特征矩阵的每一列都应与训练集的每个图像中相应像素的相同指示位置有关。在这种情况下,每一行将代表一个单独的训练示例(或图像)。到目前为止我们达成了一致吗?
  • 是的,rahlf23。谢谢你的第二部分。因此,如果我想做数字 3 和数字 6,那么概述问题,我该如何介绍它。如果我没有上面定义的“数字”变量来操作
  • 通过您分享的链接的示例试图对 0 和 1 进行分类,您是否试图将此示例扩展到两个以上的类?

标签: python numpy scikit-learn svm


【解决方案1】:

要为二进制分类映射两位数,请通过列表理解修改目标向量:

import numpy as np

s = np.array([6, 8, 6, 6, 6, 8, 6, 8, 8, 8, 6, 6, 6, 8, 8, 6, 8, 6, 8] ) 

new = np.array([0 if i==6 else 1 for i in s])

输出:

[0 1 0 0 0 1 0 1 1 1 0 0 0 1 1 0 1 0 1]

【讨论】:

  • 感谢 rahlf23,它适用于像 lbl 这样的单个数组,但不适用于 img。列表推导会产生 ValueError:具有多个元素的数组的真值不明确。如果已实现,请使用 a.any() 或 a.all()
  • 在矩阵上使用np.wherenp.where(images==6, 1, images)
【解决方案2】:

使用numpy where 进行矢量化和更快的计算:

上面带有rahfl23的数组:

np.where(s==6, 0, 1)

对于矩阵:

np.where(images==6, 0, 1)

【讨论】:

    猜你喜欢
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    相关资源
    最近更新 更多