朴素贝叶斯
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轮廓数,越大表示越好