Kmeans聚类算法在python下的实现--附测试数据

Kmeans算法

1:随机初始化一个聚类中心

2:根据距离将数据点划分到不同的类中

3:计算代价函数

4:重新计算各类数据的中心作为聚类中心

5:重复2-4步直到代价函数不发生变化

测试数据:

X Y
-1.26 0.46
-1.15 0.49
-1.19 0.36
-1.33 0.28
-1.06 0.22
-1.27 0.03
-1.28 0.15
-1.06 0.08
-1.00 0.38
-0.44 0.29
-0.37 0.45
-0.22 0.36
-0.34 0.18
-0.42 0.06
-0.11 0.12
-0.17 0.32
-0.27 0.08
-0.49 -0.34
-0.39 -0.28
-0.40 -0.45
-0.15 -0.33
-0.15 -0.21
-0.33 -0.30
-0.23 -0.45
-0.27 -0.59
-0.61 -0.65
-0.61 -0.53
-0.52 -0.53
-0.42 -0.56
-1.39 -0.26

python代码:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#---------------数据读入-------------------
Df = pd.read_table('D:/22.txt')
DataSet = Df.as_matrix(columns=None)
Rows_i,Dim_j = DataSet.shape

#--------欧式距离函数----------------
euclidean_Metric = np.linalg.norm
#-----随机初始化聚类中心------------------------
def init_Center(DataSet,k):
    Center = np.zeros((k, Dim_j))
    for j in range(k):
        n_index = np.random.random_integers(0, Rows_i)
        Center[j, :] = DataSet[n_index, :]
    return Center, k
#---------------根据距离将数据分成不同的类-------------
#cluster_Data第一列是类别代码,第二列是距离聚类中心距离的平方
def cluster_Set(Center, k):
    cluster_Data = np.zeros((Rows_i, 2))
    for i in range(Rows_i):
        class_index = 0
        for j in range(k):
            temp1 = euclidean_Metric(DataSet[i, :]-Center[j, :])
            temp2 = euclidean_Metric(DataSet[i, :]-Center[class_index, :])
            if temp1 < temp2:
                class_index = j
        cluster_Data[i, 0] = class_index
        cluster_Data[i, 1] = temp2**2
    return cluster_Data

#---------------把各类的质心作为新的聚类中心-------------
def center_Update(cluster_data, Center, k):
    for j in range(k):
        get_Data = DataSet[np.nonzero(cluster_data[:, 0]==j)[0]]
        Center[j, :] = np.mean(get_Data, axis= 0)
    return Center

#---------------代价函数为各类到中心距离的平方和-------------
def cost_f(cluster_Data):
    cost = sum(cluster_Data[:,1 ])
    return cost

#-----------------作为4类的分类显示----------------------------------
def show(DataSet, cluster_Data):
    df = pd.DataFrame(DataSet, index=cluster_Data[:,0], columns=['x1','x2'])
    df1 = df[df.index==0]
    df2 = df[df.index==1]
    df3 = df[df.index==2]
    df4 = df[df.index==3]
    plt.figure(figsize=(10,8), dpi=80)
    axes = plt.subplot()
    type1 = axes.scatter(df1.loc[:,['x1']],  df1.loc[:,['x2']], s=50, c='red', marker='d')
    type2 = axes.scatter(df2.loc[:,['x1']], df2.loc[:,['x2']], s=50, c='green', marker='*')
    type3 = axes.scatter(df3.loc[:,['x1']], df3.loc[:,['x2']], s=50, c='brown', marker='p')
    type4 = axes.scatter(df4.loc[:,['x1']], df4.loc[:,['x2']], s=50, c='black')
    type_center = axes.scatter(Center[:,0], Center[:,1], s=40, c='blue')
    plt.xlabel('x', fontsize=16)
    plt.ylabel('y', fontsize=16)
    axes.legend((type1, type2, type3, type4, type_center),('0','1','2','3','center'), loc=1)
    plt.show()

#----------------------主程序------------------------------
Center,k = init_Center(DataSet, 4)
cost = 100000
cost_temp = 1
while cost_temp != cost:  # 代价函数不变时停止
    cost_temp = cost
    cluster_Data = cluster_Set(Center, k)   #   根据距离将数据点划分到不同的类中
    show(DataSet, cluster_Data)             #   显示一次分类结果
    cost = cost_f(cluster_Data)            #   计算代价函数
    print(cost)
    Center = center_Update(cluster_Data, Center, k)  #   重新计算各类数据的中心作为聚类中心



输出结果:








评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值