2017-03-17 32 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尚未定義。