当前位置:   article > 正文

机器学习——k-均值算法(聚类)_k均值聚类

k均值聚类

前言:有三维聚类图,我只是一个代码的搬运工。。。

机器学习专栏机器学习专栏

k-均值(k-means)聚类

1、k-均值算法

k-均值算法是一种无监督学习,是一种“基于原型的聚类”(prototype-based clustering)方法,给定的数据是不含标签的 D = { x ( 1 ) , x ( 2 ) , . . . , x ( i ) } D=\{{x^{(1)},x^{(2)},...,x^{(i)}}\} D={x(1),x(2),...,x(i)},目标是找出数据的模式特征进行分类。如社交网络分析,通过用户特征进行簇划分,分出不同群体。
在这里插入图片描述
(图源网络,侵删)

2、k-均值算法的代价函数

给定数据集 D = { x ( 1 ) , x ( 2 ) , . . . , x ( i ) } D=\{{x^{(1)},x^{(2)},...,x^{(i)}}\} D={x(1),x(2),...,x(i)},k-均值聚类算法的代价函数(基于欧式距离的平方误差)为:
J = m 1 ∑ i = 1 m ∣ ∣ x ( i ) − u c ( i ) ∣ ∣ 2 J=\frac{m}{1}\sum_{i=1}^{m}||x^{(i)}-u_{c^{(i)}}||^2 J=1mi=1mx(i)uc(i)2
其中, c ( i ) c^{(i)} c(i)是训练样例 x ( i ) x^{(i)} x(i)分配的聚类序号; u c ( i ) u_{c^{(i)}} uc(i) x ( i ) x^{(i)} x(i)所属聚类的中心点 。k-均值算法的代价函数函数的物理意义就是,训练样例到其所属的聚类中心点的距离的平均值。

3、k-均值算法步骤

k-均值算法主要包括:根据聚类中心分配样本类别——>更新聚类中心

  1. 随机选择K个聚类中心 u 1 , u 2 , . . . , u K u_1,u_2,...,u_K u1,u2,...,uK
  2. 从1~m中遍历所有的数据集,计算 x ( i ) x^{(i)} x(i)分别到 u 1 , u 2 , . . . , u K u_1,u_2,...,u_K u1,u2,...,uK的距离,记录距离最短的聚类中心点 u k u_k uk,然后把 x ( i ) x^{(i)} x(i)这个点分配给这个簇,即令 c ( i ) = k c^{(i)}=k c(i)=k
  3. 从1~k中遍历所有的聚类中心,移动聚类中心的新位置到这个簇的均值处,即 u k = 1 c k ∑ j = 1 c k x ( j ) u_k=\frac{1}{c_k}\sum_{j=1}^{c_k}x^{(j)} uk=ck1j=1ckx(j),其中 c k c_k ck表示这个簇的样本数;
  4. 重复步骤2,直到聚类中心不再移动。

4、初始化聚类中心点和聚类个数

1、在实际应用的过程中,聚类结果会和我们初始化的聚类中心相关,因为代价函数可能会收敛在一个局部最优解上,而不是全局最优解。我们的解决方法是多次初始化,然后选取代价函数最小的
在这里插入图片描述
2、如果没有特别的业务要求,聚类个数如何选取?我们可以把聚类个数作为横坐标,代价函数作为纵坐标,找出拐点。
在这里插入图片描述

5、sklearn实现k-means算法

推荐一篇博文: 聚类效果评价

主函数KMeans

sklearn.cluster.KMeans(n_clusters=8,
	 init='k-means++', 
	n_init=10, 
	max_iter=300, 
	tol=0.0001, 
	precompute_distances='auto', 
	verbose=0, 
	random_state=None, 
	copy_x=True, 
	n_jobs=1, 
	algorithm='auto'
	)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

参数解释:

  1. n_clusters:簇的个数,即你想聚成几类
  2. init: 初始簇中心的获取方法
  3. n_init: 获取初始簇中心的更迭次数,为了弥补初始质心的影响,算法默认会初始10次质心,实现算法,然后返回最好的结果。
  4. max_iter: 最大迭代次数(因为kmeans算法的实现需要迭代)
  5. tol: 容忍度,即kmeans运行准则收敛的条件
  6. precompute_distances:是否需要提前计算距离,这个参数会在空间和时间之间做权衡,如果是True 会把整个距离矩阵都放到内存中,auto 会默认在数据样本大于featurs*samples 的数量大于12e6 的时候False,False 时核心实现的方法是利用Cpython 来实现的
  7. verbose: 冗长模式(不太懂是啥意思,反正一般不去改默认值)
  8. random_state: 随机生成簇中心的状态条件。
  9. copy_x: 对是否修改数据的一个标记,如果True,即复制了就不会修改数据。bool 在scikit-learn 很多接口中都会有这个参数的,就是是否对输入数据继续copy 操作,以便不修改用户的输入数据。这个要理解Python 的内存机制才会比较清楚。
  10. n_jobs: 并行设置
  11. algorithm: kmeans的实现算法,有:‘auto’, ‘full’, ‘elkan’, 其中 'full’表示用EM方式实现

代码:

# -*- coding: utf-8 -*-
"""
Created on Wed Nov 20 18:52:21 2019

@author: 1
"""

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

df=pd.read_csv('D:\\workspace\\python\machine learning\\data\\iris.csv',sep=',')
data=df.iloc[:,0:3]
kmeans=KMeans(n_clusters=3)   #n_clusters:number of cluster
kmeans.fit(data)
labels=kmeans.labels_#聚类标签
centres=kmeans.cluster_centers_#聚类中心

#画三维聚类结果图
markers=['o','^','*']
colors=['r','b','y']
data['labels']=labels
ax = plt.subplot(111, projection='3d')  # 创建一个三维的绘图工程
data_new,X,Y,Z=[[]]*3,[[]]*3,[[]]*3,[[]]*3
for i in range(3):
    data_new[i]=data.loc[data['labels']==i]
    X[i],Y[i],Z[i]=data_new[i].iloc[:,0],data_new[i].iloc[:,1],data_new[i].iloc[:,2]
    ax.scatter(X[i],Y[i],Z[i],marker=markers[i],c=colors[i])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

聚类结果:
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/129055?site
推荐阅读
相关标签
  

闽ICP备14008679号