k_means聚类算法简单代码实现

import numpy as np
from sklearn import datasets

#1.导入数据,需要其所有的特征数据,target数据为计算聚类准确度
def load_iris_data():
    #导入数据集,结构为[data:特征,target:类别,target_name:类别对应名称]
    #数据量为150个数据点,每个数据点对应4维特征,和一个类别,类别为0,1,2
    iris = datasets.load_iris()
    #将data特征传入x
    x = iris.data
    #将target类别传入y
    y = iris.target
    return x, y

def get_index(x_center, X_data):
    min_dis = 100000
    min_index = 0
    for m in range(len(x_center)):

        # print(m)
        # print(X_data[j], x_center[m])

        # 6.在第三层循环中,计算每个数据点到每个中心的距离
        # 使用曼哈顿为distance = np.sum(np.abs(x_center - x_data))
        # 使用欧几里得为distance = np.sqrt(np.sum((x_center - x_data) ** 2))
        distance = np.sum(np.abs(x_center[m] - X_data[j]))
        if distance < min_dis:
            min_dis = distance
            min_index = m
        # print(distance)
    return min_index


#1.导入数据,调用load_iris_data函数
X_data, y_target = load_iris_data()

#2.确定k值,随机选取k个数据点特征作为初始center
#使用np.random.permutation函数,打乱顺序,随机排列序列。
k = 3
a = 0.000001
#np.random.seed(1)
i = np.random.permutation(X_data.shape[0])
x_center = X_data[i[:k]]
#print(x_center)
#print(y_target[[2, 76, 112]])
#print(np.array([y_target[2], y_target[76], y_target[112]]))

#3.确定最大聚类迭代次数,外层for循环,即聚类迭代次数循环
max_num = 5000
for i in range(max_num):
    if i % 500 == 0:
        print(i)
    #4.第二层循环,循环所有的数据点
    #初始化聚类簇的列表或者字典
    #初始化聚类结果列表
    label_list = []
    for j in range(len(x_center)):
        # print(len(x_center))
        label_list.append([])
        # print(label_list)
    y_test = []
    for j in range(X_data.shape[0]):#150
        print(j)
        print(X_data[j])
        #5.第三层循环,循环所有的中心

        #print(min_index)
        #print(label_list)
        min_index = get_index(x_center, X_data)
        #7.计算其最小的距离,将该数据点分为该中心点的类别中
        label_list[min_index].append(X_data[j])
        y_test.append(min_index)
    #print(len(label_list))
    #print(label_list[1])

    #8.计算各新的中心点,使用np.mean(),通过for循环簇个数
    x_center_new = []
    for j in range(len(label_list)):#3
        x_center_new.append(np.mean(np.array(label_list[j]), axis=0))
    x_center_new = np.array(x_center_new)
    #print(x_center_new)
    #9.计算新中心点与老中心点是否变化超过阈值,超过即停止
    if np.mean(np.abs(x_center_new-x_center)) <= a:
        break

#10.返回结果列表
print(np.array(y_test))

#11.emtropy熵值和purity纯度

结果:

0
500
1000
1500
2000
2500
3000
3500
4000
4500
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 2 2 2 1 2 1 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2
 2 1 1 1 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 1 1 1 2 1 1 1 1
 1 1 2 1 1 1 1 1 2 1 2 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 2 1 1 1 2 1
 1 1]

草稿:

# k_means
import numpy as np
from sklearn import datasets
from sklearn.datasets import load_iris
x = datasets.load_iris().data
y = datasets.load_iris().target
z = datasets.load_iris().target_names
# print(load_iris())
i = np.random.permutation(x.shape[0])
print(i)
en = x[i[:3]]
print(en)
# print(np.random.permutation(x.shape[0]))

print(x)
print(y)
print(z)

草稿结果:

[ 32  30  50  96  44 103 145 110  99 124  48  15  23  61  28  71  46  16
 127  39  67  69  45  55  10 138 108 111  38  92  33 143  74  19  80  35
  87 139  25  53 137   9 146  11 133 135  42  68 123  82  37  72  54  21
 114 100  22 122  14 120  62  13 115 148  77  41   8 131 140 144 119  43
  57 112 141  95   1  93 121  18  31  12  86  84  66  88  73 128  83 118
  49   0  20  89  63 147  75  64  90  78  97  65  91  34 129 125 105 130
  98 149 101  60 134   2 107  29  70  47   6   7 116 126  59 109  36 104
  52 136 142  76   4  58   3  24  94  85  56  40  26 117   5  79 106  81
 113  51 102  17 132  27]
 
[[5.2 4.1 1.5 0.1]
 [4.8 3.1 1.6 0.2]
 [7.  3.2 4.7 1.4]]
 
[[5.8 2.7 5.1 1.9]
 [6.8 3.2 5.9 2.3]
 [6.7 3.3 5.7 2.5]
 [6.7 3.  5.2 2.3]
 [6.3 2.5 5.  1.9]
 [6.5 3.  5.2 2. ]
 [6.2 3.4 5.4 2.3]
 [5.9 3.  5.1 1.8]]#此处x有150行,部分省略
 
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 2 2]
 
['setosa' 'versicolor' 'virginica']
#以上代码用换行分开,方便浏览
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值