问题2:KMeans聚类算法代码实现?
0 488
0
该提问暂无详细描述
收藏
2021-01-17 20:36 更新 空心人 •  2542
共 1 个回答
高赞 时间
0

步骤: 1.首先输入一个合适的k值,即希望将数据集分成k个分组。 2.从数据集中随机选择k个数据点作为质心 3.对集合中的每个点,计算与质心的距离(欧式距离法),离哪个质心最近,就属于哪个分组。 4.这时从数据集中重新选择一个新的质心。 5.如果新的质心和以前的质心距离小于一定的阈值,可以认为我们进行的聚类算法已经达到期望的结果,算法终止。 6.如果距离差距过大,需要继续迭代 import random import pickle from matplotlib import pyplot as plt from functools import reduce

def dot(v): return sum(vi*vi for vi in v ) #求解向量的内积 def squared_distance(x1,x2): foo=[x1i-x2i for x1i,x2i in zip(x1,x2)]#用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。 sq_dis = dot(foo) return sq_dis #q求解两个向量之间的距离

def vector_add(v,w): return [float(v_i+w_i) for v_i,w_i in zip(v,w)] #两个向量加和

def vector_sum(vectors): return reduce(vector_add,vectors) #对于一个簇内所有的元素进行求和

def vectors_mean(vectors): v_line = float(len(vectors)) v_sum = vector_sum(vectors) return [v_sum_i/v_line for v_sum_i in v_sum] #求一个簇的中心 class KMeans: def init(self,k): self.k = k self.means = None self.assgin = None def classify(self,input): return min(range(self.k),key = lambda i:squared_distance(input,self.means[i])) def train(self,input): self.means = random.sample(input,self.k) assignments=None for i in range(10): new_assignments=list(map(self.classify,input))

        if assignments== new_assignments:
            self.assgin=assignments
            return

        assignments = new_assignments

        for i in range(self.k):
            i_points = [p for p,a in zip(input,assignments) if a==i]

            if i_points:
                self.means[i] = vectors_mean(i_points)

收藏
2021-01-17 20:39 更新 小眼的铁板烧 •  2910