一、基本概念
聚类的概念:一种无监督的学习,事先不知道类别,自动将相似的对象归到同一个簇中。
应用场景:文档分类器、客户分类、保险欺诈检测、 乘车数据分析
二、距离计算
对于有序距离
其中P=1为曼哈顿距离
P=2为欧氏距离
对于无序距离
使用VDM距离:
其中 mu,a,i表示在第i个样本簇中属性u上取值为a的样本数
mu,a表示属性u上取值为a的样本数
k为样本簇数
混合距离
使用闵科夫斯基距离和VDM的混合
其中nc为有序属性个数
加权距离
根据不同属性的重要性,可使用“加权”距离
二、聚类算法的分类
2.1 基于原型的聚类
①、Kmeans算法
主要思想:
在给定K值和K个初始类簇中心点的情况下,把每个点(亦即数据记录)分到离其最近的类簇中心点所代表的类簇中,所有点分配完毕之后,根据一个类簇内的所有点重新计算该类簇的中心点(取平均值),然后再迭代的进行分配点和更新类簇中心点的步骤,直至类簇中心点的变化很小,或者达到指定的迭代次数。
K值选取原则:评价效果好且结果可解释
初始点的选取原则: 尽可能远
优点:
1、解决聚类问题的经典算法,简单
2、当处理大数据集时,该算法保持可伸缩性和高效率
3、当簇近似为高斯分布时,它的效果较好
缺点:
1、在簇的平均值可被定义的情况下才能使用,可能不适用于某些应用
2、必须实现给出k(要生成簇的数目),而且对初值敏感,即对于不同的初值,可能会导致不同结果
3、不适合非凸形状的簇或者大小差别很大的簇
4、对噪声和孤立点敏感
②、学习向量量化(LVQ)
③、高斯混合聚类
基于密度的聚类
练习
亚洲足球队实力聚类
import numpy as np
import pandas as pd
from pandas import Series, DataFrame
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
from sklearn.cluster import KMeans
from mpl_toolkits.mplot3d import axes3d
# 导入数据集
data = pd.read_csv('AsiaZoo.txt', header=None)
data.columns = ["国家","2006世界杯","2010世界杯","2007亚洲杯"]
X = data.iloc[:,1:]
km = KMeans(n_clusters=3)
y_ = km.fit_predict(X)
sns.set_style(style='white')
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 绘制聚类后的散点图
plt.figure(figsize=(10,6))
ax = plt.subplot(projection = '3d')
ax.scatter3D(data['2006世界杯'], data['2010世界杯'], data['2007亚洲杯'], s=200, c= y_, alpha=1)
ax.set_xlabel('2006世界杯')
ax.set_ylabel('2010世界杯')
ax.set_zlabel('2007亚洲杯')
plt.show()
# 查看每个类的球队
data['类别'] = y_
for _, indexes in data.groupby('类别').groups.items():
countrys = data.loc[indexes, '国家']
for country in countrys:
print(country, end=' ')
print()
数据集:
散点图:
每个类别球队: