【无监督学习之聚类】

news2024/10/1 21:37:34

聚类

    • 0.简介
    • 距离 和 相似度
    • 1. K均值聚类(kmeans)
      • 模型
      • 算法
      • 特点
    • 2. 谱聚类(Spectral clustering)
      • 算法思想
      • 特点
      • 谱聚类的具体步骤:
      • 算法步骤:
    • 3.小结
    • 参考资料

0.简介

聚类:针对给定的样本,依据他们的属性的相似度或距离,将其归并到若干个“簇”或“类”的数据分析问题。

  • 类:样本的子集。直观上,相似的样本聚集在同类,不相似的样本分散在不同类。

距离 和 相似度

距离 和 相似度量在聚类中十分重要。

常用的距离度量有:

  • 闵可夫斯基距离
    d i j = ( ∑ k = 1 m ∣ x k i − x k j ∣ p ) 1 p p ≥ 1 d_{ij}=\left(\sum_{k=1}^m|x_{ki}-x_{kj}|^p\right)^\frac{1}{p}\\p \ge 1 dij=(k=1mxkixkjp)p1p1

  • 欧氏距离

  • 曼哈顿距离

  • 切比雪夫距离

  • 马哈拉诺比斯距离
    d i j = [ ( x i − x j ) T S − 1 ( x i − x j ) ] 1 2 d_{ij}=\left[(x_i-x_j)^\mathrm TS^{-1}(x_i-x_j)\right]^{\frac{1}{2}} dij=[(xixj)TS1(xixj)]21

常用的相似度量有:

  • 相关系数
    x r i j = ∑ k = 1 m ( x k i − x ˉ i ) ( x k j − x ˉ j ) [ ∑ k = 1 m ( x k i − x ˉ i ) 2 ∑ k = 1 m ( x k j − x ˉ j ) 2 ] 1 2 x ˉ i = 1 m ∑ k = 1 m x k i x ˉ j = 1 m ∑ k = 1 m x k j x r_{ij}=\frac{\sum\limits_{k=1}^m(x_{ki}-\bar x_i)(x_{kj}-\bar x_j)}{\left[\sum\limits_{k=1}^m(x_{ki}-\bar x_i)^2\sum\limits_{k=1}^m(x_{kj}-\bar x_j)^2\right]^\frac{1}{2}}\\\bar x_i=\frac{1}{m}\sum\limits_{k=1}^mx_{ki}\\\bar x_j=\frac{1}{m}\sum\limits_{k=1}^mx_{kj} xrij=[k=1m(xkixˉi)2k=1m(xkjxˉj)2]21k=1m(xkixˉi)(xkjxˉj)xˉi=m1k=1mxkixˉj=m1k=1mxkj

  • 夹角余弦
    s i j = ∑ k = 1 m x k i x k j [ ∑ k = 1 m x k i 2 ∑ k = 1 m x k j 2 ] 1 2 s_{ij}=\frac{\sum\limits_{k=1}^m x_{ki}x_{kj}}{\left[\sum\limits_{k=1}^mx_{ki}^2\sum\limits_{k=1}^mx_{kj}^2\right]^\frac{1}{2}} sij=[k=1mxki2k=1mxkj2]21k=1mxkixkj

用距离度量相似度时,距离越小表示样本越相似。用相关系数时,相关系数越大表示样本越相似。

1. K均值聚类(kmeans)

K均值聚类是常用的聚类方法。

模型

在这里插入图片描述

算法

  • 首先选择k个类的中心
  • 将样本分到与其最近的中心所在的类,得到一个初始的聚类结果
  • 然后计算每个类的样本的均值,作为类的新的中心
  • 重复以上步骤,直到收敛(类的中心随着迭代不发生位移)为止
import numpy as np
import matplotlib.pyplot as plt

