• pdf下载(密码:7281)

  • 本文上接:【数据聚类】第三章第二节1:K-Means算法及其Python实现(距离度量方式、目标函数和算法流程)

  • 本文下接:【数据聚类】第三章第二节3:K-Means算法及其Python实现(性能分析、算法优缺点和K值的选择方法)


文章目录

  • 四:Python实现
  • 五:效果展示
    • (1)Iris数据集(较好)
    • (2)人造数据集(好)
    • (3)Jain数据集(较差)
    • (4)melon数据集(好)
    • (5)Spril数据集(差)
    • (6)threeCircles数据集(差)
    • (7)Square数据集(好)
    • (8)lineblobs数据集(差)
    • (9)788points数据集(差)
    • (10)gassian数据集(好)
    • (11)arrevation数据集(较差)
  • 所用数据集及可视化代码均在本专栏文章中给出

四:Python实现

算法代码

  • cluster:该列表用于标识某个数据点属于哪一个簇;例如cluster[3] = 2, cluster[252] = 1, cluster[26] = 2标识3、252、26号数据点分别属于簇2、1、2,很显然3号和26号数据点属于同一个簇
  • centroids:该列表用于记录质心,保存的是质心数据,便于在可视化时标记
import numpy as np'''
1:随机初始化k个质心
2:计算每个样本点到这k个质心的距离,然后把它们分配到距其最近的质心所在的簇中
3:针对每个簇,计算属于该簇的所有样本的均值作为新的质心
4:重复步骤2和3,直到质心不再发生变化
'''# 随机初始化质心
def centorids_init(data_set, k):examples_nums = np.shape(data_set)[0]  # 样本数量random_ids = np.random.permutation(examples_nums)  # 随机打乱序列centorids = data_set[random_ids[:k], :]  # 随机选取k质心return centorids# 计算距离实现划分
def compute_cluster(data_set, centorids):examples_nums = np.shape(data_set)[0]  # 样本数量centorids_nums = np.shape(centorids)[0]  # 质心数量cluster = np.zeros((examples_nums, 1))  # 返回结果for examples_index in range(examples_nums):distance = np.zeros(centorids_nums)  # 保存examples_index这个样本点到各质心点的距离for centorids_index in range(centorids_nums):distance[centorids_index] = np.sqrt(np.sum(np.power(data_set[examples_index, :]-centorids[centorids_index, :], 2)))cluster[examples_index] = np.argmin(distance)  # 最终在这些距离中选择出最小的一个return cluster# 用于更新质心
def renew_centoids(data_set, cluster, k):features_num = data_set.shape[1]  # 特征格式,即属性centorids = np.zeros((k, features_num))  # k个簇每个都要计算,且每个簇的点都有features_num个属性,所以要对应计算for centroid_id in range(k):closest_ids = cluster == centroid_id  # 不懂的话可以查阅 “Numpy布尔数组”相关内容centorids[centroid_id] = np.mean(data_set[closest_ids.flatten(), :], axis=0)return centorids# 算法主体
def k_means(data_set, k, max_iterations):examples_nums = np.shape(data_set)[0]  # 样本数量centorids = centorids_init(data_set, k)  # 随机选取k个质心cluster = np.zeros(examples_nums)  # 用于标识该样本点与那个质心最近,其本质就是划分的簇for _ in range(max_iterations):  # 不断迭代#  计算距离且分配cluster = compute_cluster(data_set, centorids)#  更新质心centorids = renew_centoids(data_set, cluster, k)return centorids, cluster

五:效果展示

(1)Iris数据集(较好)

