聚类
把相似的对象通过静态分类的方式分成不同的组别或者更多的子集。同一子集中的对象都有相似的属性。
K-Means聚类算法:
K-Means是找到给定数据集k个簇的算法。簇的个数K是由用户指定的,每一个簇通过其质心(簇中所有点的中心)来描述。
K-Means聚类算法的原理:
1.创建k个点作为起始质心(通常都是随机选择的)。
2.计算数据集中每个数据点到质心的距离,距离哪个质心近,就属于哪一个分类。
3.对每一个簇中所有的数据点,计算他们的平均值作为新的质心,并重新计算每一个数据点到质心的距离,重新分类。
4.再次计算每一个簇中所有数据点的平均值作为质心。如果发现无论质心怎么改变,每一个数据点的分类都不再发生变化时,就说明分类完成,结束算法。
K-Means算法的代码实现:
下面是一部分航空数据集,我们根据已有数据集对用户做一下聚类分析,把有相似特征的用户聚类到一起。
代码实现:
import pandas as pd
from sklearn.cluster import KMeans
# 加载数据
data = pd.read_csv(r'G:\学习文件\机器学习\data_mining_data\k_means\air_data.csv')
data.info()
# 数据整理
features = data[['FFP_DATE',
'AGE',
'LOAD_TIME',
'FLIGHT_COUNT',
'SEG_KM_SUM',
'avg_discount']]
features = features.dropna()
dafeaturesta = features.drop_duplicates(keep='first')
features.columns = ['注册日期',
'年龄',
'截止日期',
'飞行统计次数',
'飞行总里程',
'平均折扣率']
features['入会时长'] = pd.to_datetime(features['截止日期']) - pd.to_datetime(features['注册日期'])
features.drop(columns=['注册日期', '截止日期'], inplace=True)
features['入会时长'] = features['入会时长'].map(lambda t: t.days)
# 归一化
features = (features - features.mean()) / features.std()
# print(features)
# 定义K
k = 7
# 训练模型
k_model = KMeans(n_clusters=k)
k_model.fit(features)
# 打印质心
print(k_model.cluster_centers_)
# 查看分类结果
print(k_model.labels_)
print(k_model.labels_[30:50])
质心
[[ 7.66458826e-02 1.38920062e+00 1.33341413e+00 6.60202426e-02
3.04533775e-01]
[ 2.27143907e-01 4.04271368e+00 4.02495705e+00 5.34463767e-01
7.10255471e-01]
[-6.16089055e-01 -3.10997453e-01 -3.33976389e-01 4.53128262e-01
-6.51210907e-01]
[ 1.31459171e+00 -2.87113603e-01 -2.55012030e-01 -1.69101470e-01
-3.44912893e-01]
[ 2.18527488e-01 -2.51196973e-01 -2.53378964e-01 -9.01911405e-02
1.25405550e+00]
[-7.38657868e-01 -4.21859060e-01 -3.81240728e-01 -9.96703591e-01
-6.47485754e-01]
[ 8.12051011e-01 1.72118613e-03 2.61166632e-03 3.00618100e+00
3.07999119e-01]]
分类结果
[1 1 1 ... 5 5 5]
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]
解释一下质心为什么是7行5列:
我们的数据一共选取了5个特征(数据整理的时候增加了一列删除了两列),每个特征都有自己的均值。
我们定义了k=7,也就是分成了7个簇,每个簇中有5个特征。所以质心是7行5列。