1.如何定义K-Means聚类算法中K的值?
原理:kmeans算法通过预先设定的k值以及初始质心对相似的数据点进行划分,划分后根据一个类簇内所有点重新计算中心点,再迭代进行分配和更新簇中心点的步骤,直至簇的中心点变化很小,或者达到给定的迭代次数。
选择k值:根据经验,
手肘法:随着聚类数k的增大,样本会被划分的更加精细,每个簇的聚合程度会逐渐提高,误差平方和SSE会逐渐变小。给定一个合适的类簇指标,比如平均半径或直径,当k小于真实聚类数时,由于k的增大会大幅增加每个簇的聚合程度,故SSE的下降幅度会很大,而当k到达真实聚类数时,再增加k所得到的聚合程度回报会迅速变小,所以SSE的下降幅度会骤减,然后随着k值的继续增大而趋于平缓,也就是说SSE和k的关系图是一个手肘的形状,而这个肘部对应的k值就是数据的真实聚类数。
轮廓系数法:求出所有样本的轮廓系数后再求平均值就得到了平均轮廓系数。平均轮廓系数的取值范围为[-1,1],且簇内样本的距离越近,簇间样本距离越远,平均轮廓系数越大,聚类效果越好。那么,很自然地,平均轮廓系数最大的k便是最佳聚类数。
Kmeans算法对数据集要求:
数值型数据
不能计算缺失值,数据有缺失必须进行缺失值替换
运行效率不高,对于大数据集处理效率比较慢
对维度敏感,一般在算法运行前进行特征选择或者主成分分析。
2.列举至少3中定义K-Means聚类算法中K的方法。
手肘法,轮廓系数法,经验法,kalinski-harabasz方法
3.除此之外你还知道哪些聚类算法?
原型聚类:kmeans
密度聚类:DBSCAN
层次聚类:自上而下,自下而上(时间复杂度高)
基于模型、网络
4.介绍一下DBSCAN算法。
从样本密度的角度来考察样本之间的可连接性,并基于可连接样本不断扩展聚类簇以获得最终的聚类结果。先任选数据集中一个核心对象为种子,再由此出发确定相应的聚类簇。
从任一对象p开始,寻找并合并核心p对象直接密度可达的对象;如果p是一个核心点,则找到了一个聚类,如果是一个边界点,则找寻下一个对象点。直到所有点都被处理。
需要输入半径和领域内最少点数。
5.简述下分层凝聚聚类(Hierarchical Agglomerative clustering)的工作原理。
首先把每一个样本点当做一个聚类,然后不断重复将其中距离最近的两个聚类进行合并。直到满足迭代终止条件。
6.解释一下主成分分析算法(PCA),简述下使用PCA算法的数学步骤。
PCA是一种数据降维算法,主要思想是将n维特征映射到k维上,这k维是全新的正交特征也就是主成分,是在原有n维特征的基础上重新构造出来的k维特征。
过程就是首先选择第一个坐标轴为原始数据中方差最大的方向,第二个为与第一个坐标轴正交的平面中方差最大的方向;第三个是与前两个正交中方差最大的方向,以此类推得到n个这样的坐标轴。发现大部分方差都包含在前k个坐标轴中,后面的坐标轴所含的方差基本为0。相当于只保留包含绝大部分方差的维度特征,实现对数据特征的降维处理。
数学步骤:基于特征值分解协方差矩阵实现PCA
去平均值;计算协方差矩阵;用特征值分解的方式求协方差矩阵的特征值与特征向量;对特征值从大到小排序,选择其中最大的k个,然后将其对应的k个特征向量分别作为行向量组成特征向量矩阵P;将数据转换到k个特征向量构建成的新空间中。
7.使用 PCA算法有哪些缺点?
主成分其解释含义往往具有一定的模糊性。
贡献率较小的成分往往可能含有对样本差异的重要信息。
特征值矩阵的正交向量空间是否唯一有待讨论。
无监督学习。
8.kmeans代码实现
import numpy as np
def loadDataSet(filename):
data = np.loadtxt(filename, delimiter = '\t')
return data
def distEclud(x, y):
return np.sqrt(np.sum((x-y)**2))
def randCent(dataSet, k):
m, n = dataSet.shape
centoids = np.zeros((k, n))
for i in range(k):
index = int(np.random.uniform(0, m))
centoids[i,:] = dataSet[index, :]
return centoids
def KMeans(dataSet, k):
m = np.shape(dataSet)[0] #numbers of row
#第一列存储属于哪一簇,第二列存储到中心点的误差
clusterAssment = np.mat(np.zeros((m, 2)))
clusterChange = True
#第一步:初始化中心点
centoids = randCent(dataSet, k)
while clusterChange:
clusterChange = False
#遍历所有样本(行数)
for i in range(m):
minDist = 100000.0
minIndex = -1
#第二步:遍历所有的质心,找出最近的质心
for j in range(k):
distance = distEclud(centoids[j, :], dataSet[i,:])
if distance < minDist:
minDist = distance
minIndex = j
#第三步:更新每一行样本所属的簇
if clusterAssment[i, 0] != minIndex:
clusterChange = True
clusterAssment[i, :] = minIndex, minDist**2
#第四步:更新质心
for j in range(k):
pointsInCluster = dataSet[np.nonzero(clusterAssment[:,0].A == j)[0]]
centoids[j,:] = np.mean(pointsInCluster, axis = 0)
return centoids, clusterAssment
9.DBSCAN半径的确定:
K距离曲线
绘制所有点计算其对应的第k个最近邻域距离,所有点的k距离将序排列,第一个谷值点对应的选为k,一般取k=4.