聚类Kmeans算法

朴素贝叶斯

API:sklearn.naive_bayes.MultinomialNB(alpha=1.0)

alpha:拉普拉斯平滑系数

所有特征相互独立的事件叫 贝叶斯

C:表示目标值

拉普拉斯平滑系数

为了避免P(W)为0


Kmeans

根据样本之间的相似性,进行划分,不同相似性的计算会划分不同的聚类

无参考经验的叫聚类

无参考经验的叫分类

使用场景:

在没有先验知识的情况下,对数据做分组

这个点距离各个质心 哪个近就属于哪个簇 --一般使用欧式距离

无监督学习 只要用于将详细的样本自动归到一个类别中

计算样本和样本之间的相似性

颗粒度:粗聚类、细聚类(簇越多越细)

实现方法:K-means聚类、层次聚类、DBSCAN聚类、谱聚类

评估方式

SSW

SSE越小模型越好越聚集,它一般用于找几个K值(分几个簇)

代码示例

import  os
os.environ['OMP_NUM_THREADS']='4'
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.datasets import  make_blobs
from sklearn.metrics import  calinski_harabasz_score
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
def SSE():
    sse_list = []
    x, y = make_blobs(
        n_samples=1000,  # 1000g个样本点
        n_features=2,  # 2个特征(x,y)
        centers=[[-1, -1], [0, 0], [1, 1], [2, 2]],  # 四个中心点的坐标
        cluster_std=[0.4, 0.3, 0.2, 0.1],  # 每个中心点的标准差
        random_state=27
    )
   for i inrange(1,100):#创建KMeans对象,设置K值,最大迭代次数,随机种子        model = KMeans(n_clusters=i,max_iter=100,random_state=27)        model.fit(x)#获取SSE值,并添加到列表中        sse_list.append(model.inertia_)#误差平方和
    print(sse_list)
    plt.figure(figsize=(16,8),dpi=100)
    #绘制折线图,x轴:k值,y:SSE值
    plt.plot(range(1,100),sse_list)
    plt.grid()
    plt.title('KMeans的SSE评估指标')
    plt.show()


if __name__ == '__main__':
    SSE()

SC

簇内越小越好, 簇外越大越好(越明显)

代码示例

import  os
os.environ['OMP_NUM_THREADS']='4'
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.datasets import  make_blobs
from sklearn.metrics import  calinski_harabasz_score,silhouette_score
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

def SC():
    #todo 考虑 簇内 与 簇外 SC整体越大越好
    #todo 公式: sc值 =(b-1)/max(a,b) a:表示簇内 b:表示簇外
    sc_list = []
    x, y = make_blobs(
        n_samples=1000,  # 1000g个样本点
        n_features=2,  # 2个特征(x,y)
        centers=[[-1, -1], [0, 0], [1, 1], [2, 2]],  # 四个中心点的坐标
        cluster_std=[0.4, 0.3, 0.2, 0.1],  # 每个中心点的标准差
        random_state=27
    )
    for i in range(2,100):
        model = KMeans(n_clusters=i,max_iter=100,random_state=27)
        model.fit(x)
        sc_list.append(silhouette_score(x,model.predict(x)))#误差平方和
    print(sc_list)
    plt.figure(figsize=(16,8),dpi=100)
    plt.plot(range(2,100),sc_list)
    plt.grid()
    plt.title('KMeans的SSE评估指标')
    plt.show()

CH

考虑三个点:簇内 簇外 K值

越大越好,K越少越好(奥卡姆剃刀原则,可以看作惩罚系数)

CH代码示例

import  os
os.environ['OMP_NUM_THREADS']='4'
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.datasets import  make_blobs
from sklearn.metrics import  calinski_harabasz_score,silhouette_score
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
def CH():
    ch_list = []
    x, y = make_blobs(
        n_samples=1000,  # 1000g个样本点
        n_features=2,  # 2个特征(x,y)
        centers=[[-1, -1], [0, 0], [1, 1], [2, 2]],  # 四个中心点的坐标
        cluster_std=[0.4, 0.3, 0.2, 0.1],  # 每个中心点的标准差
        random_state=27
    )
    for i in range(2, 100):
        model = KMeans(n_clusters=i, max_iter=100, random_state=27)
        model.fit(x)

        ch_list.append(calinski_harabasz_score(x, model.predict(x)))  # 误差平方和
    print(ch_list)
    plt.figure(figsize=(16, 8), dpi=100)

    plt.plot(range(2, 100), ch_list)
    plt.grid()
    plt.title('KMeans的CH评估指标')
    plt.show()

if __name__ == '__main__':
    CH()

KMeans代码示例

API: sklearn.cluster.KMeans(n_clusters=int)

···

import  os
os.environ['OMP_NUM_THREADS']='4'
from sklearn.cluster importKMeans
import matplotlib.pyplot as plt
from sklearn.datasets importmake_blobsfrom sklearn.metrics import  calinski_harabasz_score
x,y = make_blobs(
    n_samples=1000,#1000g个样本点
    n_features=2,#2个特征(x,y)
    centers=[[-1,-1],[0,0],[1,1],[2,2]],#四个中心点的坐标
    cluster_std=[0.4,0.3,0.2,0.1],#每个中心点的标准差
    random_state=27
)
#通过散点图的形式,把上述的样本点绘制出来
plt.scatter(x[:,0],x[:,1])
plt.show()

#参1:具体要划分几个簇, 参2:随机种子
estimator = KMeans(n_clusters=4,random_state=22)

y_pre = estimator.fit_predict(x)
#参1:x轴 参2:y轴
plt.scatter(x[:,0],x[:,1],c=y_pre)
plt.show()
print(calinski_harabasz_score(x,y_pre))#ch轮廓数,越大表示越好