无监督学习——k均值

news2025/1/19 14:33:39

文章目录

  • 聚类
    • k均值
      • 代码实现
        • 1. 引入依赖
        • 2. 数据加载
        • 3. 算法实现
        • 4. 测试

无监督学习重要的应用有两类:聚类、降维。

聚类:

  • k均值

  • 基于密度的聚类

  • 最大期望聚类

降维:

  • 潜语义分析(LSA)

  • 主成分分析(PCA)

  • 奇异值分解(SVD

这里主要说下k均值方法

聚类

k均值

k值是指,聚的类的个数

在这里插入图片描述

(a)原始数据

(b)随机取两个初始点(质心点)(一般是在已有的数据中选择)

(c)基于KNN近邻思想,跟谁近分到谁的那一类

(d)更新质心点(根据两类的均值)

(e)再来一轮划分

(f)更新质心点…迭代完成

  • k均值(k-means)是聚类算法中最为简单、高效的,属于无监督学习算法
  • 核心思想:由用户指定k个初始质心(initial centroids),以作为聚类的类别(cluster),重复迭代直至算法收敛
  • 基本算法流程
    • 选取k个初始质心(作为初始cluster)
    • repet:
      • 对每个样本点,计算得到距其最近的质心,将其类别标记为该质心所对应的cluster
      • 重新计算k个cluster对应的质心
    • until质心不在发生变化,或迭代达到上限

代码实现

1. 引入依赖

import numpy as np
import matplotlib.pyplot as plt

# 从sklearn中直接生成聚类数据
# from sklearn.datasets.samples_generator import make_blobs # 新版本更改
from sklearn.datasets import make_blobs

2. 数据加载

# n_sanmples表示样本点的个数,centers表示中心点的个数
x, y = make_blobs( n_samples=100, centers=6, random_state=1234, cluster_std=0.6 )
# x是100个数据点的坐标,y表示类别(y暂时没用)
plt.figure(figsize=(6,6)) # 看起来舒服点
plt.scatter(x[:,0], x[:,1], c=y) # c表示color,y取不同值有不同的颜色
plt.show()

在这里插入图片描述

3. 算法实现

# 引入scipy中的距离函数,默认欧式距离
from scipy.spatial.distance import cdist

class K_Means(object):
    # 初始化,参数 n_clusters(K)、迭代次数 max_iter、初始质心 centroids
    def __init__(self, n_clusters=6, max_iter=300, centroids=[]):
        self.n_clusters = n_clusters
        self.max_iter = max_iter
        self.centroids = np.array( centroids, dtype=np.float ) # 转化为numpy中的矩阵
        
    # 训练模型方法,k-means聚类过程,传入原始数据
    def fit(self, data):
        # 假如没有指定初始质心,就随机选取data中的点作为初始质心
        if( self.centroids.shape == (0,) ):
            # 从data中随机生成0到data行数的6个整数,作为索引值
            self.centroids = data[ np.random.randint( 0, data.shape[0], self.n_clusters ) ,: ]
            
        # 开始迭代
        for i in range(self.max_iter):
            # 1. 计算距离矩阵,得到的是一个100*6的矩阵,每一行代表一个样本点距离所有质心的距离
            distances = cdist(data, self.centroids)
            
            # 2. 对距离按有近到远排序,选取最近的质心点的类别,作为当前点的分类
            c_ind = np.argmin( distances, axis=1 )
            
            # 3. 对每一类数据进行均值计算,更新质心点坐标
            for i in range(self.n_clusters):
                # 排除掉没有出现在c_ind里的类别
                if i in c_ind:
                    # 选出所有类别是i的点,取data里面坐标的均值,更新第i个质心
                    self.centroids[i] = np.mean( data[c_ind==i], axis=0 )
    
    # 实现预测方法
    def predict(self, samples):
        # 跟上面一样,先计算距离矩阵,然后选取距离最近的那个质心的类别
        distances = cdist(samples, self.centroids)
        c_ind = np.argmin( distances, axis=1 )
        
        return c_ind

4. 测试

# 定义一个绘制子图函数
def plotKMeans(x, y, centroids, subplot, title):
    # 分配子图,121表示1行2列的子图中的第一个
    plt.subplot(subplot)
    plt.scatter(x[:,0], x[:,1], c='r')
    # 画出质心点
    plt.scatter(centroids[:,0], centroids[:,1], c=np.array(range(6)), s=100)
    plt.title(title)

kmeans = K_Means(max_iter=300, centroids=np.array([[2,1],[2,2],[2,3],[2,4],[2,5],[2,6]]))

plt.figure(figsize=(16, 6))
plotKMeans( x, y, kmeans.centroids, 121, 'Initial State' )

# 开始聚类
kmeans.fit(x)

plotKMeans( x, y, kmeans.centroids, 122, 'Final State' )

# 预测新数据点的类别
x_new = np.array([[0,0],[10,7]])
y_pred = kmeans.predict(x_new)

print(kmeans.centroids)
print(y_pred)

plt.scatter(x_new[:,0], x_new[:,1], s=100, c='black')

输出:

[[ 5.76444812 -4.67941789]
 [-2.89174024 -0.22808556]
 [-5.89115978  2.33887408]
 [-4.53406813  6.11523454]
 [-1.15698106  5.63230377]
 [ 9.20551979  7.56124841]]
[1 5]

在这里插入图片描述

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

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

相关文章

AcWing算法提高课-1.3.11二维费用的背包问题

宣传一下算法提高课整理 <— CSDN个人主页&#xff1a;更好的阅读体验 <— 本题链接&#xff08;AcWing&#xff09; 点这里 题目描述 有 N N N 件物品和一个容量是 V V V 的背包&#xff0c;背包能承受的最大重量是 M M M。 每件物品只能用一次。体积是 v i v_…

【C++系列P3】‘类与对象‘-三部曲——[精讲](1/3)

前言 大家好吖&#xff0c;欢迎来到 YY 滴 C系列 &#xff0c;热烈欢迎&#xff01; 【 类与对象-三部曲】的大纲主要内容如下&#xff1a; 如标题所示&#xff0c;本章是【 类与对象-三部曲】三章中的第一章节——基础知识章节&#xff0c;主要内容如下&#xff1a; 目录 一.…

apache-jmeter:点击可视化界面闪退和中文乱码Failed to write core dump

目录 1、点击界面闪退1.1、问题描述1.2、解决方法 2、处理返回结果乱码问题3、中文界面乱码3.1、问题描述3.2、解决方法 1、点击界面闪退 1.1、问题描述 Java运行环境 $ java -version java version "1.8.0_251" Java(TM) SE Runtime Environment (build 1.8.0_25…

学生成绩管理系统(C语言有结构体实现)

目录标 一、要实现的功能1.首次运行2. 成绩录入3. 显示录入的成绩4. 计算平均值5. 对平均分排序6. 查询学生成绩7. 清屏8. 显示帮助菜单9. 系统 二、实现代码&#xff08;一&#xff09;所有代码在一个文件&#xff08;v1&#xff09;&#xff08;二&#xff09;分文件编写&…

全志V3S嵌入式驱动开发(制作根文件系统)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 根文件系统是嵌入式开发很重要的一环。目前对于大多数soc来说&#xff0c;制作嵌入式系统就是配置buildroot文件。今天使用的buildroot版本是build…

一个字牛!腾讯大牛把《数据结构与算法》讲透了,带源码笔记

话不多说&#xff0c;直接先上图 经历过校招的人都知道&#xff0c;算法和数据结构都是不可避免的。 在笔试的时候&#xff0c;最主要的就是靠算法题。像拼多多、头条这种大公司&#xff0c;上来就来几道算法题&#xff0c;如果你没AC出来&#xff0c;面试机会都没有。 在面试…

上午在改BUG,下午就被通知优化了····

前段时间&#xff0c;爱奇艺被曝出大规模裁员的消息&#xff0c;裁员比例为20%-40%&#xff0c;对此&#xff0c;爱奇艺并未回应。有多位爱奇艺员工向深燃证实了裁员消息。“现在&#xff0c;空了好些工位。”一位爱奇艺员工表示。据他了解&#xff0c;仅爱奇艺文学&#xff0c…

21天学会C++:Day5----引用

CSDN的uu们&#xff0c;大家好。这里是C入门的第五讲。 座右铭&#xff1a;前路坎坷&#xff0c;披荆斩棘&#xff0c;扶摇直上。 博客主页&#xff1a; 姬如祎 收录专栏&#xff1a;C专题 目录 1. 知识引入 2. 引用的特性 2.1 引用在定义时必须初始化 2.2 一个变量可以有多…

车间静电消除不掉?静电接地桩来帮忙!

静电接地桩的原理是通过将金属导体与地面相连&#xff0c;以便在设备运行时能够稳定地将静电荷自然地释放到地面中&#xff0c;从而保护人员和设备不受到静电的危害。 在工业生产中&#xff0c;静电容易在人体和物体表面积聚&#xff0c;如果不及时地排放处理会对人员和设备造…

【算法】简单讲解如何使用两个栈实现一个队列

文章目录 什么是栈和队列&#xff1f;设计思路代码实现 什么是栈和队列&#xff1f; 栈和队列其实大家基本都知道是什么&#xff0c;或者说&#xff0c;最基本的&#xff0c;他们的特性我们是知道的。 栈是一种FILO先进后出的数据结构&#xff0c;队列是一种FIFO先进先出的数据…

SRS流媒体服务器 ---- st-thread框架

1.使用st-thread 我们用一个简单的demo研究一下st框架。 #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include "st.h"static void *_thread(void *arg) {printf("thread: %lu\n", pthread_self());return NULL; }i…

实例6.1 六度空间

“六度空间”理论又称作“六度分隔&#xff08;Six Degrees of Separation&#xff09;”理论。这个理论可以通俗地阐述为&#xff1a;“你和任何一个陌生人之间所间隔的人不会超过六个&#xff0c;也就是说&#xff0c;最多通过五个人你就能够认识任何一个陌生人。”如图1所示…

MySql MVCC 详解

注意以下操作都是以InnoDB引擎为操作基准。 一&#xff0c;前置知识准备 1&#xff0c;MVCC简介 MVCC 是多版本并发控制&#xff08;Multiversion Concurrency Control&#xff09;的缩写。它是一种数据库事务管理技术&#xff0c;用于解决并发访问数据库的问题。MVCC 通过创…

ROS学习——Gazebo中搭建模型并显示

一、打开gazebo搭建模型 gazebo 在gazebo界面左上角点击“Edit”——>"Building Editor"进入下图的模型搭建界面。可以自己利用左边的材料搭建模型。 点击墙壁之类的物品&#xff0c;右键&#xff0c;点击“Open Wall Inspector”按钮&#xff0c;就会出现可以调…

jmeter做接口压力测试_jmeter接口性能测试

jmeter是apache公司基于java开发的一款开源压力测试工具&#xff0c;体积小&#xff0c;功能全&#xff0c;使用方便&#xff0c;是一个比较轻量级的测试工具&#xff0c;使用起来非常简单。因为jmeter是java开发的&#xff0c;所以运行的时候必须先要安装jdk才可以。jmeter是免…

第11届蓝桥杯Scratch省赛真题集锦

编程题 第 1 题 问答题 对对碰 题目说明 编程实现 对对碰 两两相同的一共四张扣下的纸牌&#xff0c;每次先后翻开两张。如果两张一样就消失&#xff0c;如果两张不一样就重新扣下。当舞台上所有纸牌都消失&#xff0c;就过关了 .1)创建四个经牌角色&#xff0c;每张纸牌…

linuxOPS基础_Linux文件管理

Linux下文件命名规则 可以使用哪些字符&#xff1f; 理论上除了字符“/”之外&#xff0c;所有的字符都可以使用&#xff0c;但是要注意&#xff0c;在目录名或文件名中&#xff0c;不建议使用某些特殊字符&#xff0c;例如&#xff0c; <、>、&#xff1f;、* 等&…

表单重复提交:

1. 表单重复提交原因 当用户提交完请求&#xff0c;浏览器会记录最后一次请求的全部信息。用户按下功能键F5&#xff0c;就会发起浏览器记录的最后一次请求。如果最后一次请求为添加操作&#xff0c;那么此时刷新按钮就会再次提交数据&#xff0c;造成表单重复提交。 2. 表单…

Hive优化

Hive的本质是MapReduce&#xff0c;优化其实大部分是对mapreduce的优化 hive优化目标&#xff1a;①横向增加并发&#xff0c;②纵向减少依赖 //开启mapjoin&#xff0c;默认为 true • set hive.auto.convert.join true; //开启map端数据聚合 • hive.map.aggrtrue&…

API的应用范围主要有哪些方面?

API&#xff08;Application Programming Interface&#xff09;即应用程序接口&#xff0c;它是一组规则和工具&#xff0c;通过 HTTP 协议将两个软件应用程序之间的通信连接起来。API 的设计可以使不同应用程序的数据和功能进行交互和共享&#xff0c;从而促进了各种应用程序…