# kmeans
class MyKmeans:
    def __init__(self, k, n=20):
        self.k = k                #质心个数
        self.n = n                  #迭代次数
    
    def fit1(self, x, centers=None):
        # step1 : 随机选择 K 个点, 或者指定
        if centers is None:
            idx = np.random.randint(low=0, high=len(x), size=self.k)
            centers = x[idx]
        #print(centers)
        else:
            centers = x[centers]
        
        inters = 0 # 迭代计数器
        # 迭代n次或质心不发生移动时结束循环
        while inters < self.n:
            print(inters)
            print(centers)

            points_set = {key: [] for key in range(self.k)}#聚类集合

            # step2,遍历所有点 P,将 P 放入最近的聚类中心的集合中
            for p in x:
                nearest_index = np.argmin(np.sum((centers - p) ** 2, axis=1) ** 0.5)#计算最近的质心
                points_set[nearest_index].append(p)#将p放入计算出的最近的聚类中心的点集中

            # step3,遍历每一个点集,更新每个点集的质心
            for i_k in range(self.k):
            
                centers[i_k] = sum(points_set[i_k])/len(points_set[i_k])
            inters += 1

        return points_set, centers

# 随机生成一个样本数为100的二维点集
np.random.seed(123)
data = np.random.rand(100,2)
data = data*10

# 聚类
m = MyKmeans(2,50)
points_set1, centers1 = m.fit1(data,centers=[0,1])

# 结果可视化

cat1 = np.asarray(points_set1[0])
cat2 = np.asarray(points_set1[1])

#绘制图像
#plt.figure(1)
for ix, p in enumerate(centers1):
    plt.scatter(p[0], p[1], color='C{}'.format(ix), marker='^', edgecolor='black', s=256)
plt.scatter(cat1[:,0], cat1[:,1], color='green')
plt.scatter(cat2[:,0], cat2[:,1], color='red')

plt.title('Hierarchical clustering 1')
plt.xlim(0, 11)
plt.ylim(0, 11)
plt.show()
        

在这里插入图片描述

特点

K均值聚类属于基于划分的聚类方法;

  • 类别(簇)数 k k k需要事先设定
  • 距离度量或相似度:欧氏距离平方
  • 以中心或样本的均值表示类别
  • 以样本和其所属类的类中心的距离的总和作为可优化的目标函数。
  • 得到的类别是平坦的,分层次化的
  • 算法属于迭代算法,不能保证得到全局最优

2. 谱聚类(Spectral clustering)

谱聚类是一种基于图论的聚类算法,在介绍谱聚类算法原理之前,首先介绍下图的相关概念。

算法思想

它的主要思想:把所有数据看成空间中的点,这些点之间可以用边连接起来,距离较远的两个点之间的边权重较低,而距离较近的两个点之间的权重较高,通过对所有数据点组成的图进行切图,让切图后的不同的子图间边权重和尽可能小(即距离远),而子图内的边权重和尽可能高(即距离近)。

特点

谱聚类相较于前面讲到的最最传统的k-means(当然了,也是很好的一个聚类方法,只不过大家都拿它来做个baseline)聚类方法,谱聚类又具有许多的优点:

1.只需要待聚类点之间的相似度矩阵就可以做聚类了。

2.对于不规则的数据(或者说是离群点)不是那么敏感,个人感觉主要体现在最小化图切割的公式中(因为在RatioCut的优化策略中要除以一个分母|A|,表示当前聚类中含有点 的个数;另外一种策略是Ncut,会除以一个分母vol(A),表示的是当前聚类中的点的度的集合;有了这两个分母的话,若是离群点单独成一个聚类,会造成这两个优化函数的值变大)

3.k-means聚类算法比较适合于凸数据集(数据集内的任意两点之间的连线都在该数据集以内,简单理解就是圆形,可能不准确),而谱聚类则比较通用。

谱聚类的具体步骤:

1.相似度矩阵S的构建,构建相似度的矩阵的过程中,可以使用欧氏距离、余弦相似度、高斯相似度等来计算数据点之间的相似度,选用哪个要根据你自己的实际情况来。不过在谱聚类中推荐使用的是高斯相似度,但是我在我的工程中使用的是余弦相似度。

