机器学习task_05聚类

一个人想着一个人 提交于 2020-01-21 09:15:00

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()
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!