聚类算法—K-means python实现
k-means
- k-means是一种最流行的聚类算法,属于无监督学习
- k-means可以将数据集分为相似的组(簇),使得组内数据的相似度较高,组间数据相似度较低
- k-means算法步骤:
- 从样本中选择k个点作为k个初始簇中心。
- 计算每个样本到各个簇中心的距离,将样本划分到距离最近的簇中心所对应的簇中
- 根据每个簇中的所有样本,重新计算簇中心,并更新
- 重复步骤2与3,直到簇中心的位置变化小雨指定的阀值或者达到最大的迭代次数为止
import numpy as np
import pandas as pd
data=pd.read_csv(r"F:\数据集\machine_learning_notebook-master\dataset\order.csv")
#筛选必要的列
data
t=data.iloc[:,-8:]
#t
k-means类的实现
class KMeans:"""使用python语言实现聚类算法"""def __init__(self,k,times):"""初始化方法Parameters:-------------k;int聚类的个数times: int聚类迭代的次数"""self.k=kself.times=timesdef fit(self,X):"""根据提供的训练数据,对模型进行训练Parameters:----------------X:类数组类型,形状:[样本数量,特征数量]待训练的样本特征属性"""X=np.asarray(X)#设置随机种子,以便于可以产生相同的随机序列。(随机的结果可以重现)np.random.seed(0)#随机选取k个点作为聚类中心self.cluster_centers_=X[np.random.randint(0,len(X),self.k)]self.labels_=np.zeros(len(X))for t in range(self.times):for index,x in enumerate(X):#计算每个样本与聚类中心的距离dis=np.sqrt(np.sum((x-self.cluster_centers_)**2,axis=1))#将最小距离的索引赋值给标签数组,索引的值就是当前点所属的簇,范围为[0,k-1]self.labels_[index]=dis.argmin()#循环遍历每一个簇for i in range(self.k):#计算每个簇内所有点的均值,更新聚类中心self.cluster_centers_[i]=np.mean(X[self.labels_==i],axis=0)def predict(self,X):"""根据参数传递的样本,对样本数据进行预测。(预测样本属于哪一个簇中)Parameters:--------------X:类数组类型。形状为:[样本数量,特征数量]待预测的特征属性。Returns:----------------result:数组类型预测的结果,每一个x所属的类别"""X=np.asarray(X)result=np.zeros(len(X))for index,x in enumerate(X):#计算样本到每个聚类中心的距离dis=np.sqrt(np.sum((x-self.cluster_centers_)**2,axis=1))#找到距离最近的聚类中心,划分类别result[index]=dis.argmin()return result
测试k-means 类
kmeans=KMeans(k=3,times=50)
#对样本t进行训练
kmeans.fit(t)
#输出训练后的聚类中心
kmeans.cluster_centers_
array([[46.33977936, 8.93380516, 23.19047005, 13.11741633, 4.8107557 ,1.17283735, 1.35704647, 0.95392773],[19.5308009 , 50.42856608, 14.70652695, 7.89437019, 3.69829234,0.91000428, 1.92515077, 0.82113238],[ 7.93541008, 4.56182052, 30.65583437, 18.57726789, 8.61597195,1.28482514, 26.81950293, 1.30158264]])
#查看属于各个簇下面的所有样本,比如查看簇为0的所有样本
t[kmeans.labels_==0]
Food% | Fresh% | Drinks% | Home% | Beauty% | Health% | Baby% | Pets% | |
---|---|---|---|---|---|---|---|---|
15 | 48.23 | 20.37 | 15.38 | 8.29 | 7.73 | 0.0 | 0.0 | 0.0 |
23 | 24.10 | 22.29 | 38.69 | 14.92 | 0.00 | 0.0 | 0.0 | 0.0 |
24 | 36.51 | 31.93 | 27.18 | 4.38 | 0.00 | 0.0 | 0.0 | 0.0 |
40 | 22.76 | 0.00 | 0.00 | 77.24 | 0.00 | 0.0 | 0.0 | 0.0 |
43 | 65.64 | 12.36 | 21.99 | 0.00 | 0.00 | 0.0 | 0.0 | 0.0 |
... | ... | ... | ... | ... | ... | ... | ... | ... |
29974 | 33.93 | 0.00 | 17.46 | 41.46 | 7.15 | 0.0 | 0.0 | 0.0 |
29977 | 45.10 | 0.00 | 26.68 | 28.22 | 0.00 | 0.0 | 0.0 | 0.0 |
29988 | 28.21 | 0.00 | 48.34 | 23.44 | 0.00 | 0.0 | 0.0 | 0.0 |
29989 | 61.32 | 0.00 | 23.34 | 15.34 | 0.00 | 0.0 | 0.0 | 0.0 |
29990 | 29.74 | 28.72 | 19.52 | 22.02 | 0.00 | 0.0 | 0.0 | 0.0 |
9382 rows × 8 columns
#预测
kmeans.predict([[30,30,40,0,0,0,0,0],[0,0,0,0,0,0,0,0],[30,30,0,0,80,80,20,20]])
array([0., 0., 0.])
可视化展示 (只选取Food%和Freash%这两个特征)
#注意,按标签选择时,标签两端都包含(这里的Food%和Freash%都包含)。这和按照索引选择是不一样的(索引不包含后端)
t2=data.loc[:,"Food%":"Fresh%"]
kmeans=KMeans(k=3,times=50)
kmeans.fit(t2)
#导入可视化库
import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rcParams["font.family"]="SimHei"
mpl.rcParams["axes.unicode_minus"]=False
plt.figure(figsize=(10,10))
#绘制每个类别的散点图
plt.scatter(t2[kmeans.labels_==0].iloc[:,0],t2[kmeans.labels_==0].iloc[:,1],label="类别1")
plt.scatter(t2[kmeans.labels_==1].iloc[:,0],t2[kmeans.labels_==1].iloc[:,1],label="类别2")
plt.scatter(t2[kmeans.labels_==2].iloc[:,0],t2[kmeans.labels_==2].iloc[:,1],label="类别3")
#绘制聚类中心
plt.scatter(kmeans.cluster_centers_[:,0],kmeans.cluster_centers_[:,1],marker="+",s=300)
plt.title("食物与肉类聚类分析")
plt.xlabel("食物")
plt.ylabel("肉类")
plt.legend()
plt.show()
聚类算法—K-means python实现相关推荐
- k均值聚类算法(K Means)及其实战案例
算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...
- python kmeans聚类 对二维坐标点聚类_Kmeans均值聚类算法原理以及Python如何实现
第一步.随机生成质心 由于这是一个无监督学习的算法,因此我们首先在一个二维的坐标轴下随机给定一堆点,并随即给定两个质心,我们这个算法的目的就是将这一堆点根据它们自身的坐标特征分为两类,因此选取了两个质 ...
- 聚类算法-K均值(K-means)
摘要 在前面的文章中,介绍了三种常见的分类算法.分类作为一种监督学习方法,要求必须事先明确知道各个类别的信息,并且断言所有待分类项都有一个类别与之对应.但是很多时候上述条件得不到满足,尤其是在处理海量 ...
- a*算法的优缺点_五种聚类算法一览与python实现
大家晚上好,我是阿涛. 今天的主题是聚类算法,小结一下,也算是炒冷饭了,好久不用真忘了. 小目录: 1.K-means聚类2.Mean-Shift聚类3.Dbscan聚类4.层次聚类5.GMM_EM聚 ...
- K-Means聚类算法原理及其python和matlab实现
(一)何谓聚类 还是那句"物以类聚.人以群分",如果预先知道人群的标签(如文艺.普通.2B),那么根据监督学习的分类算法可将一个人明确的划分到某一类:如果预先不知道人群的标签,那就 ...
- (学习笔记)聚类算法 - k均值算法(k-means)
聚类之K均值算法 聚类介绍 k均值算法步骤 Python实现 参考文献 聚类介绍 聚类是一种经典的无监督学习方法. 聚类的目的是将数据集中的样本划分为若干个通常是不相交的子集,每个子集被称为簇,以此来 ...
- K-means聚类算法原理及python具体实现
文章目录 1 快速理解 1.1 算法步骤 1.2 一个例子 2 K-means步骤详解 2.1 K值的选择 2.2 距离度量 2.3 新质心的计算 2.4 停止条件 3 K-means算法实现 3.1 ...
- 机器学习之聚类算法:K均值聚类(一、算法原理)
目录 一.Kmeans 二.Kmeans的流程 三.距离度量方式 3.1.闵可夫斯基距离 3.2.马哈拉诺比斯距离 3.3.其他 四.Kmeans聚类实例 五.Kmeans存在的问题 5.1.初始点的 ...
- FCM聚类算法详解(Python实现iris数据集)
参考:https://blog.csdn.net/on2way/article/details/47087201 模糊C均值(Fuzzy C-means)算法简称FCM算法,是一种基于目标函数的模糊聚 ...
- 层次聚类算法及通过python的scipy进行计算
目录 1.什么是层次聚类? 2. 如何用python实现 参考链接: 1.什么是层次聚类? 常用于 1维数据 的自动分组,如下图所示, 把数据用[主成分分析]的方法把数据从多维压缩为1维, 然后使用层 ...
最新文章
- java在注解中绑定方法参数的解决方案
- 平板电脑桌面添加计算机快捷键,驰为Vi10教你Windows 10中的这些实用快捷键
- 需求实在太旺盛,三星电子考虑扩大在华芯片产能
- java手机号判断运营商_用Java对手机号所属运营商进行判断
- Kafka集群部署CentOS 7
- ios中获取各种文件的目录路径方法
- Android 11 开机动画资源
- 生信学习笔记:利用GATK call SNP
- rd630服务器系统,联想thinkserverRD630安装windowsserver2012
- java毕业设计——基于Java+AI的五子棋游戏设计与实现(毕业论文+程序源码)——五子棋游戏
- 全网最全斗音短视频新老账号起号技巧
- 一个ios开发者使用Android手机后的一些感想
- 关于vega打不开的问题
- 远程桌面--外网访问内网多台电脑
- 一文带你重新审视CAP理论与分布式系统设计
- 分清概念十分重要系列之--关于GPS,你需要了解这些
- 明万历年间抗击倭寇援朝战役
- Android高仿网易云音乐播放界面
- 计算机专业文科生录取分数线,文科生适合报考的5所学校,录取分数线不高,但就业前景很好...
- GFocalV2解读