05_无监督学习--聚类模型--K 均值

无监督学习--聚类模型--K 均值0.引入依赖1.数据的加载和预处理2.算法实现3.测试


无监督学习--聚类模型--K 均值

0.引入依赖

import numpy as npimport matplotlib.pyplot as plt

# 这里直接 sklearn 里的数据集from sklearn.datasets.samples_generator import make_blobs

1.数据的加载和预处理

x, y = make_blobs(n_samples=100, centers=6, random_state=1234, cluster_std=0.6)# x # array([[-0.02708305,  5.0215929 ], ..., [-4.7583093 ,  5.85803377]])# x.shape # (100, 2)# y.shape # (100,)

plt.figure(figsize=(9, 9))plt.scatter(x[:,0], x[:,1], c=y)plt.show()

作图如下:

2.算法实现

# 引入 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)

    # 定义训练模型方法,实现 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.计算距离,得到的是一个 100x6 的矩阵,该矩阵的每一行含义是:一个样本点跟所有质心的距离            distances = cdist(data, self.centroids)

            # 2.对距离按由近到远排序,选取最近的质心点的类别,作为当前点的分类            c_index = np.argmin(distances, axis=1) # 得到 100x1 的矩阵

            # 3.对每一类数据进行均值计算,更新质心点的坐标            for i in range(self.n_clusters): # 遍历每一类                # 排除掉没有出现在 c_index 里的类别                if i in c_index:                    # 选择所有类别是 i 的点,取 data 里面坐标的均值,更新第 i 个质心                    self.centroids[i] = np.mean(data[c_index==i], axis=0) # 得到一行数据,使用了布尔索引

    # 定义预测模型方法    def predict(self, samples):        # 跟上面一样,先计算距离,然后读取距离最近的那个质心的类别        distances = cdist(samples, self.centroids)        c_index = np.argmin(distances, axis=1) # 得到 100x1 的矩阵

        return c_index

# 测试distances = np.array([[121, 221, 32, 43],                      [121, 332, 166, 52],                      [96, 411, 56, 158],                      [45, 235, 542, 156],                      [140, 54, 63, 255],                     ], dtype=np.float)c_index = np.argmin(distances, axis=1)print(c_index)

x_new =x[0:5]print(x_new)print(c_index==2)print(x_new[c_index==2])np.mean(x_new[c_index==2], axis=0)

输出结果如下:

[2 3 2 0 1][[-0.02708305  5.0215929 ] [-5.49252256  6.27366991] [-5.37691608  1.51403209] [-5.37872006  2.16059225] [ 9.58333171  8.10916554]][ True False  True False False][[-0.02708305  5.0215929 ] [-5.37691608  1.51403209]]

array([-2.70199956,  3.26781249])

3.测试

# 定义一个绘制子图的函数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=(18, 9))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], c=‘black‘, s=100)

输出结果如下:

