Python:Sklearn的K-Means以及均值漂移聚类代码

  • K-Means聚类
  • MeanShift聚类(均值漂移)
  • 如何选择聚类方法


K-Means聚类

python 空间坐标系 求球心_python


聚类流程图如上图所示,K-Means聚类需要自己设置簇数k,可以通过肘方法确定k值。

import pandas as pd
import numpy as np
import matplotlib
from matplotlib import pyplot as plt
from pandas import DataFrame,Series
from sklearn.externals import joblib

#读取文件夹
data = pd.read_csv('train.csv',encoding = "gbk")
#将数据用(二维)数组的形式表示
dataset_1= data[['属性1','属性2','属性3']]
dataset_1 = dataset_1.values

#对数据进行标准化
from sklearn.preprocessing import StandardScaler
# 导入标准化模块
ss = StandardScaler()
std_data = ss.fit_transform(dataset_1)

# 导入“cluster”模块
from sklearn import cluster
# 创建KMeans模型
clf = cluster.KMeans(init='k-means++', n_clusters=10, random_state=42)
clf.fit(std_data)

# 模型保存
# joblib.dump(clf,"train_2.m")

clu_l = clf.labels_
clu_c = clf.cluster_centers_
print("簇数:",len(clu_c)) #获取簇数
print("质心坐标:",clu_c) #获取标准化质心坐标
print("原质心坐标为:",ss.inverse_transform(clu_c)) # 获取原质心坐标
print("聚类对应标签为:",clu_l) #获取所有标签

# 统计每个簇的点有多少个。
dict = {0:0,1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0,9:0,10:0,11:0,12:0,13:0,14:0,15:0}
for i in clu_l:
	dict[i] = dict[i]+1
print("每个簇内点数为:",dict)

import sklearn.metrics as sm
# 计算 轮廓系数,CH 指标,DBI
s1 = sm.silhouette_score(std_data, clu_l, metric='euclidean')  # 计算轮廓系数
s2 = sm.calinski_harabasz_score(std_data, clu_l)  # 计算CH score
s3 = sm.davies_bouldin_score(std_data, clu_l)  # 计算 DBI
print("轮廓系数:",s1)
print("ch score:",s2)
print("DBI:",s3)

MeanShift聚类(均值漂移)

均值漂移聚类是基于密度的聚类,运行速度相较于K-Means会慢很多。

import pandas as pd
import numpy as np
import matplotlib
from matplotlib import pyplot as plt

#读取文件夹
data = pd.read_csv('train.csv',encoding = "gbk")

#选取需要用来聚类的属性,将数据用(二维)数组的形式表示
dataset_1= data[['属性1','属性2','属性3']]
dataset_1 = dataset_1.values

# 对数据进行标准化
from sklearn.preprocessing import StandardScaler
# 导入标准化模块
ss = StandardScaler()
std_data = ss.fit_transform(dataset_1)

# 自动计算均值漂移带宽
from sklearn.cluster import estimate_bandwidth,MeanShift
bandwidth = estimate_bandwidth(std_data,quantile=0.5,n_samples=len(dataset_1))


#初始化聚类模型,带宽,网格化数据点(加速模型速度) bin_seeding:加速模型
meanshift = MeanShift(bandwidth=bandwidth,bin_seeding=True)
meanshift.fit(std_data)

clu_l = meanshift.labels_
clu_c = meanshift.cluster_centers_
print("标准化标签质心坐标为:",clu_c,",簇数:",len(clu_c)) #获取所有质心坐标
print("原质心坐标为:",ss.inverse_transform(clu_c))
print("聚类对应标签为:",clu_l) #获取所有标签

# 统计每个簇的点有多少个。
dict = {0:0,1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0,9:0,10:0,11:0,12:0,13:0,14:0,15:0,16:0,17:0,18:0,19:0,20:0,21:0,22:0,23:0,24:0,25:0}
for i in clu_l:
	dict[i] = dict[i]+1
print("每个簇内点数为:",dict)

# 输出轮廓系数
import sklearn.metrics as sm
# 计算 轮廓系数,CH 指标,DBI
s1 = sm.silhouette_score(std_data, clu_l, metric='euclidean')  # 计算轮廓系数
s2 = sm.calinski_harabasz_score(std_data, clu_l)  # 计算CH score
s3 = sm.davies_bouldin_score(std_data, clu_l)  # 计算 DBI
print("轮廓系数:",s1)
print("ch score:",s2)
print("DBI:",s3)

如何选择聚类方法

K-means聚类是基于距离的聚类,计算速度快,聚类结果的簇内分布点比较接近质心,能够很好地根据质心来划分标签,但对于集中分布形状不规则的数据点无法聚类成一个簇。
均值漂移聚类基于密度聚类,计算速度慢,可以识别出形状不规则的簇。但对于本身分布情况不太好的的数据集,聚类的结果可能会比较古怪。