Numpy 支持向量机实现中的错误

Numpy 支持向量机实现中的错误,numpy,machine-learning,computer-vision,svm,Numpy,Machine Learning,Computer Vision,Svm,以下是我的猫和狗图像识别代码: import numpy as np from sklearn.svm import SVC from sklearn.model_selection import train_test_split filename= 'catdog_datasets.txt' filename1= 'catdog_datasets.txt' raw_data = open(filename, 'rt') raw_data1 = open(filename1, 'rt') #

以下是我的猫和狗图像识别代码:

import numpy as np
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split


filename= 'catdog_datasets.txt'
filename1= 'catdog_datasets.txt'
raw_data = open(filename, 'rt')
raw_data1 = open(filename1, 'rt')
#data = numpy.loadtxt(raw_data,dtype='object',delimiter=":")
features_data = np.loadtxt(raw_data,dtype='object',delimiter=":",usecols=(0))
labels_data = np.loadtxt(raw_data1,dtype='object',delimiter=":",usecols=(1))
print(features_data.shape)
print(labels_data.shape)

#print(labels_data)
#print(features_data)

X_train, X_test, y_train, y_test = train_test_split(features_data,labels_data,test_size=0.2)
print (y_train.shape)
print (y_test.shape)
print (X_train.shape)
print (X_test.shape)


clf = SVC(kernel='linear',C=1.0)
clf.fit(X_train,y_train)
predictions = clf.predict(X_test)
catdog_datsets.txt包含猫和狗各500张图像的HOG特征向量,猫和狗的标签分别为0和1。文件格式为: 0.270150 0.070257 0.040265 0.037243 0.013678:0

注:特征向量的大小约为1765*1,只是为了提问我给出的大小为5*1的问题。问题是特征向量是一个字符串,我想将其转换为浮点数组以提供给SVM。这是我得到的错误:

clf.fit(X_train,y_train)
  File "C:\Users\TIKA-OPT790-04\AppData\Local\Programs\Python\Python36-32\lib\site-packages\sklearn\svm\base.py", line 149, in fit
    X, y = check_X_y(X, y, dtype=np.float64, order='C', accept_sparse='csr')
  File "C:\Users\TIKA-OPT790-04\AppData\Local\Programs\Python\Python36-32\lib\site-packages\sklearn\utils\validation.py", line 573, in check_X_y
    ensure_min_features, warn_on_dtype, estimator)
  File "C:\Users\TIKA-OPT790-04\AppData\Local\Programs\Python\Python36-32\lib\site-packages\sklearn\utils\validation.py", line 433, in check_array
    array = np.array(array, dtype=dtype, order=order, copy=copy)
ValueError: could not convert string to float:0.270150 0.070257 0.040265 0.037243 0.013678

错误是因为您的文件包含以下行:

f1 f2 f3 f4 ............................................f1565 :0
正如您所观察到的,特征用空格分隔,整个特征向量用冒号(:)与标签分隔

现在在您的代码中,您使用的是
delimiter=“:”
,因此您的
features\u数据将只包含以下每行的单个值:

f1 f2 f3 f4 ............................................f1565
您需要将其拆分为多个功能才能正确使用

现在
numpy.loadtxt
本身不支持多个分隔符,因此必须使用其他选项或解决方法

  • 在当前程序中完成以下操作后,拆分
    功能\u数据

    features_data = np.array([l.strip().split(' ') for l in features_data])
    
  • 建议:使用:


  • 请出示一些您的数据样本。两个文件中的一些行。您确定读取的数据正确吗?两个文件包含相同的数据,文件大小非常大。它包含特征向量,然后后跟分隔符“:”然后标记为“0”或“1”。数据如下所示:f1 f2 f3 f4对于单个图像(即第一行),f1565:0特征向量由空格字符分隔。每个图像由一个大小为1565*1的向量表示。是的,您是正确的,特征数据如下:'f1 f2 f3。。。。。。。f1565'对于每一行,据我所知,它应该被转换成如下的浮点am数组[f1,f2,f3,…..f1565],然后只有它能被送入SVM??使用这个:features_data=np.array([l.split(“”)for l in features_data]),我得到以下格式的数据:[list(['f1','f2','f3','f3','f1565',']啊,是的。那是因为字符串中的最后一个空格。请检查修改后的答案。不,我得到的特征数据是这样的字符串数组:[list(['f1','f2'…'f1565'])]…..…据我所知,SVM只理解数字,它应该被转换成这样的折叠数组:[[f1 f2….f1565],[f1 f2….f1565]当我尝试此操作时,features\u data=features\u data.astype(np.float),我得到一个错误:features\u data=features\u data.astype(np.float)ValueError:使用序列设置数组元素。
    all_data = pd.read_csv(raw_data, sep=':|\s+', engine='python', header=None)
    
    # All but last column
    features_data = all_data.iloc[:,0:-1]
    
    #last column
    labels_data = all_data.iloc[:,-1]