聚类是一个将数据对象集划分为多个组或簇的过程,使得簇内的数据对象具有很高的相似性,但不同簇间的对象具有很高的相异性。
K-Means等基于划分的方法是简单、常用的一种聚类方法,是基于距离的,它的基本思想是使簇内的点距离尽量近、簇间的点距离尽量远。基于划分聚类的方法在聚类过程中根据距离来划分类簇,因此只能够用于挖掘球状簇。
DBSCAN等基于密度的聚类算法是根据密度而不是距离来计算样本相似度,所以基于密度的聚类算法能够用于挖掘任意形状的簇,并且能够有效过滤掉噪声样本对于聚类结果的影响。
聚类算法的实现与应用
1.1 K-Means算法实现
样本点分簇函数:实现了一个函数assignment,用于计算数据点到各个质心的距离,并根据距离最短原则分配到最近的质心。
簇心更新函数:实现了一个函数update,用于根据分配给质心的数据点更新质心的位置。
聚类demo与可视化:通过一个小数据集演示了K-Means算法的执行过程,并使用matplotlib库进行了结果的可视化。
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn.cluster import KMeans
from sklearn import datasets
import pandas as pd
import copy
def assignment(df, centroids):
for i in centroids.keys():
# sqrt((x1 - x2)^2 + (y1 - y2)^2)
df['distance_from_{}'.format(i)] = ((df['x'] - centroids[i][0])**2 + (df['y'] - centroids[i][1])**2)**0.5
centroid_distance_cols = ['distance_from_{}'.format(i) for i in centroids.keys()]
df['closest'] = df.loc[:, centroid_distance_cols].idxmin(axis=1)
df['closest'] = df['closest'].map(lambda x: int(x.lstrip('distance_from_')))
df['color'] = df['closest'].map(lambda x: colmap[x])
return df
def update(centroids):
for i in centroids.keys():
centroids[i][0] = np.mean(df[df['closest']==i]['x'])
centroids[i][1] = np.mean(df[df['closest']==i]['y'])
return centroids