2.相似度图G的构建,主要有一下三种方法:

  • 近邻图:在这种图中,我们将距离小于某个阈值的点连接起来。

  • K近邻图:在这种图中,以点i,j为例,如果i是j的k近邻之一,那么将i与j连起来。当然,这会造成相似度图G是一种有向图,因为i是j的k近邻之一,但是j不一定是i的k近邻之一。很像我们生活中:你是我的最好朋友,但是我不一定是你的最好朋友。有两种方法可以将此时的图化为无向图:(1)忽略边的方向性,即只要满足i是j的k近邻之一或者j是i的k近邻之一,那么我们就将与连起来。
    (2)只有满足i是j的k近邻之一而且j是i的k近邻之一,我们才将与连起来。依照(1)方法所得的图被称为k近邻图,依照(2)方法所得的图被称为互k近邻图。

  • 全连接图:在这种图中,我们将所有的点都相互连接起来,同时所有的边的权重设置为相似度。这种图建立的关键在于相似度函数的确立,相似度函数能够较好地反映实际中的相邻关系,那么效果较好。一个相似度函数的例子为高斯相似度函数:,其中参数的选取是个难点。该方法中的参数的作用与近邻图中的的作用是相似的。

    通过构建上述的相似度图G我们可以重新得到一个邻接矩阵W.

3.拉普拉斯矩阵
它的定义很简单,拉普拉斯矩阵。是度矩阵,也就是相似度矩阵的每一行(或者每一列)加和得到的一个对角矩阵。W就是图的邻接矩阵。

4.无向图的切割(也就是求L的特征值和特征向量,之后对特征向量矩阵进行k-means聚类)

算法步骤:

输入:样本集D,相似矩阵的生成方式, 降维后的维度, 聚类方法,聚类后的维度

输出: 簇划分

(1) 根据输入的相似矩阵的生成方式构建样本的相似矩阵S
(2)根据相似矩阵S构建邻接矩阵W,构建度矩阵D
(3)计算出拉普拉斯矩阵L
(4)求L的最小的个特征值所各自对应的特征向量
(6) 将特征向量组成维的特征矩阵F
(7)对F中的每一行作为一个维的样本,共n个样本,用输入的聚类方法进行聚类,聚类维数为。
(8)得到簇划分

import numpy as np 
import matplotlib.pyplot as plt 

from sklearn import cluster, datasets
from sklearn.preprocessing import StandardScaler

np.random.seed(0)

# 构建数据
n_samples = 1500
noisy_circles = datasets.make_circles(n_samples=n_samples, factor=0.5, noise=0.05)
noisy_moons = datasets.make_moons(n_samples=n_samples, noise=0.05)
blobs = datasets.make_blobs(n_samples=n_samples, random_state=8)

data_sets = [
    (
        noisy_circles,
        {
            "n_clusters": 2
        }
    ),
    (
        noisy_moons,
        {
            "n_clusters": 2
        }
    ), 
    (
        blobs, 
        {
            "n_clusters": 3
        }
    )
]
colors = ["#377eb8", "#ff7f00", "#4daf4a"]
affinity_list = ['rbf', 'nearest_neighbors']

plt.figure(figsize=(17, 10))

for i_dataset, (dataset, algo_params) in enumerate(data_sets):
    # 模型参数
    params = algo_params

    # 数据
    X, y = dataset
    X = StandardScaler().fit_transform(X)

    for i_affinity, affinity_strategy in enumerate(affinity_list):
        # 创建SpectralCluster
        spectral = cluster.SpectralClustering(
            n_clusters=params['n_clusters'],
            eigen_solver='arpack', 
            affinity=affinity_strategy
        )

        # 训练
        spectral.fit(X)

        # 预测
        y_pred = spectral.labels_.astype(int)

        y_pred_colors = []

        for i in y_pred:
            y_pred_colors.append(colors[i])
        
        plt.subplot(3, 4, 4*i_dataset+i_affinity+1)
        plt.title(affinity_strategy)
        plt.scatter(X[:, 0], X[:, 1], color=y_pred_colors)

plt.show()

在这里插入图片描述

3.小结

本文介绍的聚类方法有 K均值聚类方法,谱聚类方法。

K均值聚类属于基于划分的聚类方法;类别(簇)数 k k k需要事先设定;距离度量或相似度:欧氏距离平方,以中心或样本的均值表示类别,以样本和其所属类的类中心的距离的总和作为可优化的目标函数。得到的类别是平坦的,分层次化的,算法属于迭代算法,不能保证得到全局最优

