1.相关概念(无监督学习、聚类的定义)
2.性能度量(外部指标、内部指标)
3.距离计算
4.原型聚类
K均值
LVQ
5.高斯混合聚类
层次聚类
AGNES
自顶而下
6.密度聚类
DBSCAN
其他密度聚类算法
7.优缺点
8.sklearn参数详解
聚类分析是按照个体的特征将他们分类,让同一个类别内的个体之间具有较高的相似度,不同类别之间具有较大的差异性
聚类分析属于无监督学习
聚类对象可以分为Q型聚类和R型聚类
Q型聚类:样本/记录聚类 以距离为相似性指标 (欧氏距离、欧氏平方距离、马氏距离、明式距离等)
R型聚类:指标/变量聚类 以相似系数为相似性指标 (皮尔逊相关系数、夹角余弦、指数相关系数等)
二、常用的聚类算法
K-Means划分法
层次聚类法
DBSCAN密度法
1、K-Means划分法
K表示聚类算法中类的个数,Means表示均值算法,K-Means即是用均值算法把数据分成K个类的算法。
K-Means算法的目标,是把n个样本点划分到k个类中,使得每个点都属于离它最近的质心(一个类内部所有样本点的均值)对应的类,以之作为聚类的标准。
算法原理见 http://www.aboutyun.com/thread-18178-1-1.html【转】
K-Means算法的计算步骤
取得k个初始质心:从数据中随机抽取k个点作为初始聚类的中心,来代表各个类
把每个点划分进相应的类:根据欧式距离最小原则,把每个点划分进距离最近的类中
重新计算质心:根据均值等方法,重新计算每个类的质心
迭代计算质心:重复第二步和第三步,迭代计算
聚类完成:聚类中心不再发生移动
以下为k-means代码 python版本
#!/user/bin/env python3
# -*- coding:utf-8 -*-
import numpy as np
from matplotlib import pyplot as plt
from sklearn import datasets
class K_means():
# 1.产生数据
def gen_data(self):
iris = datasets.load_iris()
X, y = iris.data, iris.target
data = X[:, [1, 3]]
return data
# 2.初始化中心点
def random_center(self, data, k):
n = data.shape[1] # 中心点维度
centroids = np.zeros((k, n))
for i in range(n):
dmin, dmax = np.min(data[:, i]), np.max(data[:, i])
centroids[:, i] = dmin + (dmax - dmin) * np.random.random(k) # 这行代码值得推敲,一行产生两个数,由random得到不同的两个数
return centroids
# 3.欧式距离
def _distance(self, p1, p2):
dist = np.sum((p1 - p2) ** 2)
dist = np.sqrt(dist)
return dist
# 4.收敛条件(判断centroids是否更新)
def converged(self, old_centroids, centroids):
set1 = set([tuple(p) for p in old_centroids])
set2 = set([tuple(p) for p in centroids])
return (set1 == set2)
# 5.k_means
def k_means(self, data, k):
#初始化
n = data.shape[0] # 样本个数
centroids = self.random_center(data, k) # 初始化质心
label = np.zeros(n, dtype=np.int) # 初始化样本标签,所以注明int型
converge = False
assenment = np.zeros(n) # 里面保存各样本点到其簇中心的距离,通过距离之和判别聚类的好坏
#聚类
while not converge:
# 计算每个样本点到各个质心的距离
min_dist, min_idx = np.inf, -1
for i in range(n): # 遍历样本
old_centroids = np.copy(centroids) # 备份原质心便于比较
for j in range(k): # 遍历质心
dist = self._distance(data[i], centroids[j])
if dist > min_dist:
min_dist, min_idx = dist, j
label[i] = j
assenment[i] = self._distance(data[i], centroids[label[i]]) # 推敲,label[i]表示第i个样本所属类别,centroids[label[i]]表示对应的类别簇中心
# 更新质心
for i in range(data.shape[1]):
centroids[:, i] = np.mean(data[label == i], axis=0) # 对列求均值
converge = self.converged(old_centroids, centroids)
return centroids, label, np.sum(assenment)
if __name__ == '__main__':
k_means_ = K_means()
data = k_means_.gen_data()
k = 2
# 循环找到最优分类
best_assenment = np.inf
best_centroids = None
best_label = None
for i in range(10):
centroids, label, sum_assenment = k_means_.k_means(data, k)
if sum_assenment < best_assenment:
best_assenment = sum_assenment
best_centroids = centroids
best_label = label
# 可视化
data_0 = data[label == 0]
data_1 = data[label == 1]
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
ax1.scatter(data[:, 0], data[:, 1])
ax2.scatter(data_0[:, 0], data_1[:, 1], c='b', marker='o')
ax2.scatter(data_1[:, 0], data_1[:, 1], c='g', marker='o')
ax2.scatter(centroids[:, 0], centroids[:, 1], c='r', marker='*', s=180)
plt.show()
来源:CSDN
作者:Arrow7TT
链接:https://blog.csdn.net/Arrow7TT/article/details/104057413