机器学习第八周-kmeans算法

算法简介

由于具有出色的速度和良好的可扩展性,Kmeans聚类算法算得上是最著名的聚类方法。Kmeans算法是一个重复移动类中心点的过程,把类的中心点,也称重心(centroids),移动到其包含成员的平均位置,然后重新划分其内部成员。k是算法计算出的超参数,表示类的数量;Kmeans可以自动分配样本到不同的类,但是不能决定究竟要分几个类。k必须是一个比训练集样本数小的正整数。有时,类的数量是由问题内容指定的。例如,一个鞋厂有三种新款式,它想知道每种新款式都有哪些潜在客户,于是它调研客户,然后从数据里找出三类。也有一些问题没有指定聚类的数量,最优的聚类数量是不确定的。后面我将会详细介绍一些方法来估计最优聚类数量。

Kmeans的参数是类的重心位置和其内部观测值的位置。与广义线性模型和决策树类似,Kmeans参数的最优解也是以成本函数最小化为目标。Kmeans成本函数公式如下:

步骤

输入是样本集,聚类的簇树k,最大迭代次数N

    输出是簇划分

    1) 从数据集D中随机选择k个样本作为初始的k个质心向量:

    2)对于n=1,2,...,N

      a) 将簇划分C初始化为

      b) 对于i=1,2...m,计算样本和各个质心向量的距离,将标记最小的为所对应的类别。此时更新

      c) 对于j=1,2,...,k,对中所有的样本点重新计算新的质心

      e) 如果所有的k个质心向量都没有发生变化,则转到步骤3)

    3) 输出簇划分

算法实现


import pandas as pd

import numpy as np

import random

#计算聚簇中心

def reCent(inpudata):

mu=np.mean(inpudata, axis=0) # axis=0,计算每一列的均值

return mu

#计算距离

def distance(x,y):

distance=np.dot(x,y.T)

return distance

def knn(inputdata,k):

#随机选择聚簇中心

    cxin=[]

    y=[]

    n=random.sample(range(len(inputdata)), k)

    for i in n:

        cxin.append(inputdata[i])

    cxin=np.array(cxin)

    #计算距离

    n=0

    for x in inputdata:

        d=[distance(x,j) for j in cxin]

        y.append(d.index(min(d))) 

        n+=1

        for jb in range(n):

            if y[jb]==y[-1]:

                test=np.array([inputdata[jb],cxin[y[-1]]])    #更换

        cxin[y[-1]]=reCent(test)

你可能感兴趣的:(机器学习第八周-kmeans算法)