K-means 聚类

1、K-means 聚类算法过程
顺序过程
1随机抽取k个样本作为最初的质心
2开始循环
2.1计算每个点到这些质心的距离;将每个样本点分配到离他们最近的质心,生成k个簇
2.2对于每个簇,计算所有被分到该簇的样本点的平均值作为新的质心
3当质心的位置不再发生变化,迭代停止,则聚类完成

当我们找到一个质心的时候,每次循环后分配到此质心上的样本(簇)都是一致的,所有样本不会从一个簇转移到另外一个簇,则质心不会再发生变化,聚类完成。

2、簇内差异

对于一个簇来说,所有样本点到质心的距离之和越小,我们就认为,这个簇中的样本越相似,簇内差异就越小。
距离衡量方法如下:

欧几里得距离: d ( x , μ ) d(x,\mu) d(x,μ)= ∑ i = 1 n ( x i − μ i ) 2 \sqrt{\sum^{n}_{i=1}{(x_i-\mu _i)^2}} i=1n(xiμi)2

曼哈顿距离: d ( x , μ ) d(x,\mu) d(x,μ)= ∑ i = 1 n ( ∣ x i − μ ∣ ) \sum^{n}_{i=1}{(|x_i-\mu|)} i=1n(xiμ)

余弦距离:cos θ \theta θ= ∑ 1 n ( x i ∗ μ ) ∑ 1 n ( x i ) 2 ∑ 1 n ( μ ) 2 \frac{\sum^{n}_{1}{(x_i*\mu)}}{\sqrt{\sum^{n}_{1}{(x_i)^2}}\sqrt{\sum^{n}_{1}{(\mu)^2}}} 1n(xi)2 1n(μ)2 1n(xiμ) 用于文本之间的距离

采用欧式距离,则一个簇中所有样本点到质心的距离的平方和为
css= ∑ j = 0 m ∑ i = 1 n ( x i − μ i ) 2 \sum^{m}_{j=0}\sum^{n}_{i=1}{(x_i-\mu _i)^2} j=0mi=1n(xiμi)2

数据中所有簇内平方和相加=整体平方和
Inertia= ∑ i = 0 k c s s \sum^{k}_{i=0}css i=0kcss
Inertia值越小,代表每个簇内样本相似,聚类效果越好

距离度量质心Inertia
欧几里得距离均值最小化每个样本点到质心的欧式距离之和
曼哈顿距离中位数最小化每个样本点到质心的曼哈顿距离之和
余弦距离均值最小化每个样本点到质心的余弦距离之和
3、重要参数 n_clusters

n_clusters是KMeans中的k,表示这我们告诉模型我们要分几类。

from sklearn.datasets import make_blobs #从datasets库里面导入各种知名的数据
import matplotlib.pyplot as plt

X,y=make_blobs(n_samples=500,n_features=2,centers=4,random_state=1)
fig,ax1 = plt.subplots(1) #生成子图1个  fig画布 ,ax1对象
ax1.scatter(X[:,0],X[:,1]   #画点
            ,marker="o" #点的形状
            ,s=8 #点的大小
            )
plt.show()

在这里插入图片描述
这个数据的真实样貌:

from sklearn.datasets import make_blobs #从datasets库里面导入各种知名的数据
import matplotlib.pyplot as plt

X,y=make_blobs(n_samples=500,n_features=2,centers=4,random_state=1)
color = ["red","pink","orange","gray"]
fig,ax1 = plt.subplots(1) #生成子图1个  fig画布 ,ax1对象

for i in range(4):
    ax1.scatter(X[y==i,0],X[y==i,1]  #画点
                ,marker="o"  #点的形状
                ,s=8   #点的大小
                ,c=color[i])

plt.show()

在这里插入图片描述

from sklearn.cluster import KMeans
n_clusters =3
cluster = KMeans(n_clusters=n_clusters,random_state=0)
cluster.fit(X)  #聚类完成了

#cluster.cluster_centers_  (质心)
#cluster.inertia_  (总距离的平方和)
#KMeans因为不需要建立模型或者预测结果,因此我们只需要fit就能够聚类结果了
#KMeans也有接口predict和fit_prefict,表示学习数据X并对X的类进行预测
#fit结果和predict结果一样

若是数据特别庞大,可以使用小部分数据

from sklearn.cluster import KMeans
n_clusters =3
#若是数据太大 就使用小部分去聚类质心,剩下的数据就放进去分类
cluster_small = KMeans(n_clusters=n_clusters,random_state=0)
cluster_small.fit(X[:200]) #200行数据聚类
cluster =cluster_small.predict(X)
4、聚类后画图
from sklearn.datasets import make_blobs #从datasets库里面导入各种知名的数据
import matplotlib.pyplot as plt

X,y=make_blobs(n_samples=500,n_features=2,centers=4,random_state=1)

from sklearn.cluster import KMeans
n_clusters =3
cluster = KMeans(n_clusters=n_clusters,random_state=0)
cluster.fit(X)  #聚类完成了
y_pred = cluster.labels_
centroid=cluster.cluster_centers_   #质心
color = ["red","pink","orange","gray"]
fig,ax1 = plt.subplots(1) #生成子图1个  fig画布 ,ax1对象

for i in range(n_clusters):
    ax1.scatter(X[y_pred==i,0],X[y_pred==i,1]  #画点
                ,marker="o"  #点的形状
                ,s=8   #点的大小
                ,c=color[i]
                )

ax1.scatter(centroid[:,0],centroid[:,1] #画质心
                ,marker="x"  #点的形状
                ,s=25   #点的大小
                ,c="black")
plt.show()

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值