【Python代码】K-means聚类模型

news/2024/5/20 6:23:01 标签: 聚类, python, kmeans

一、简介

K均值聚类算法是先随机选取K个对象作为初始的聚类中心。然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本,聚类聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。

二、

1.便于理解,首先创建一个明显分为2类20*2的例子(每一列为一个变量共2个变量,每一行为一个样本共20个样本):

python">import numpy as np
c1x=np.random.uniform(0.5,1.5,(1,10))
c1y=np.random.uniform(0.5,1.5,(1,10))
c2x=np.random.uniform(3.5,4.5,(1,10))
c2y=np.random.uniform(3.5,4.5,(1,10))
x=np.hstack((c1x,c2x))
y=np.hstack((c2y,c2y))
X=np.vstack((x,y)).T
print(X)
 
 
结果:
[[1.4889993 4.18741329]
 [0.73017615 4.07842216]
 [1.15522846 4.05744838]
 [1.40768457 3.76674812]
 [1.376212 3.95063903]
 [1.20821055 4.34138767]
 [0.73898392 3.55026013]
 [0.97116627 3.65432314]
 [0.98267302 4.16731561]
 [1.06346541 4.44383585]
 [4.10945954 4.18741329]
 [3.75288064 4.07842216]
 [4.29638229 4.05744838]
 [3.95221785 3.76674812]
 [4.09826192 3.95063903]
 [4.04840874 4.34138767]
 [4.29594009 3.55026013]
 [3.56931245 3.65432314]
 [3.57962941 4.16731561]
 [3.65208848 4.44383585]]
 
2. 引用Python库将样本分为两类(k=2),并绘制散点图:
#只需将X修改即可进行其他聚类分析
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
 
kemans=KMeans(n_clusters=2)
result=kemans.fit_predict(X) #训练及预测
print(result) #分类结果
 
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei'] #散点图标签可以显示中文
 
x=[i[0] for i in X]
y=[i[1] for i in X]
plt.scatter(x,y,c=result,marker='o')
plt.xlabel('x')
plt.ylabel('y')
plt.show()
 
结果:
[0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1]
 
3. 如果K值未知,可采用肘部法选择K值(假设最大分类数为9类,分别计算分类结果为1-9类的平均离差,离差的提升变化下降最抖时的值为最优聚类数K):
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from scipy.spatial.distance import cdist
 
K=range(1,10)
meanDispersions=[]
for k in K:
 kemans=KMeans(n_clusters=k)
 kemans.fit(X)
 #计算平均离差
 m_Disp=sum(np.min(cdist(X,kemans.cluster_centers_,'euclidean'),axis=1))/X.shape[0]
 meanDispersions.append(m_Disp)
 
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei'] #使折线图显示中文
 
plt.plot(K,meanDispersions,'bx-')
plt.xlabel('k')
plt.ylabel('平均离差')
plt.title('用肘部方法选择K值')
plt.show()
 
