ValueError:在k-最近邻居中设置一个数字元素,其中的序列为fit(X,y)

问题描述 投票:0回答:1

我在这一行有一个错误:neigh.fit(X,y):ValueError:用序列设置数组元素。

我检查了拟合函数,X是:{array-like,稀疏矩阵,BallTree,cKDTree}我的X是列表,其中包含第一个元素实体数和第二个元素列表(7个单元格)。如果我改变并且我只拿第一个幽默数字来获得一个纯列表列表给出这个错误:查询数据维度必须匹配BallTree数据维度。

我的代码:

listafeaturevector = list()
path = 'imgknn/'
for infile in glob.glob( os.path.join(path, '*.jpg') ):
    print("current file is: " + infile )
    gray = cv2.imread(infile,0)
    element = cv2.getStructuringElement(cv2.MORPH_CROSS,(6,6)) 
    graydilate = cv2.erode(gray, element)
    ret,thresh = cv2.threshold(graydilate,127,255,cv2.THRESH_BINARY_INV) 
    imgbnbin = thresh

    #CONTOURS
    contours, hierarchy = cv2.findContours(imgbnbin, cv2.RETR_TREE ,cv2.CHAIN_APPROX_SIMPLE)
    print(len(contours))

    for i in range (0, len(contours)):
        fv = list()  #1 feature vector

        #HUMOMENTS
        #print("humoments")
        mom = cv2.moments(contours[i], 1)  
        Humoments = cv2.HuMoments(mom)
        #print(Humoments) 
        fv.append(Humoments) #query data dimension must match BallTree data dimension

        #SOLIDITY

        area = cv2.contourArea(contours[i])
        hull = cv2.convexHull(contours[i]) #ha tanti valori
        hull_area = cv2.contourArea(hull)
        solidity = float(area)/hull_area
        fv.append(solidity)

        #fv.append(elongation)
        listafeaturevector.append(fv)

print("i have done")
print(len(listafeaturevector))
lenmatrice=len(listafeaturevector)

#KNN
X = listafeaturevector
y = [0,1,2,3]* (lenmatrice/4)

from sklearn.neighbors import KNeighborsClassifier
neigh = KNeighborsClassifier(n_neighbors=3)
neigh.fit(X, y)  #ValueError: setting an array element with a sequence.

print(neigh.predict([[1.1]]))
print(neigh.predict_proba([[0.9]]))

如果我尝试将其转换为numpy数组:

listafv = np.dstack(listafeaturevector)
listafv=np.rollaxis(listafv,-1)
print(listafv.shape)
data = listafv.reshape((lenmatrice, -1))
print(data.shape)

#KNN

X =数据

我得到:设置一个带序列的数组元素

numpy machine-learning scikit-learn nearest-neighbor
1个回答
1
投票

一些建议/问题:

Humoments = cv2.HuMoments(mom)

什么是返回值Humoments的类?一个floatlist?如果float,那很好。

for each image file
    for i in range (0, len(contours)):
       fv = list()  #1 feature vector
       ...
       fv.append(Humoments) 
       ...
       fv.append(solidity)
       listafeaturevector.append(fv)

上面的代码似乎不正确。在您的问题中,我认为您需要为每个图像构建一个特征向量。因此,与图像i相关的任何内容都应该转到相同的特征向量x_i。然后组合所有特征向量以获得特征向量列表X。但是,你的listafeaturevector(或X)出现在最里面的循环中,显然不正确。

其次,你有一个针对contours中元素数量的循环,你确定每个图像的元素数量保持不变吗?否则,不同图像中的特征数量(|x_i|)完全不同,这可能会导致错误

setting an array element with a sequence.

第三,你清楚你想如何对图像进行分类吗?不同图像的目标值/标签是什么?我看到你只是用[0,1,2,3]* (lenmatrice/4)设置标签。你能详细说明你想对这些图像做些什么吗?它们是否包含不同类型的对象?他们是否表现出不同的模式这些图像是否描述了不同的主题/颜色?如果是,对于每种不同的类型,您给出一个不同的标签 - 0,1,2或'红色','白色','黑色'(假设您只有3种类型)。标签的值无关紧要。重要的是他们拥有多少价值观。我试图了解你的情况下labels的区别。

另一方面,如果您只想检索相似的图像,则无需使用分类器或为每个图像指定标签。相反,尝试使用NearestNeighbors

print(neigh.predict([[1.1]]))
print(neigh.predict_proba([[0.9]]))

第四,以上两行测试都不正确。您需要设置一个类似X的对象,以便从分类器中获取预测。也就是说,您需要一个特征向量x,其结构与您在训练示例中构造的结构相同(所有h,e,s的顺序相同)。

© www.soinside.com 2019 - 2024. All rights reserved.