Numpy ValueError:设置一个数组元素,该数组元素的序列在k最近邻中的拟合(X,y)处

Numpy ValueError:设置一个数组元素,该数组元素的序列在k最近邻中的拟合(X,y)处,numpy,machine-learning,scikit-learn,nearest-neighbor,Numpy,Machine Learning,Scikit Learn,Nearest Neighbor,我在这行有一个错误:neigh.fit(X,y): ValueError:使用序列设置数组元素 我检查了fit函数,X是:{类数组,稀疏矩阵,BallTree,cKDTree} My X是一个列表,其中第一个元素的实体数和第二个元素的实体数列表(7个单元格)。 如果我改变,我只取第一个休谟数,因为我有一个纯列表 给出此错误:查询数据维度必须与BallTree数据维度匹配 我的代码: listafeaturevector = list() path = 'imgknn/' for infile i

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

我检查了fit函数,X是:{类数组,稀疏矩阵,BallTree,cKDTree} My 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=数据


我得到:用序列设置数组元素

一些建议/问题:

Humoments = cv2.HuMoments(mom)
返回值
Humoments
的类别是什么?一个
浮点数
或一个
列表
?如果
浮动
,则可以

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
相关的任何内容都应该转到相同的特征向量
xi
。然后,组合所有特征向量以获得特征向量列表
X
。但是,您的
listafeaturevector
(或
X
)显示在最内部的循环中,这显然是不正确的

第二,您有一个循环,与
轮廓中的元素数量相对应,您确定每个图像的元素数量保持不变吗?否则,不同图像中的功能(
|x|i |
)数量完全不同,这可能会导致

setting an array element with a sequence.
第三,您是否清楚如何对图像进行分类?不同图像的目标值/标签是什么?我看到您只是使用
[0,1,2,3]*(lenmatrice/4)
设置标签。你能详细说明你想用这些图像做什么吗?它们是否包含不同类型的对象?它们是否显示出不同的模式?这些图片描述了不同的主题/颜色吗?如果是,对于每种不同的类型,您会给出不同的标签-0、1、2或“红色”、“白色”、“黑色”(假设您只有3种类型)。标签的值无关紧要。重要的是他们有多少价值观。我正在努力理解
标签在您的案例中的区别

另一方面,如果只想检索相似的图像,则不需要使用分类器或为每个图像指定标签。相反,尝试使用
最近的邻居

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

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

请发布完整的堆栈跟踪,而不仅仅是异常。它可能包含解决您的问题的有用信息。因此,错误在于转换为numpy数组,对吗?这可能是因为列表的长度不同。你的答案非常宝贵!首先:Humoment是一个列表,第二:每个图像都有许多对象/轮廓,并且每个图像的对象/轮廓数量并不相同,最后但并非最不重要的一点,我想我会尝试使用最接近的邻居,因为我只想要相似的图像!问题:如果一张图像只有一个特征向量,我的特征向量是一个对象/轮廓列表,如下所示:第一张图像:[[h1,e1,s1],[h2,e2,s2],[h3,e3,s3]],X是这些特征向量的列表(即矩阵)?欢迎您。您可能希望展开列表并组合元素,以便每个图像都是一个列表。还要确保每个特征向量包含相同数量的元素,并且所有元素以相同的顺序出现。e、 例如,第一幅图像:[代码>h1、h2、h3、e1、e2、e3、s1、s2、s3
],第二幅图像
[h1',h2',h3',e1',e2',e3',s1',s2',s3'
]。图像中不能有不同数量的对象/轮廓。相反,您可以使用最大数量的对象,并为那些没有这么多的对象使用一些默认值。我更改了特征向量创建(现在我的特征向量是:第一个图像:[h1,h2,h3,e1,e2,e3,s1,s2,s3]),我使用最大数量的对象,我的y是[0,1,2,3]。新错误:找到具有dim 4的阵列。预期为31,这就是我写[0,1,2,3]*(lenmatrice/4)的原因,31是我的图像/特征向量的数量,你根本不需要y。请参见最近邻居.fit(X)的示例。因为你不需要分类器。请原谅我的无知,我使用了最近邻函数:print(neigh.kneighbors(fv)),其中fv是图像的特征向量,这是结果:(数组([[2.28996567,2.38927531,2.46947026]]),数组([[1,5,3]])。我怎样才能知道这些结果代表的是哪个图像?我必须创建一个小字典功能向量-->图像吗?