三、实例分析(对某网站500家饭店价格及评论进行聚类import numpy as np
from sklearn.cluster import KMeans
from scipy.spatial.distance import cdist
import matplotlib.pyplot as plt
import pandas as pd
 
data=pd.read_excel('data.xlsx',header=0).iloc[:501,3:5]
per_25=data.describe().iloc[4,1]
per_75=data.describe().iloc[6,1]
data=data[(data.iloc[:,1]>=per_25)&(data.iloc[:,1]<=per_75)] #选择位于四分位数之内的数
X=np.array(data)
 
 
K=range(1,10)
meanDispersions=[]
for k in K:
 kemans=KMeans(n_clusters=k)
 kemans.fit(X)
 meanDispersions.append(sum(np.min(cdist(X,kemans.cluster_centers_,'euclidean'),axis=1))/X.shape[0])
 
 
 
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.plot(K,meanDispersions,'bx-')
plt.xlabel('k')
plt.ylabel('平均离差')
plt.title('用肘部方法选择K值')
plt.show()
 
具体聚类过程
 
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
 
kemans=KMeans(n_clusters=3)
result=kemans.fit_predict(X)
print(result)
x=[i[0] for i in X]
y=[i[1] for i in X]
plt.scatter(x,y,c=result,marker='o')
plt.xlabel('avgPrice')
plt.ylabel('llCommentNum')
plt.title('对500家饭店价格与评论数进行聚类')
 
聚类结果:
[2 0 0 0 0 1 0 0 2 0 0 2 1 2 0 1 2 0 2 2 2 0 0 0 0 1 2 0 1 0 0 2 2 2 2 2 2
 2 2 0 1 0 0 0 1 0 2 2 0 2 2 0 0 2 2 2 1 0 1 1 1 0 0 0 0 1 2 1 2 0 2 1 0 0
 2 1 1 0 0 1 2 2 0 2 2 1 0 2 1 0 2 0 0 1 0 0 1 1 1 0 0 0 0 0 0 0 0 2 1 2 1
 1 0 0 1 0 1 2 1 0 1 1 0 1 1 0 1 0 2 1 1 0 1 0 2 0 2 1 2 1 1 0 0 1 0 1 0 1
 0 2 0 1 1 0 1 0 0 1 1 1 1 0 0 0 0 1 0 0 0 2 0 1 1 0 1 0 1 0 0 0 0 1 1 0 1
 2 0 1 1 2 0 1 0 0 1 1 1 1 1 0 0 0 1 1 1 2 0 1 1 1 2 2 0 0 2 1 1 2 1 1 1 0
 1 1 0 1 2 2 0 2 2 2 0 1 0 1 1 2 1 1 1 0 1 1 1 1 0 0 0 0 1] 

http://www.niftyadmin.cn/n/1413395.html

相关文章

android之AlertDialog 点击其它区域自己主动消失

遇到一个问题记录下来&#xff0c;在开发中使用了AlertDialog&#xff0c;想点击屏幕其它区域的时候让这个dialog消失&#xff0c;一開始不做不论什么设置&#xff0c;在小米手机能够正常显示&#xff0c;可是在三星中却有问题。后来发现少了一个属性&#xff1a; View dilaogV…

【Python代码】层次分析法

import numpy as np class AHP:"""相关信息的传入和准备"""def __init__(self, array):## 记录矩阵相关信息self.array array## 记录矩阵大小self.n array.shape[0]# 初始化RI值&#xff0c;用于一致性检验self.RI_list [0, 0, 0.52, 0.89, 1…

串口通信,C#,C++,短信发送模块实现

GPS- Deriving British Ordnance Survey Grid Reference from NMEA data - Part 1 - modify NMEAinterpreter class How to Write a GPS Application - Introduction PDU 编码 C,Delphi 7位编码 GSM MODEM接收短信 C编码 手机发送短消息 (全面) http://blog.csdn.net/qianb…

(5)进程--锁和信号量

#同一时间允许一个进程上一把锁 就是Lock 加锁可以保证多个进程修改同一块数据时&#xff0c;同一时间只能有一个任务可以进行修改&#xff0c;即串行的修改&#xff0c;没错&#xff0c;速度是慢了&#xff0c;但牺牲了速度却保证了数据安全。 #同一时间允许多个进程上多把锁 …

Android生成keystore是报错拒绝访问

Android生成keystore是报错拒绝访问

最详细的AT指令说明

概述手机的短消息实现目前有三种方法:1.通过移动网关发送短消息,使用该方法不需要附加的硬件,但是需要到电信部门申请网关,比较适用于一些大型的网络通讯公司开发,目前华为,中兴等公司就做的这方面的工作,并且还有相应的开发包供开发人员使用.2.在电脑上通过GSM MODEM向手机发送…

浣熊市的下水道-bfs

浣熊市的下水道 题目&#xff1a; 在浣熊市狭窄的下水道中&#xff0c;伴随着枪响&#xff0c;那颗本应射中艾达的子弹被浣熊市新晋警察里昂挡了下来。艾达无法理解里昂为什么会为她挡下这发子弹&#xff0c;但她还是将里昂拖到了安全的地方并用绷带治疗了里昂。由于任务在身&a…

python --遗传算法之单目标规划问题

1. 带约束的单目标优化问题 1.1 继承 Problem 问题类完成对问题模型的描述 在这一步中&#xff0c;主要是将我们的问题按照模板描述清楚,包括目标函数和约束条件。 import numpy as np import geatpy as ea class MyProblem(ea.Problem): # 继承Problem父类def __init__(self…