机器学习聚类
DBSCAN
模型调参
from sklearn.cluster import DBSCAN
# 构建空列表,用于保存不同参数组合下的结果
res = []
# 迭代不同的eps值
for eps in np.arange(0.001,1,0.05):
# 迭代不同的min_samples值
for min_samples in range(2,10):
dbscan = DBSCAN(eps = eps, min_samples = min_samples)
# 模型拟合
dbscan.fit(train2)
# 统计各参数组合下的聚类个数(-1表示异常点)
n_clusters = len([i for i in set(dbscan.labels_) if i != -1])
# 异常点的个数
outliners = np.sum(np.where(dbscan.labels_ == -1, 1,0))
# 统计每个簇的样本个数
stats = str(pd.Series([i for i in dbscan.labels_ if i != -1]).value_counts().values)
res.append({'eps':eps,'min_samples':min_samples,'n_clusters':n_clusters,'outliners':outliners,'stats':stats})
# 将迭代后的结果存储到数据框中
df = pd.DataFrame(res)
训练模型
from sklearn.cluster import DBSCAN
from sklearn import metrics
from sklearn.preprocessing import StandardScaler
sop1=sop_1[[1,2,3,4]]
db=DBSCAN(eps=20,min_samples=3).fit(sop1)
labels=db.labels_
a['cluster_db']=labels
a=a.sort_values('cluster_db')
a.to_csv('../sop1_desc.csv')
print(pd.plotting.scatter_matrix(sop_1, c=a.cluster_db,figsize=(10,10), s=100))
模型评估:
from sklearn import metrics
score = metrics.silhouette_score(sop1,a.cluster_db)
print(score)
KMeans
寻找最优k值
from sklearn.cluster import KMeans
from sklearn import metrics
# 构造自定义函数,用于绘制不同k值和对应轮廓系数的折线图
def k_silhouette(X, clusters):
K = range(2,clusters+1)
# 构建空列表,用于存储个中簇数下的轮廓系数
S = []
for k in K:
kmeans = KMeans(n_clusters=k)
kmeans.fit(X)
labels = kmeans.labels_
# 调用字模块metrics中的silhouette_score函数,计算轮廓系数
S.append(metrics.silhouette_score(X, labels, metric='euclidean'))
# 中文和负号的正常显示
plt.rcParams['font.sans-serif'] = [u'SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 设置绘图风格
plt.style.use('ggplot')
# 绘制K的个数与轮廓系数的关系
plt.plot(K, S, 'b*-')
plt.xlabel('簇的个数')
plt.ylabel('轮廓系数')
# 显示图形
plt.show()
# 自定义函数的调用(指定原始数据和选取范围)
k_silhouette(frequency_matrix, 15)
抽取部分数据查看聚类效果
from sklearn.cluster import KMeans
estimator = KMeans(n_clusters=3)#构造聚类器,构造一个聚类数为3的聚类器
estimator.fit(train2)#聚类
label_pred = estimator.labels_ #获取聚类标签
centroids = estimator.cluster_centers_ #获取聚类中心
inertia = estimator.inertia_ # 获取聚类准则的总和
mark = ['or', 'ob', 'og', 'ok', '^r', '+r', 'sr', 'dr', '<r', 'pr']
#这里'or'代表中的'o'代表画圈,'r'代表颜色为红色,后面的依次类推
color = 0
j = 0
for i in label_pred:
plt.plot([train2.values[j:j+1,0]], [train2.values[j:j+1,1]], mark[i], markersize = 5)
j +=1
plt.show()
模型评估
from sklearn.cluster import KMeans
from sklearn import metrics
estimator = KMeans(n_clusters=3)#构造聚类器,构造一个聚类数为3的聚类器
w=estimator.fit(train2)#聚类
label_pred = w.labels_ #获取聚类标签
centroids = w.cluster_centers_ #获取聚类中心
inertia = w.inertia_ # 获取聚类准则的总和
train2['cluster_db']=w.labels_
a=train2.sort_values('cluster_db')
score = metrics.silhouette_score(train2,train2.cluster_db)
print(score)