聚类K-means算法

聚类K-means算法

  问题:给你一张这样的图,也没给其他信息,让你去给他们分类?怎么分类

  那么,我们可能会以帽子或头发等为特征对他们进行分类,物以类聚,人以群分


聚类的原理:

  1. 随机在数据当中抽取三个样本,当做三个类别的中心点(k1,k2,k3). ##图一,颜色实心标记##
  2. 计算其余的点分别到这三个中心点的距离,这样每一个点(样本)就有3个距离(a,b,c),从中选出距离最近的一个中心点作为自己的标记形成三个族群.
  3. 分别计算这三个族群的平均值,把三个平均值与三个旧的中心点进行比较.
       - 如果相同:结束聚类.
       - 如果不同:把这个平均值当做新的中心点,重复第二步第三步直到结束聚类.

K-means步骤:

1. 随机设置k个特征空间内的点作为初始的聚类中心
2. 对于其他每个点计算到k个中心的距离,未知的点选择最近的一个聚类中心点作为标记类别
3. 接着对标记聚类中心之后,计算每个聚类的新中心点(平均值)
4. 如果计算得出的新中心点与原中心点一样,那么聚类结束,否则重新进行第二步骤

K-means→API:

sklearn.cluster.KMeans(n_clusters=8,init=‘k-means++‘)
    k-means聚类
    n_clusters:开始的聚类中心数量
    init:初始化方法,默认为‘k-means++‘
    labels_:默认标记的类型,可以和真实值比较(不是值比较)

聚类有什么作用?

  聚类一般用在分类算法之前,然后进行预测.

聚类流程:

  • 降维之后的数据
  • k-means聚类
  • 聚类结果显示


案例演示:

# 导入案例数据import pandas as pd
from sklearn.decomposition import PCA
# 读取四张表的数据
prior = pd.read_csv(r‘C:\Users\luowe\Desktop\week9\week9\instacart\order_products__prior.csv‘)
product = pd.read_csv(r‘C:\Users\luowe\Desktop\week9\week9\instacart\products.csv‘)
orders = pd.read_csv(r‘C:\Users\luowe\Desktop\week9\week9\instacart\orders.csv‘)
aisles = pd.read_csv(r‘C:\Users\luowe\Desktop\week9\week9\instacart\aisles.csv‘)
# 合并四张表到一张表,(用户-物品类别)
data = pd.merge(prior, product, on=‘product_id‘)
data = pd.merge(data, orders, on=‘order_id‘ )
data = pd.merge(data, aisles, on=‘aisle_id‘)
# 建立一个以用户为行,产品为列的表 # 即用户和产品进行交叉
table = pd.crosstab(data[‘user_id‘], data[‘aisle‘])
# 数据结构为(206209, 134),需要做主成分分析,进行降维
pca = PCA(n_components=0.9)  # 保留90%的数据

res = pca.fit_transform(table)  #之前的数据降维学习的数据

# 数据量大,把数据减
x = res[:500]

# 假设用户一共分为4个类别
from sklearn.cluster import KMeans
km = KMeans(n_clusters=4)
km.fit(x)

# 聚类 ,分类加上标记
predict = km.predict(x)少

输出结果:

 500个结果,把这四个类别画出来:

import matplotlib.pyplot as plt
plt.figure(figsize=(10,10))

# 建立四个颜色
colored = [‘green‘,‘red‘,‘yellow‘,‘blue‘]
color=[colored[i] for i in predict]
plt.scatter(x[:, 1],x[:, 11],color=color)  # 散点图,x第1列,y第11列
plt.xlabel(‘1‘)
plt.ylabel(‘2‘)
plt.show()  #因为只取了2个维度,所以看上去...


聚类的评估标准:

  聚类效果的好坏

 # 外部聚类最大化,内部距离最小化 #



## 轮廓系数,计算聚类效果的好坏 ##

考虑极端情况:

完美聚类 bi>>ai : sci=1
最差聚类 bi<<ai : sci = -1 轮廓系数[-1,1] 一般轮廓系数大于0.1就是非常好的效果

  

聚类评估API:

sklearn.metrics.silhouette_score(x,labels)
    计算所有样本的平均轮廓系数
    x:特征值
    labels:被聚类标记的目标值
## 评判聚类效果,轮廓系数
from sklearn.metrics import silhouette_score

silhouette_score(x,predict)
# 通过不停的调优,网格搜索,交叉验证可以得到最好的聚类效果

输出:


K-means总结:

特点
    采用迭代, 直观易懂, 并且实用

缺点
    容易收敛到局部最优解.(多次聚类)....#类 里面有局部聚类#

注意 : 聚类一般做在分类之前

原文地址:https://www.cnblogs.com/luowei93/p/11964738.html

时间: 2024-10-18 11:51:47

聚类K-means算法的相关文章

聚类--K均值算法

聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用    1.用python实现K均值算法 K-means是一个反复迭代的过程,算法分为四个步骤:(x,k,y) import numpy as np x = np.random.randint(1,50,[20,1]) y = np.zeros(20) k = 3 # 选取数据空间中的K个对象作为初始中心,每个对象代表一个聚类中心:def initcenter(x, k): kc def initcenter(x,k)

聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用

4 用python实现K均值算法 x=np.random.randint(1,100,[20,1]) y=np.zeros(20) k=3 def initcenter(x,k): return x[:k] def nearest(kc,i): d = (abs(kc - i)) w = np.where(d ==np.min(d)) return w [0] [0] kc = initcenter(x,k) nearest(kc,14) for i in range(x.shape[0]):

K-means算法

K-means算法很简单,它属于无监督学习算法中的聚类算法中的一种方法吧,利用欧式距离进行聚合啦. 解决的问题如图所示哈:有一堆没有标签的训练样本,并且它们可以潜在地分为K类,我们怎么把它们划分呢?     那我们就用K-means算法进行划分吧. 算法很简单,这么做就可以啦: 第一步:随机初始化每种类别的中心点,u1,u2,u3,--,uk; 第二步:重复以下过程: 然后 ,就没有然后了,就这样子. 太简单, 不解释.

聚类算法:K-means 算法(k均值算法)

k-means算法:      第一步:选$K$个初始聚类中心,$z_1(1),z_2(1),\cdots,z_k(1)$,其中括号内的序号为寻找聚类中心的迭代运算的次序号. 聚类中心的向量值可任意设定,例如可选开始的$K$个模式样本的向量值作为初始聚类中心.      第二步:逐个将需分类的模式样本$\{x\}$按最小距离准则分配给$K$个聚类中心中的某一个$z_j(1)$.假设$i=j$时, \[D_j (k) = \min \{ \left\| {x - z_i (k)} \right\|

聚类之K均值聚类和EM算法

这篇博客整理K均值聚类的内容,包括: 1.K均值聚类的原理: 2.初始类中心的选择和类别数K的确定: 3.K均值聚类和EM算法.高斯混合模型的关系. 一.K均值聚类的原理 K均值聚类(K-means)是一种基于中心的聚类算法,通过迭代,将样本分到K个类中,使得每个样本与其所属类的中心或均值的距离之和最小. 1.定义损失函数 假设我们有一个数据集{x1, x2,..., xN},每个样本的特征维度是m维,我们的目标是将数据集划分为K个类别.假定K的值已经给定,那么第k个类别的中心定义为μk,k=1

DM里的K均值算法

1.Preface 因为一直在做的是聚类算法的研究,算是总结了一些心得,这里总结些知识性与思路性的东西,我想在其他地方也是很容易的找到类似的内容的.毕竟,世界就是那么小. 声明:本文比较不适合没有DM基础的人来阅读.我只是胡乱的涂鸦而已 2.聚类算法 在DM里的聚类算法里,有基于划分的算法,基于层次的算法,基于密度的算法,基于网格的算法,基于约束的算法. 其中每一种基于的算法都会衍生出一至几种算法,对应的每一种算法不管在学术界还是工业界都存在着许多的改进的算法 这里想介绍的是基于基于划分的算法里

从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 前言 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章待写:1.KD树:2.神经网络:3.编程艺术第28章.你看到,blog内的文章与你于别处所见的任何都不同.于是,等啊等,等一台电脑,只好等待..”.得益于田,借了我一台电脑(借他电脑的时候,我连表示感谢,他说“能找到工作全靠你的博客,这点儿小忙还说,不地道”,有的时候,稍许感受到受人信任也是一种压力,愿我不辜负大家对我的信任)

机器学习-KMeans聚类 K值以及初始类簇中心点的选取

[转]http://www.cnblogs.com/kemaswill/archive/2013/01/26/2877434.html 本文主要基于Anand Rajaraman和Jeffrey David Ullman合著,王斌翻译的<大数据-互联网大规模数据挖掘与分布式处理>一书. KMeans算法是最常用的聚类算法,主要思想是:在给定K值和K个初始类簇中心点的情况下,把每个点(亦即数据记录)分到离其最近的类簇中心点所代表的类簇中,所有点分配完毕之后,根据一个类簇内的所有点重新计算该类簇的

二分-k均值算法

首先我们都知道k均值算法有一个炒鸡大的bug,就是在很多情况下他只会收敛到局部最小值而不是全局最小值,为了解决这个问题,很多学者提出了很多的方法,我们在这里介绍一种叫做2分k均值的方法. 该算法首先将所有点作为一个簇,然后将该簇一分为二.之后选择其中一个簇继续进行划分,选择哪一个簇进行划分取决于哪个簇的sse是最大值.上述基于sse的划分过程不断重复,直到得到用户指定的簇数目为止. 将所有的点看成一个簇,当粗的数目小于k时,对每一个簇计算总误差,在给定的粗上进行k均值聚类(k=2),计算将该粗一

K均值算法-python实现

测试数据展示: #coding:utf-8__author__ = 'similarface''''实现K均值算法 算法摘要:-----------------------------输入:所有数据点A,聚类个数k输出:k个聚类的中心点 随机选取k个初始的中心点repeat: 计算每个点和中心点的距离,将点分配给最近的中心簇中 计算Ck,更新簇的中心点until 中心点稳定 -----------------------------'''import sysimport randomimport