2017-03-17 34 views
1

我一直在尝试使用像素作为数据来实现图像压缩的k均值,k作为质心数量。我不断收到一个错误:IndexError: invalid index to scalar variable.;在if assignment[i] == j:的比较声明中。我决定首先计算初始质心,然后用它将数据点聚类到正确的质心。然后使用赋值变量重新计算质心到argmin中。图像压缩中的K均值numpy错误

我的代码:

def mykmeans(pixels, K): 
    k=int(K) 
    #number of pixels dimension 
    pixel_num=pixels.shape[0] 
    print('Pixel num',pixel_num) 
    pixel_rand1=np.random.randint(pixel_num,size=(1,k)) 
    int_cent=pixels[pixel_rand1[0],:] #new centroids 
    #for initial centroids 
    dis_temp1=np.array((pixel_num,k)) 
    assignment= [None]*pixel_num 
    for i in range(pixel_num): 
     for j in range(k): 
      dis_temp1[j]=linalg.norm(pixels[i]-int_cent[j])**2 
    assignment=np.argmin(dis_temp1) 
    print('Assignemnt',int(assignment)) 
    x_new=int_cent 
    new_assign=np.array([]) 
    for i in range(pixel_num): 
     for j in range(k): 
      if assignment[i] is j: 
       new_assign += assignment[i] 
    #for after initial centroid 
    while (linalg.norm(x_new-x_old) <1e-4): 
     #part 1 
     for i in range(pixel_num): 
      for j in range(k): 
       dis_temp[j]=linalg.norm(pixels[i]-x_old[j])**2 
     assignment[i]=np.argmin(dis_temp) 
     #   
     #  #part 2 
     new_assign=[] 
     for i in range(pixel_num): 
      for j in range(k): 
       if assignment[i] == j: 
        new_assign += assignment[i] 
      x_new[j]=np.mean(new_assign,axis=0) 
      centroid=x_new 

    print(assignment) 
    print(centroid) 
    return assignment, centroid 

回答

0

错误是告诉你,assignment是一个标量。

因此,您不能通过索引访问assignment,所以assignment[i] = j会给您提供错误。

assignment在此设置assignment=np.argmin(dis_temp1)其中dist_temp1是一维阵列。

当您将一维数组传递给np.argmin时,它会返回一个标量:请参阅文档here

最初你设置了assignment= [None]*pixel_num,所以你需要小心重新分配你的变量。

你也应该看看你如何定义dis_temp,因为下面会产生一个错误k>2

for i in range(pixel_num): 
    for j in range(k): 
     dis_temp1[j]=linalg.norm(pixels[i]-int_cent[j])**2 

也许你的意思是定义dis_temp1 = np.zeros((pixel_num,k))和环路

for i in range(pixel_num): 
    for j in range(k): 
     dis_temp1[i][j]=linalg.norm(pixels[i]-int_cent[j])**2 
    assignment[i]=np.argmin(dis_temp1) 

这使代码转发到一个新的错误,其中x_old尚未定义。