python sklearn 的k-means聚类易懂实例

    使用sklearn库来进行k-means聚类十分简单,官网的教程是挺好的。但其他地方的一些例子和教程则很多都是要么只是写给作者自己看的,要么是代码不能直接运行的。这里我写这篇文章,用尽量简单的易懂方式来封装k-means代码:

 

    首先创建一个kmeans.py文件,这个文件是k-means算法的封装文件,里面就定义一个函数,用于利用sklearn库来进行k-means聚类,代码如下:

# -*- coding: utf-8 -*-
"""
@author Bin
Created on Tue Feb 27 14:24:29 2018

sklearn k-means聚类实用封装库
用法:传入的参数均为list类型,x1为x坐标,x2为y坐标,types_num为聚类数,types为各类的名称,colors为各类点的颜色,shapes为各类点的形状
返回一个kmeans_model对象,其labels_属性记录着聚类的标签(如0,1,2等),cluster_centers_属性记录着聚类的中心
另外也返回聚类后的x1_result和x2_result对象,x1_result记录着原x1列表的聚类结果,
    即x1_result列表中有n个元素(n为聚类数),其中每个元素都是一个列表(原x1列表中属于该类的所有元素组成的列表)
x2_result同上
"""

import numpy as np  
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

def kmeans_building(x1,x2,types_num,types,colors,shapes):
    X = np.array(list(zip(x1, x2))).reshape(len(x1), 2)  
    kmeans_model = KMeans(n_clusters=types_num).fit(X) # 设置聚类数n_clusters的值为types_num
    # 整理分类好的原始数据, 并画出聚类图
    x1_result=[]; x2_result=[]
    for i in range(types_num):
        temp=[]; temp1=[]
        x1_result.append(temp)
        x2_result.append(temp1)
    for i, l in enumerate(kmeans_model.labels_):  # 画聚类点
        x1_result[l].append(x1[i])
        x2_result[l].append(x2[i])
        plt.scatter(x1[i], x2[i], c=colors[l],marker=shapes[l])
    for i in range(len(list(kmeans_model.cluster_centers_))): # 画聚类中心点
        plt.scatter(list(list(kmeans_model.cluster_centers_)[i])[0],list(list(kmeans_model.cluster_centers_)[i])[1],c=colors[i],marker=shapes[i],label=types[i])
    plt.legend()
    return kmeans_model,x1_result,x2_result

 

    然后创建一个test.py文件来调用上面封装好的函数:

import matplotlib.pyplot as plt
import kmeans


plt.figure(figsize=(8, 6))
x1 = [1, 2, 3, 1, 5, 6, 5, 5, 6, 7, 8, 9, 7, 9] # x坐标列表
x2 = [1, 3, 2, 2, 8, 6, 7, 6, 7, 1, 2, 1, 1, 3] # y坐标列表
colors = ['b', 'g', 'r'] # 颜色列表,因为要分3类,所以该列表有3个元素
shapes = ['o', 's', 'D'] # 点的形状列表,因为要分3类,所以该列表有3个元素
labels=['A','B','C'] # 画图的标签内容,A, B, C分别表示三个类的名称
kmeans_model,x1_result,x2_result=kmeans.kmeans_building(x1, x2, 3, labels, colors, shapes) # 本例要分3类,所以传入一个3
print(kmeans_model) 
print(x1_result) 
print(x2_result)

 

    运行效果:

KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,
n_clusters=3, n_init=10, n_jobs=1, precompute_distances='auto',

    random_state=None, tol=0.0001, verbose=0)

[[5, 6, 5, 5, 6], [7, 8, 9, 7, 9], [1, 2, 3, 1]]
[[8, 6, 7, 6, 7], [1, 2, 1, 1, 3], [1, 3, 2, 2]]

函数返回的x1_result和x2_result便是将原始数据分好类后的数据集。

  • 6
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
以下是Python实现K-Means聚类的代码示例: ```python import numpy as np from matplotlib import pyplot as plt # 生成数据点 X = np.array([[1, 2], [1.5, 1.8], [5, 8], [8, 8], [1, 0.6], [9, 11]]) # 设定初始聚类中心 centroids = np.array([[1, 0.6], [1.5, 1.8], [5, 8]]) # 定义距离函数 def euclidean_distance(x1, x2): return np.sqrt(np.sum((x1 - x2) ** 2)) # 定义K-Means函数 def k_means(X, k=3, max_iters=100): # 随机初始化聚类中心 idx = np.random.choice(len(X), k, replace=False) centroids = X[idx] # 迭代更新聚类中心 for i in range(max_iters): # 分配数据点到最近的聚类中心 clusters = [[] for _ in range(k)] for x in X: distances = [euclidean_distance(x, c) for c in centroids] cluster_idx = np.argmin(distances) clusters[cluster_idx].append(x) # 计算新的聚类中心 new_centroids = [] for c in clusters: mean = np.mean(c, axis=0) new_centroids.append(mean) new_centroids = np.array(new_centroids) # 判断是否收敛 if np.all(centroids == new_centroids): break centroids = new_centroids return centroids, clusters # 调用K-Means函数 centroids, clusters = k_means(X, k=3) # 可视化聚类结果 colors = ['r', 'g', 'b'] for i, c in enumerate(clusters): for x in c: plt.scatter(x[0], x[1], color=colors[i]) plt.scatter(centroids[:,0], centroids[:,1], marker='*', s=200, color='black') plt.show() ``` 运行上述代码,可以得到类似于以下图像的聚类结果: ![K-Means聚类结果](https://img-blog.csdn.net/20180721090548206?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2JqMjM4NzA1MjYwNjg=//font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/80)

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值