import pandas as pd
import matplotlib.pyplot as plt
import KMeans2
import numpy as npIris_types = ['Iris-setosa', 'Iris-versicolor', 'Iris-virginica']  # 花类型
Iris_data = pd.read_csv('./Iris.csv')
x_axis = 'PetalLengthCm'  # 花瓣长度
y_axis = 'PetalWidthCm'   # 花瓣宽度
# x_axis = 'SepalLengthCm'  # 花萼长度
# y_axis = 'SepalWidthCm'  # 花萼宽度examples_num = Iris_data.shape[0]  # 样本数量
train_data = Iris_data[[x_axis, y_axis]].values.reshape(examples_num, 2)  # 整理数据# 归一化
min_vals = train_data.min(0)
max_vals = train_data.max(0)
ranges = max_vals - min_vals
normal_data = np.zeros(np.shape(train_data))
nums = train_data.shape[0]
normal_data = train_data - np.tile(min_vals, (nums, 1))
normal_data = normal_data / np.tile(ranges, (nums, 1))#  训练参数
k = 3  # 簇数
max_iterations = 50  # 最大迭代次数
centroids, cluster = KMeans2.k_means(normal_data, k, max_iterations)plt.figure(figsize=(12, 5), dpi=80)#  第一幅图是已知标签或全部数据
plt.subplot(1, 2, 1)for Iris_type in Iris_types:plt.scatter(Iris_data[x_axis], Iris_data[y_axis], c='black')
plt.title('raw')# 第二幅图是聚类结果
plt.subplot(1, 2, 2)
for centroid_id, centroid in enumerate(centroids):  # 非聚类中心current_examples_index = (cluster == centroid_id).flatten()plt.scatter(normal_data[current_examples_index, 0], normal_data[current_examples_index, 1])for centroid_id, centroid in enumerate(centroids):  # 聚类中心plt.scatter(centroid[0], centroid[1], c='red', marker='x')
plt.title('label kemans')
plt.show()

(2)人造数据集(好)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import KMeans2raw_data = pd.read_csv('./438-3.csv', header=None)
examples_num = raw_data.shape[0]
train_data = raw_data[[0, 1]].values.reshape(examples_num, 2)# 归一化
min_vals = train_data.min(0)
max_vals = train_data.max(0)
ranges = max_vals - min_vals
normal_data = np.zeros(np.shape(train_data))
nums = train_data.shape[0]
normal_data = train_data - np.tile(min_vals, (nums, 1))
normal_data = normal_data / np.tile(ranges, (nums, 1))
print(normal_data)#  训练参数
k = 3
max_iterations = 50
centroids, cluster = KMeans2.k_means(normal_data, k, max_iterations)plt.figure(figsize=(12, 5), dpi=80)# 第一幅图已知标签
plt.subplot(1, 2, 1)
plt.scatter(normal_data[:, 0], normal_data[:, 1], c='black')
plt.title('raw')# 第二幅图聚类结果
plt.subplot(1, 2, 2)
for centroid_id, centroid in enumerate(centroids):current_examples_index = (cluster == centroid_id).flatten()plt.scatter(normal_data[current_examples_index, 0], normal_data[current_examples_index, 1])for centroid_id, centroid in enumerate(centroids):plt.scatter(centroid[0], centroid[1], c='red', marker='x')
plt.title('k-Means')
plt.show()

(3)Jain数据集(较差)

  • 代码同(2)

(4)melon数据集(好)

  • 代码同(2)

(5)Spril数据集(差)

  • 代码同(2)

(6)threeCircles数据集(差)

  • 代码同(2)

(7)Square数据集(好)

  • 代码同(2)

(8)lineblobs数据集(差)

(9)788points数据集(差)

  • 代码同(2)

(10)gassian数据集(好)

(11)arrevation数据集(较差)