谱聚类只需要数据之间的邻接矩阵,因此对于处理稀疏数据的聚类很有效。这点传统聚类算法比如K-Means很难做到。由于使用了降维,因此在处理高维数据聚类时的复杂度比传统聚类算法好,如果最终聚类的维度非常高,则由于降维的幅度不够,谱聚类的运行速度和最后的聚类效果均不好
聚类效果依赖于邻接矩阵,不同的邻接矩阵得到的最终聚类效果可能很不同。

常用的聚类方法除了这些还有,层次化聚类方法,基于混合分布的方法,基于密度的方法。以上的方法是对于样本的聚类方法,除此之外还有对样本和属性同时聚类的方法,如Co-Clustering。

参考资料

《统计学习方法》李航

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/983541.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

spring---第一篇

系列文章目录 文章目录 系列文章目录一、如何实现一个IOC容器二、spring是什么?一、如何实现一个IOC容器 1、配置文件配置包扫描路径 2、递归包扫描获取.class文件 3、反射、确定需要交给IOC管理的类 4、对需要注入的类进行依赖注入 配置文件中指定需要扫描的包路径 定义一些…

【漏洞复现】H3C路由器信息泄露任意用户登录

漏洞描述 通过访问特地址得到密码可进行登录。 免责声明 技术文章仅供参考&#xff0c;任何个人和组织使用网络应当遵守宪法法律&#xff0c;遵守公共秩序&#xff0c;尊重社会公德&#xff0c;不得利用网络从事危害国家安全、荣誉和利益&#xff0c;未经授权请勿利用文章中…

【gcc 报错】/usr/bin/ld: this linker was not configured to use sysroots

解决方法&#xff1a;只需把/usr/bin环境变量设置在前面&#xff0c;系统先查找到该目录下的ld即可 vim /etc/profileexport PATH/usr/bin:$PATHsource /etc/profile

【HTML专栏2】VSCode的使用(新建HTML文件)

本文属于HTML/CSS专栏文章&#xff0c;适合WEB前端开发入门学习&#xff0c;详细介绍HTML/CSS如果使用&#xff0c;如果对你有所帮助请一键三连支持&#xff0c;对博主系列文章感兴趣点击下方专栏了解详细。 博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;HTML/CS…

记录获取蓝鲸智云token的过程

一、使用python脚本获取蓝鲸智云token python版本环境&#xff1a;3.11 # -*- coding: utf-8 -*- import requestsdef get_user_token(domain,user,password):模拟用户登录&#xff0c;并返回 bk_token 和 bk_csrftokenBK_PAAS_HOST domainUSERNAME userPASSWORD password…

如何实现小程序与h5页面间的跳转

接到新需求&#xff0c;要在小程序页面内点击按钮实现跳转h5&#xff0c;一开始没接触过&#xff0c;还挺头疼的&#xff0c;但真正做起来&#xff0c;也就那么一回事啦&#xff0c;废话少说&#xff0c;直接上 1. 配置域名 先登录小程序开发平台&#xff0c;将页面需要跳转的…

Java学习笔记---多态

面向对象三大特征之一&#xff08;继承&#xff0c;封装&#xff0c;多态&#xff09; 多态的应用场景&#xff1a;根据传递对象的不同&#xff0c;调用不同的show方法 一、多态的定义 同类型的对象&#xff0c;表现出的不同形态&#xff08;对象的多种形态&#xff09; 二…

Tomcat详解 一:tomcat的部署

文章目录 1. Tomcat的基本介绍1.1 Tomcat是什么1.2 Tomcat的构成组件1.2.1 Web容器1.2.2 Servlet容器1.2.3 JSP容器&#xff08;JAVA Scripts page&#xff09; 1.3 核心功能1.3.1 Container 结构分析 1.4 配置文件1.5 Tomcat常用端口号1.6 启动和关闭Tomcat 2. 部署Tomcat服务…

DockerCompose部署es和kibana

DockerCompose文件 version: 3.1 services:elasticsearch:image: elasticsearch:7.13.3container_name: elasticsearchprivileged: trueports:- "9200:9200"- "9300:9300"environment:- ES_JAVA_OPTS-Xms128m -Xmx1024m #设置使用jvm内存大小- cluster.na…

【unity3D】如何修改相机的默认视角

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于游戏开发的学习笔记 &#x1f236;本篇是unity的如何修改相机的默认视角 如何修改相机的默认视角 Game窗口运行的话视角是这样的&#xff1a; 此时Scene窗口的视角是这样的&…