[[ 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]

<matplotlib.collections.PathCollection at 0x1543350c518>

作图如下:

原文地址:https://www.cnblogs.com/chenmingjun/p/10884548.html

时间: 2024-10-14 10:25:34

05_无监督学习--聚类模型--K 均值的相关文章

初识聚类算法:K均值、凝聚层次聚类和DBSCAN

原文地址http://blog.sina.com.cn/s/blog_62186b460101ard2.html 这里只是将比较重要的部分转一下 另外还有一篇关于层次聚类的 http://blog.csdn.net/jwh_bupt/article/details/7685809 聚类分析就仅根据在数据中发现的描述对象及其关系的信息,将数据对象分组(簇).其目标是,组内的对象相互之间是相似的,而不同组中的对象是不同的.组内相似性越大,组间差别越大,聚类就越好. 先介绍下聚类的不同类型,通常有以下

04_有监督学习--分类模型--K 近邻(kNN)

有监督学习--分类模型--K 近邻(kNN)0.引入依赖1.数据的加载和预处理2.核心算法实现3.测试4.自动化测试 有监督学习--分类模型--K 近邻(kNN) 0.引入依赖 import numpy as np # 数值计算.矩阵运算.向量运算import pandas as pd # 数值分析.科学计算 # 这里直接引入 sklearn 里的数据集 --> iris 鸢尾花from sklearn.datasets import load_irisfrom sklearn.model_se

机器学习经典算法详解及Python实现--聚类及K均值、二分K-均值聚类算法

摘要 聚类是一种无监督的学习(无监督学习不依赖预先定义的类或带类标记的训练实例),它将相似的对象归到同一个簇中,它是观察式学习,而非示例式的学习,有点像全自动分类.说白了,聚类(clustering)是完全可以按字面意思来理解的--将相同.相似.相近.相关的对象实例聚成一类的过程.机器学习中常见的聚类算法包括 k-Means算法.期望最大化算法(Expectation Maximization,EM,参考"EM算法原理").谱聚类算法(参考机器学习算法复习-谱聚类)以及人工神经网络算法

聚类之K均值聚类和EM算法

这篇博客整理K均值聚类的内容,包括: 1.K均值聚类的原理: 2.初始类中心的选择和类别数K的确定: 3.K均值聚类和EM算法.高斯混合模型的关系. 一.K均值聚类的原理 K均值聚类(K-means)是一种基于中心的聚类算法,通过迭代,将样本分到K个类中,使得每个样本与其所属类的中心或均值的距离之和最小. 1.定义损失函数 假设我们有一个数据集{x1, x2,..., xN},每个样本的特征维度是m维,我们的目标是将数据集划分为K个类别.假定K的值已经给定,那么第k个类别的中心定义为μk,k=1

聚类算法:K均值、凝聚层次聚类和DBSCAN

聚类分析就仅根据在数据中发现的描述对象及其关系的信息,将数据对象分组(簇).其目标是,组内的对象相互之间是相似的,而不同组中的对象是不同的.组内相似性越大,组间差别越大,聚类就越好. 先介绍下聚类的不同类型,通常有以下几种: (1)层次的与划分的:如果允许簇具有子簇,则我们得到一个层次聚类.层次聚类是嵌套簇的集族,组织成一棵树.划分聚类简单地将数据对象划分成不重叠的子集(簇),使得每个数据对象恰在一个子集中. (2)互斥的.重叠的与模糊的:互斥的指每个对象都指派到单个簇.重叠的或是模糊聚类用来反

无监督学习——聚类算法

聚类分析是在数据中发现数据对象之间的关系,将数据进行分组,组内的相似性越大,组间的差别越大,则聚类效果越好. 此次我们学习聚类中的第一个算法——K-均值算法.K-均值算法本质就是重复将样本分配的类里面,不断的更新类的重心位置. 这里将围绕K-均值算法讨论目标优化.随机初始化和如何选择聚类数. K-Means算法 K-均值是最普及的聚类算法,算法接受一个未标记的数据集,然后将数据聚类成不同的组. K-均值是一个迭代算法,假设我们想要将数据聚类成 n 个组,其方法为: 首先选择??个随机的点,称为聚

聚类算法:K均值

在数据挖掘中,K-Means算法是一种cluster analysis的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法. 基本K均值:选择K个初始质心,其中K是用户指定的参数,即所期望的簇的个数.每次循环中,每个点被指派到最近的质心,指派到同一个质心的点集构成一个簇.然后,根据指派到簇的点,更新每个簇的质心.重复指派和更新操作,直到质心不发生明显的变化. 为了定义二维空间的数据点之间的"最近"概念,我们使用欧几里得距离的平方,即点A(x1,y1)与点B(x2

[数据挖掘课程笔记]无监督学习——聚类(clustering)

什么是聚类(clustering) 个人理解:聚类就是将大量无标签的记录,根据它们的特点把它们分成簇,最后结果应当是相同簇之间相似性要尽可能大,不同簇之间相似性要尽可能小. 聚类方法的分类如下图所示: 一.如何计算样本之间的距离? 样本属性可能有的类型有:数值型,命名型,布尔型……在计算样本之间的距离时,需要将不同类型属性分开计算,最后统一相加,得到两个样本之间的距离.下面将介绍不同类型的属性的数据计算方法. 对于全部都是连续的数值型的样本来说,首先,对于值相差较大的属性来说,应该进行归一化,变

4.无监督学习--聚类

K-means方法及其应用 1.K-means聚类算法简介: k-means算法以k为参数,把n个对象分成k个簇,使簇内具有较高的相似度,而簇间的相似度较低.主要处理过程包括: 1.随机选择k个点作为初始的聚类中心. 2.对于剩下的点,根据其与聚类中心的距离,将其归入最近的簇. 3.对每个簇,计算所有点的均值作为新的聚类中心. 4.重复2.3直到聚类中心不再发生改变. 举例:对于A.B.C.D.E这5个点,我们先随机选择两个点作为簇中心点,标记为红色和黄色,对于第一次聚类结果,我们分别计算所有的