欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

k-means聚类

程序员文章站 2023-04-03 20:52:10
这里介绍一下简单的使用欧氏距离的kmeans思路: 1、确定n个中心点 2、计算每个点与中心点的距离 3、然后对每一个点的与n个中心点的距离进行比较,将点划分到距离最短的那个中心点簇中 4、此时以n个中心点形成n个簇 5、然后取这些簇中各个点的特征值的均值为新的中心点 6、重复2、3、4,迭代对应的次数,输出结果代码:#引入包,数据使用的是sklearn包中带的鸾尾花数据import numpy ......

这里介绍一下简单的使用欧氏距离的kmeans


思路:

       1、确定n个中心点

       2、计算每个点与中心点的距离

       3、然后对每一个点的与n个中心点的距离进行比较,将点划分到距离最短的那个中心点簇中

       4、此时以n个中心点形成n个簇

       5、然后取这些簇中各个点的特征值的均值为新的中心点

       6、重复2、3、4,迭代对应的次数,输出结果

代码:

#引入包,数据使用的是sklearn包中带的鸾尾花数据
import numpy as np
from matplotlib import pyplot as plt
from sklearn import datasets
from random import shuffle

#导入数据,data是花的特征数据,target是花的类型数据
data=datasets.load_iris().data
target=datasets.load_iris().target

#数据量
x=data.shape[0]
#特征值数
y=data.shape[1]
#打乱原始数据
index=np.arange(x)
shuffle(index)
data=data[index]
target=target[index]
#迭代次数
iter_num=10
#由于事先知道有3类,所以聚类中心数设置为3
centor_num=3
#取打乱后的数据的前3个作为初始聚类中心
centor_cd=data[:3,:]
#初始化距离矩阵,因为有x个点,3个聚类中心
dist=np.zeros((x,3))

#迭代次数
for i in range(iter_num):
    
    #循环遍历鸾尾花的特征数据
    for j in range(x):
        #获取距离
        distance=(data[j]-centor_cd)**2
        distance=np.sum(distance,axis=1)
        distance=np.sqrt(distance)
        #更新距离矩阵
        dist[j] = distance
    #获取算法结果
    cluster_id=np.argmin(dist , axis=1)
    #聚类错误的数量
    losess=np.sum(cluster_id != target)
    
    #更新聚类中心,采用每一次迭代生成簇的特征值的均值
    for k in range(centor_num):
        d=data[cluster_id==k]
        centor_cd[k]=np.mean(d,axis=0)

print("聚类成功")
print(cluster_id)

 

本文地址:https://blog.csdn.net/csefrfvdv/article/details/107490184

相关标签: 机器学习