【数据聚类】第三章第二节2:K-Means算法及其Python实现(算法实现、结果展示)相关推荐

  1. 高红梅:第三章 第二节 身份焦虑与英雄梦

    第二节 身份焦虑与英雄梦 海明威一生都在世界各地旅行,其足迹遍及欧洲.非洲.美洲和亚洲,有世界公民的美誉.正如学者卡洛斯·贝克(Baker ,Carlos)所言,"早在他五十五岁荣获诺贝尔文 ...

  2. 初级会计实务--第三章第二节、应付及预收账款

    第二节.应付及预收账款 1.应付票据 指企业购买材料,商品和接受服务等而开出的承兑的商业汇票,包括商业承兑汇票和银行承兑汇票 商业承兑汇票 正常付款时:(1)购买原材料收到商业汇票借:原材料应交税费- ...

  3. Effective Modern C++ 第三章第二节,C++新特性

    Chapter 3-2: Moving to Modern C++ Item 11: Prefer deleted functions to private undefined ones C++中,有 ...

  4. 教资之教学知识与能力第三章第二节教学过程

    1,什么是教育过程呢? 教育过程有的本质是什么(重点是特殊性) 2,教学过程中也是有规律的,有哪些基本规律呢? 教学过程的结构的五个基本阶段是哪五个 1,a 教学过程: 是教师的教和学生的所构成的一种 ...

  5. 第四章第二节数据资产盘点-数据资产盘点方法伦

    第四章第二节数据资产盘点-数据资产盘点方法伦 数据资产盘点可以通过业务角度的自上而下演绎和数据角度的自下而上归纳对数据资产进行盘点,编制数据资产目录 ,如图所示: 自上而下的演绎,是确保数据资产目录可 ...

  6. 第二节认识计算机教案,第二章 第二节 局域网的构建 教学设计_博客

    <第二章 第二节 局域网的构建 教学设计_博客>由会员分享,可在线阅读,更多相关<第二章 第二节 局域网的构建 教学设计_博客(3页珍藏版)>请在装配图网上搜索. 1.第二章 ...

  7. 【文献阅读】翻译王军武老师的文献--《稠密气固流的连续理论现状回顾》三、第二节 气固流态化的多尺度模拟

    2. 气固流态化的多尺度模拟 流化床中的气固流动出了名的难以建模.这主要是由于物理定律所在的微尺度与介尺度之间,乃至于与我们希望理解的宏观现象之间的时空鸿沟的存在.这一鸿沟的存在意味着给出多尺度模拟策 ...

  8. 工程项目管理丁士昭第二版_2021年软考系统集成项目管理工程师知识点预习第十四章第二节...

    听说99%的同学都来这里充电吖 为了方便大家尽早投入2021年的软考考试备考中,我们已开始连载<系统集成项目管理工程师>知识点,今天带来的是 第十四章 第二节 编制询价~ 知识点:第十四章 ...

  9. 哥伦比亚大学 NLP 第三章(第二部分)

    哥伦比亚大学 NLP 第三章(第二部分) 目录 概率上下文无关 CKYCKYCKY 算法 本部分关于上下文无关相关符号的约定均基于第一部分,本部分将继续沿用不再定义 第三章第一部分传送门:https: ...

最新文章

  1. 怎样提高自己的团队合作能力
  2. [工具]sublime text2-前端开发利器
  3. Linux脚本实战之猜数字
  4. j@2ff4f00f_J4F的完整形式是什么?
  5. Java core 包_feilong-core 让Java开发更简便的工具包
  6. 华为砸数十亿美金作为奖励 刺激员工信心
  7. php larval 项目部署,Laravel项目部署到线上需要注意的问题
  8. SAP License:段的含义
  9. 鸟书shell 学习笔记(一) shell专注于概念和命令
  10. 要看方兴东的博客 只能上Google去找他
  11. Lucene 索引维护 之 删除 与 更新 文档
  12. 3.PS 缩小放大、移动、选区工具
  13. ps自动,批处理,替换原文件夹图片
  14. #10098. 「一本通 3.6 例 1」分离的路径
  15. 从青蒿素说一下专利与知识产权[更新]
  16. win中使用labelImg标注图片
  17. 微命令、微操作、微指令、微程序
  18. IMSI前5位对应移动运营商名称的列表
  19. 转转代扣“支付通道费”被“放大”背后,二手交易的命门是什么?
  20. 快醒醒吧!数据库mysql外文参考文献

热门文章

  1. 【华为机考】俄罗斯方块详解——图文并茂,绘声绘色
  2. 【HTML】表格的跨行跨列
  3. 【漫画CPU】 第二章 数字运算------逻辑运算
  4. 面试了一个 31岁的iOS开发者,思绪万千,30岁以上的程序员还有哪些出路?
  5. QQ网页强制聊天,微博一键关注
  6. 《缠中说禅108课》38:走势类型连接的同级别分解
  7. 学习NBA球衣配色做页面配色设计
  8. 转:宇文泰苏卓对答录
  9. 星环科技ArgoDB 3.2正式发布,全面升级易用性、性能和安全
  10. Java与数据库连接——JDBC(JDBC概念理解+JDBC搭建使用六步骤,作者君倾情奉上,爆赞!)