0

dist と呼ばれるメソッドを定義して、2 点間の距離を計算します。このメソッドを直接使用すると、正確に計算できます。ただし、2 点間の距離を計算するために呼び出す関数を取得すると、 UnboundLocalError: local variable 'minkowski_distance' referenced before assignment が発生します。

編集 申し訳ありませんが、この機能が機能することに気付きました。ただし、それを呼び出す別のメソッドがあります。最後の方法を一番下に置きます

これは方法です:

class MinkowskiDistance(Distance):    
  def __init__(self, dist_funct_name_str = 'Minkowski distance', p=2):    
    self.p = p

  def dist(self, obj_a, obj_b):    
    distance_to_power_p=0    
    p=self.p    

    for i in range(len(obj_a)):    
      distance_to_power_p += abs((obj_a[i]-obj_b[i]))**(p)

    minkowski_distance = (distance_to_power_p)**(1/p)    
    return minkowski_distance

これは関数です: (基本的に、タプル x と y を数値と文字列コンポーネントに分割し、x と y の数値部分の間の距離を計算し、次に文字列部分の間の距離を計算してから、それらを追加します。

def total_dist(x, y, p=2, q=2):    
    jacard = QGramDistance(q=q)    
    minkowski = MinkowskiDistance(p=p)

    x_num = []    
    x_str = []    
    y_num = []    
    y_str = []

    #I am spliting each vector into its numerical parts and its string parts so that the distances
    #of each part can be found, then summed together.

    for i in range(len(x)):

        if type(x[i]) == float or type(x[i]) == int:    
            x_num.append(x[i])    
            y_num.append(y[i])    
        else:
            x_str.append(x[i])    
            y_str.append(y[i])

    num_dist = minkowski.dist(x_num,y_num)

    str_dist = I find using some more steps
    #I am simply adding the two types of distance to get the total distance:

    return num_dist + str_dist

class NearestNeighbourClustering(Clustering):

  def __init__(self, data_file,
               clust_algo_name_str='', strip_header = "no", remove = -1):

      self.data_file= data_file    
      self.header_strip = strip_header    
      self.remove_column = remove

  def run_clustering(self, max_dist, p=2, q=2):    
      K = {}    

      #dictionary of clusters    
      data_points = self.read_data_file()    
      K[0]=[data_points[0]]    
      k=0

      #I added the first point in the data to the 0th cluster    
      #k = number of clusters minus 1

      n = len(data_points)    
      for i in range(1,n):    
          data_point_in_a_cluster = "no"

          for c in range(k+1):    
              distances_from_i = [total_dist(data_points[i],K[c][j], p=p, q=q) for j in range(len(K[c]))]
          d = min(distances_from_i)
          if d <= max_dist:
              K[c].append(data_points[i])
              data_point_in_a_cluster = "yes"

      if data_point_in_a_cluster == "no":
          k += 1
          K[k]=[data_points[i]]
  return K
4

3 に答える 3

0

minkowski_distance = (distance_to_power_p)**(1/p)コントロールが for ループに入った場合にのみ、行が実行されます。

小切手len(obj_a)

返された値が0次の場合、ステートメントreturn minkowski_distanceはエラーをスローしますlocal variable 'minkowski_distance' referenced before assignment

minkowski_distance = (distance_to_power_p)**(1/p)forループから行を取り出す必要があります

for i in range(len(obj_a)):
    distance_to_power_p += abs((obj_a[i]-obj_b[i]))**(p)

minkowski_distance = (distance_to_power_p)**(1/p) # this is only assignment, no need 
                                                  # for this to be inside the loop

return minkowski_distance
于 2012-10-26T04:38:26.940 に答える
0

obj_aが空の場合、minkowski_distance設定されません

for i in range(len(obj_a)):

  distance_to_power_p += abs((obj_a[i]-obj_b[i]))**(p)

  minkowski_distance = (distance_to_power_p)**(1/p)

return minkowski_distance

これは、x がいずれも int または float でない場合に発生します。

于 2012-10-26T04:38:54.453 に答える
0

インデントに問題があるようです:

class MinkowskiDistance(Distance):
  def __init__(self, dist_funct_name_str = 'Minkowski distance', p=2):
    self.p = p

  def dist(self, obj_a, obj_b):
    distance_to_power_p=0
    p=self.p

    for i in range(len(obj_a)):
      distance_to_power_p += abs((obj_a[i]-obj_b[i]))**(p)
      minkowski_distance = (distance_to_power_p)**(1/p)

    return minkowski_distance

minkowski_distance = (distance_to_power_p)**(1/p)forループ内にあるため、forループが実行されない場合minkowski_distanceは設定されず、エラーが発生します。

その行を 1 インデント レベル (2 つのスペース) 下げると、すべてが機能するはずです。

于 2012-10-26T04:39:54.277 に答える