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=0m∑i=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()