申请Tik Tok的菲律宾公会需要什么条件?

近年来的跨境电商出海各个国家&#xff0c;使得跨境电子商务在全球范围内迅猛发展。菲律宾作为东南亚地区的重要经济体之一&#xff0c;其电商市场也呈现出蓬勃的增长势头。本文将介绍菲律宾国内外电商的发展趋势&#xff0c;并分析目前菲律宾的市场团队佳薇cmxyci 神秘代码开启…

论文解读 | 点对照:3D点云理解无监督式预训练

原创 | 文 BFT机器人 《PointContrast: Unsupervised Pre-training for 3D Point Cloud Understanding》是一篇关于三维点云数据理解领域的研究论文&#xff0c;旨在提出一种无监督预训练方法&#xff0c;以改善对三维点云数据的理解。 01 背景 三维点云数据是从传感器&#…

手写Spring:第4章-基于Cglib实现含构造函数的类实例化策略

文章目录 一、目标&#xff1a;含构造函数的类实例化二、设计&#xff1a;含构造函数的类实例化三、实现&#xff1a;含构造函数的类实例化3.1 工程结构3.2 含构造函数的类实例化类图3.3 类实例化策略3.3.1 定义实例化策略接口3.3.2 JDK实例化3.3.3 Cglib实例化 3.4 抽象类定义…

INS惯性导航系统相关技术(概念版)

一、参考资料 组合导航系统生产商 applanix 官网 新手入门系列3——Allan方差分析方法的直观理解 惯性测量单元Allan方差分析详解 IMU标定之—Allan方差 b站视频&#xff1a;武汉大学惯性导航课程合集【2021年秋】 资料下载&#xff1a;PPT&#xff1a;《惯性导航原理与方法》…

nginx-ingress多控制器部署

nginx-ingress直接使用yaml来部署 wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.1/deploy/static/provider/cloud/deploy.yaml修改里面的镜像 多控制器部署实现&#xff1a; 在同一个命名空间中只需要新增一个IngressClass跟 ingress-…

EFG-02-10-31、ERBG-06-B-51电液比例控制调速阀放大器

EFCG-02-10-31、EFG-03-60-26、EFCG-03-125-26、EFCG-03-125-51、EFG-06-250-22、EFCG-06-250-22、EFG-06-250-51、EFCG-02-30-31、ERBG-06-B-51、ERBG-10-C-51、ERBG-06-H-51、ERBG-10-B-51、ERBG-06-C-51、ERBG-10-H-51、EFG-02-10-31、EFCG-03-60-26、EFG-03-125-26、EFG-03…

Mysql存储过程与存储函数

文章目录 1. 简介2. 存储过程的特点3. 存储过程操作语法4. 存储过程变量5. 其它语法6. 存储函数 1. 简介 存储过程是事先经过编译并存储在数据库中的一段SQL集合&#xff0c;调用存储过程可以简化应用开发人员的很多工作&#xff0c;减少数据在数据库和应用服务器之间的传输&a…

生成式AI的JavScript技术栈

如果不使用新的软件基础设施技术&#xff0c;就很难理解它们。 至少&#xff0c;a16z 基础设施团队发现了这一点&#xff0c;而且因为我们中的许多人都是以程序员的身份开始职业生涯的&#xff0c;所以我们经常通过实践来学习。 尤其是生成式AI浪潮的情况尤其如此&#xff0c;它…

使用Blender 在影片剪辑上创建粘滞标签

推荐&#xff1a;使用 NSDT场景编辑器快速搭建3D应用场景 准备场景 步骤 1 在新文件中&#xff0c;右键单击默认立方体和灯光&#xff0c;然后按键盘上的 Del 将其删除。按住 Shift 键&#xff0c;然后右键单击以选择多个对象。 删除默认对象 步骤 2 选择摄像机并按 Alt-R …

问道管理:申购额度如何计算?

在投资领域&#xff0c;很多人会选择申购基金产品。对于大众投资者而言&#xff0c;申购额度是一个较为要害的问题。在此&#xff0c;我们将从多个角度进行剖析&#xff0c;具体解读申购额度怎么核算。 一、基金公司规则 首要&#xff0c;申购额度需要依照基金公司的规则来进行…