python手写K-means实现二维聚类

欢迎来到海小皮的CSDN博客
今天人工智能的实验,简单学习了K-means的二维聚类,在这里介绍给大家,注释非常详细哦!
1、思路介绍
这个方法理解起来不是特别的难,首先我来介绍一下基本思路,我以比较通俗易懂的比喻来讲解:
(1)现在往地面上撒了一把豆子(随机散布),每个豆子有自己的二维坐标(两个维度的变量)
(2)首先随机选K个豆子作为初始的代表人物(初始中心点),他们代表了各自的团体(聚类子集)
(3)每个豆子都计算自己到各个代表人物间的距离,加入距离自己最近的代表人物的团队,得到初始聚类
(4)计算每一个聚类子集的中心点,选出新的代表人物(新的中心点)
(5)重复(3)(4)步,直到聚类不再发生变化

2、代码参考

import numpy as np
import random as rd
import matplotlib.pyplot as plt

# 测试数据
TEST = [(1,7),(2,6),(3,5),(8,1.5),(7,2.5),(1,1),(9,6),(3,8),(0.5,4),(5,3.2),(2,2),(4,3),(5,4),(4,2),(5,3),(2,1)]
# 药品数据
Yao_list = [(1,1),(2,2),(4,3),(5,4)]

# 获取初始聚类点
def get_init_center(raw_data,k):
    return rd.sample(raw_data,k)

# 计算距离
def cal_distance(x,y):
    return np.linalg.norm(np.array(x)-np.array(y))

# 分簇
def divid_cluster(center,raw_data):
    cluster = [] # 创建聚类的集合
    # 创建聚类的子集 数量等于中心点数
    for i in range(len(center)):
        cluster.append([])
    dis = 0.0 # 初始化距离
    # 取出每一个点进行距离判断
    for node in raw_data:
        dis_min = float('inf') # 重新初始化距离最小值
        flag = -1 # 重新初始化位置标志位
        # 与每一个center计算距离 找到最短
        for item in center:
            dis = cal_distance(node,item)
            if(dis < dis_min):
                dis_min = dis # 更新最小值
                flag += 1
        
        # 将node添加到对应的聚类子集
        if flag != -1 :
            cluster[flag].append(node)
    return cluster

# 计算新的中心点
def cal_new_cnter(cluster_son):
    x_sum ,y_sum =0,0#初始化
    for node in cluster_son:
        x_sum += node[0]
        y_sum += node[1]
    # 创建tuple
    re_center = (x_sum/len(cluster_son),y_sum/len(cluster_son))
    return re_center

# 开始
K = 2 # 聚类的集合数
Raw_data = TEST # 选取二维数据集合
Linit_stop = 5000
# 随机选择 k个点作为初始中心点
init_center = get_init_center(Raw_data,K)

print('init centers',init_center)

# 进行聚类初始化
init_cluster =  divid_cluster(init_center,Raw_data)

print('init clusters',init_cluster)

old_cluster = init_cluster
new_cluster = []
count = 0
while True:
    count += 1
    new_centers = []
    # 计算新的聚类子集中心点
    for item in old_cluster:
        temp_center = cal_new_cnter(item) # 计算子集中心点
        new_centers.append(temp_center) # 放入新的中心点集合
    print(count,'new centers',new_centers)

    # 根据新的中心点进行迭代
    new_cluster = divid_cluster(new_centers,Raw_data)
    print(count,'new cluster',new_cluster)

    if new_cluster == old_cluster:
        break
    else:
        old_cluster = new_cluster

    if count == Linit_stop:
        break

# 画图
x = []
y = []
count = 0
for item in old_cluster:
    x = []
    y = []
    count += 1
    for node in item:
        x.append(node[0])
        y.append(node[1])
    if count == 1:
        # 聚类
        plt.scatter(x,y,s=5,c='b')
        # 中心
        plt.scatter(new_centers[0][0],new_centers[0][1],s=50,c='y')
    elif count == 2:
        # 聚类
        plt.scatter(x,y,s=20,c='r')
        # 中心
        plt.scatter(new_centers[1][0],new_centers[1][1],s=50,c='g')

plt.show()

因为初始中心点是随机选择的,所以每次的聚类结果基本上是不同的,所以你运行的结果未必和我的相同
TEST的运行结果
测试数据药品分类数据的运行结果
药品分类欢迎互相交流,初次学习,多多指教!
如果有帮助麻烦点个赞再走蛤!

  • 8
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
好的,我可以为您介绍一下Python中如何实现k-means和DBSCAN算法的聚类分析。 首先,我们需要导入一些必要的库,包括numpy、sklearn、matplotlib等,可以使用以下代码进行导入: ```python import numpy as np from sklearn.cluster import KMeans, DBSCAN import matplotlib.pyplot as plt ``` 然后,我们可以使用numpy生成一些随机数据,用于聚类分析的演示。例如,我们生成一个包含100个样本,每个样本有2个特征的数据集,代码如下: ```python X = np.random.rand(100, 2) ``` 接下来,我们可以使用KMeans类实现k-means算法的聚类分析。KMeans类需要指定聚类的数量(即k值),然后使用fit方法对数据进行聚类。示例如下: ```python kmeans = KMeans(n_clusters=3) kmeans.fit(X) ``` 聚类完成后,我们可以使用matplotlib展示聚类结果。具体来说,我们可以使用不同的颜色表示不同的聚类,示例如下: ```python labels = kmeans.labels_ plt.scatter(X[:, 0], X[:, 1], c=labels) plt.show() ``` 至此,我们就完成了使用KMeans类实现k-means算法的聚类分析。完整代码如下: ```python import numpy as np from sklearn.cluster import KMeans, DBSCAN import matplotlib.pyplot as plt # 生成随机数据 X = np.random.rand(100, 2) # k-means聚类分析 kmeans = KMeans(n_clusters=3) kmeans.fit(X) # 可视化聚类结果 labels = kmeans.labels_ plt.scatter(X[:, 0], X[:, 1], c=labels) plt.show() ``` 接下来,我们可以使用DBSCAN类实现DBSCAN算法的聚类分析。DBSCAN类需要指定eps和min_samples两个参数,其中eps表示邻域的大小,min_samples表示邻域中最少包含的样本数。然后使用fit方法对数据进行聚类。示例如下: ```python dbscan = DBSCAN(eps=0.3, min_samples=5) dbscan.fit(X) ``` 聚类完成后,我们同样可以使用matplotlib展示聚类结果。不同的聚类可以使用不同的颜色表示,而噪声点可以使用黑色表示,示例如下: ```python labels = dbscan.labels_ colors = ['b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'] for i in range(-1, np.max(labels)+1): color = colors[i % len(colors)] if i == -1: color = 'k' plt.scatter(X[labels==i, 0], X[labels==i, 1], c=color) plt.show() ``` 至此,我们就完成了使用DBSCAN类实现DBSCAN算法的聚类分析。完整代码如下: ```python import numpy as np from sklearn.cluster import KMeans, DBSCAN import matplotlib.pyplot as plt # 生成随机数据 X = np.random.rand(100, 2) # DBSCAN聚类分析 dbscan = DBSCAN(eps=0.3, min_samples=5) dbscan.fit(X) # 可视化聚类结果 labels = dbscan.labels_ colors = ['b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'] for i in range(-1, np.max(labels)+1): color = colors[i % len(colors)] if i == -1: color = 'k' plt.scatter(X[labels==i, 0], X[labels==i, 1], c=color) plt.show() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值