一种使用Python自实现KMeans++聚类算法的写法

本文介绍了如何运用KMeans进行数据聚类,通过Python实现KMeans++初始化并展示聚类效果。首先,讲解了KMeans聚类的基本原理,并推荐了相关学习资源。接着,展示了数据集的加载和预处理,使用KMeans算法进行聚类,并通过PCA进行降维以便于可视化。最后,利用matplotlib绘制了原始数据和预测聚类结果的散点图,呈现了聚类效果。
摘要由CSDN通过智能技术生成

失踪人口回归


前言

最近学的内容主要是Python,内容比较杂:numpy,pandas,PyQt,数据挖掘等等,正好找个机会写个小项目练练手。

先上效果图,(项目链接在文章最后):

项目演示


提示:以下是本篇文章正文内容

一、关于KMeans聚类以及KMeans++的原理?

网上介绍这个最最基本的聚类方法的教程和视频等实在太多了,不便啰嗦。

推荐两个:

1、【机器学习】K-means(非常详细)这篇文章偏数学逻辑,建议反复阅读

2、什么是 K-Means(K均值聚类)?【知多少】这是个视频,简单易懂地理解KMeans的原理

二、核心内容

1、数据集介绍

链接:https://pan.baidu.com/s/1Se-RrBko7v-UdMvTK_I77g
提取码:ygtl
数据集
特征量有十维,target为聚类目标量,可用来后期校验结果正确性

2、核心代码

import numpy as np
import pandas as pd
import random

# 读取数据
read_df = pd.read_csv('text_datas.csv')
target = read_df.iloc[:, -1]
data = read_df.iloc[:, 1:-1]

k = 7
n = data.shape[0]
dis = np.zeros([n, k + 1])

# 随机选取中心
center = np.array([data.iloc[random.randint(0, n - 1), :]])
while center.shape[0] <= k - 1:
    temp_dis = np.zeros([n, center.shape[0]])
    # 求样本点到聚类中心点的距离
    for i in range(center.shape[0]):
        temp_dis[::, i] = ((data - center[i]) ** 2).sum(axis=1)
    # 计算其和最近的一个“种子点”的距离
    D = np.min(temp_dis, axis=1)
    # 把这些距离加起来,取一个能落在其中的随机值R
    R = random.uniform(0, D.sum())
    for i in range(D.shape[0]):
        R -= D[i]
        if R <= 0:
            break
    # 此时的点就是下一个“种子点”
    center = np.append(center, np.array([data.iloc[i, :]]), axis = 0)

iter_ = 500

while iter_ > 0:
    # 求样本点到聚类中心点的距离
    for i in range(center.shape[0]):
        dis[::, i] = ((data - center[i]) ** 2).sum(axis=1)
    # 归类
    dis[:, -1] = np.argmin(dis[:, :-1], axis=1)
    # 求新的聚类中心
    new_center = np.zeros_like(center)
    for j in range(k):
        new_center[j, :] = data.values[dis[:, -1] == j, :].mean(axis=0)

    # 如果点簇不再变动
    if (center==new_center).all():
        break

    center = new_center
    iter_ -= 1

print('循环{}次'.format(500-iter_))

#pca降维
from sklearn.decomposition import PCA

pca = PCA(n_components=2)
newData = pca.fit_transform(data)
newData = pd.DataFrame(newData)

# 可视化
import matplotlib.pyplot as plt
x = np.array(newData.iloc[:, 0])
y = np.array(newData.iloc[:, 1])

# 原数据
plt.subplot(2,1,1)
plt.scatter(x, y, c=np.array(target))
# 预测数据
plt.subplot(2,1,2)
plt.scatter(x, y, c=dis[:, -1])
plt.show()

运行结果截图:
运行截图

3、完整项目

对核心代码做“亿点点”的改造和包装之后就做成了文章开头的样子,截图如下:
实验截图
项目完整代码下载链接:

点击跳转


结语

创作不易,如果您觉得写得还行,还请点赞、评论、收藏走一波。
在这里插入图片描述

  • 9
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论
Python使用K-Means聚类算法时,选择最佳的聚类数目是很重要的。有几种常用的方法可以帮助确定最佳聚类数目。 一种常用的方法是通过手肘法来确定最佳聚类数目。手肘法通过计算聚类内部每个点与聚类中心的距离之和(SSE)来评估聚类的性能。随着聚类数目的增加,SSE会逐渐减小,但当聚类数目增加到一定程度后,SSE的下降速度会变得较慢。因此,可以选择SSE开始下降变缓的拐点作为最佳聚类数目。当聚类数目增加时,拐点之后的SSE的变化较小,这表明增加聚类数目对聚合程度的影响较小。 另一种常用的方法是使用轮廓系数来选择最佳聚类数目。轮廓系数是一种衡量聚类结果的质量的指标,取值范围在[-1, 1]之间。对于每个数据点,轮廓系数计算了它与所属聚类中心的相似度,以及它与其他聚类中心的不相似度。最佳聚类数目应该使得轮廓系数最大。较大的轮廓系数表示数据点与其所属聚类更相似,而与其他聚类不相似。 综上所述,选择最佳聚类数目可以使用手肘法或轮廓系数方法。手肘法通过拐点确定最佳聚类数目,而轮廓系数方法通过最大化轮廓系数来选择最佳聚类数目。具体选择哪种方法可以根据具体情况和数据集特点来决定。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [聚类算法KmeansKmeans++算法精讲](https://blog.csdn.net/weixin_43334693/article/details/130264220)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [python聚类算法kmeans/kmeans++最佳聚类数目选择](https://blog.csdn.net/Jiiaaaoooo/article/details/89424475)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [[python] Kmeans文本聚类算法+PAC降维+Matplotlib显示聚类图像源码](https://download.csdn.net/download/eastmount/9410810)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

远哥挺乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值