分享
三行代码  ›  专栏  ›  技术社区  ›  tony sasa

在python中传递来自不同类的值

  •  0
  • tony sasa  · 技术社区  · 1 周前

    __init__ 属性。代码如下:(简化后的数据是矢量中的数值数据)

    class A:
        def __init__(self, k=3, tol=0.0001, max_iter=300):
            self.k = k
            self.tol = tol
            self.max_iter = max_iter
    
        def fit(self, data):
    
            self.centroids = {}
    
            for i in range(self.k):
                self.centroids[i] = data[i+50]
    
            for i in range(self.max_iter):
                self.classifications = {}
    
                for i in range(self.k):
                    self.classifications[i] = []
    
                for featureset in data:
                    distances = [np.linalg.norm(featureset - self.centroids[centroid]) for centroid in self.centroids]
                    classification = distances.index(min(distances))
                    self.classifications[classification].append(featureset)
                prev_centroids = dict(self.centroids)
    
                for classification in self.classifications:
                    self.centroids[classification] = np.average(self.classifications[classification], axis=0)
    
                optimized = True
    
                for c in self.centroids:
                    original_centroid = prev_centroids[c]
                    current_centroid = self.centroids[c]
                    if np.sum((current_centroid - original_centroid) / original_centroid * 100.0) > self.tol:
                        #print(np.sum((current_centroid - original_centroid) / original_centroid * 100.0))
                        optimized = False
    
                if optimized:
                    break
                
        def cluster_labels(self,data):
            cluster_labels = []
            for featureset in data:
                distances=[np.linalg.norm(featureset - self.centroids[centroid]) for centroid in self.centroids]
                cluster_labels.append(distances.index(min(distances)))
            return cluster_labels
    
    class B:
            x = np.linalg.norm(reduced_data-[1,1])
            k = (x-5)^2
            a = A()
            a.fit(reduced_data)
            y_pred = a.predict(reduced_data)
            labels = a.cluster_labels(reduced_data)
    

    基本上,我想把类B中的值k作为类A的属性传递给 def __init__(self, k=k in class B, tol=0.0001, max_iter=300):

    3 回复  |  直到 1 周前
        1
  •  1
  •   John Ladasky    1 周前

    快速回答:将B类的第三行改为: a = A(k=k)

    但问自己一个更基本的问题。为什么“B班”是个班?正如您所写的,它没有任何“自我”属性,所以它没有保留状态。你只需要计算一次yéu pred和标签。这些是类属性。

        2
  •  1
  •   b9s    1 周前

    __init__ 方法来创建该对象的新实例。

    a = A(k) .

    B

        3
  •  0
  •   go2nirvana    1 周前

    你的 A 没有属性 k ,但是 做。

    所以你要么 k 类属性 或者传递 A.k B 每次。