代码编织梦想

目录

第一关:什么是质心

任务描述:

相关知识:

什么是质心:

编程要求:

测试说明:

第二关:动手实现k-均值

任务描述:

相关知识:

一、数据集介绍

二、k-means算法原理

三、k-means算法流程

四、如何确定k的值

编程要求:

测试说明:


第一关:什么是质心

任务描述:

本关任务:使用Pyhton编写一个能计算所有样本质心且将所有样本到质心距离按从小到大排序的方法。

相关知识:

为了完成本关任务,你需要掌握:1.什么是质心。

什么是质心:

K-means算法是一个基于距离的聚类方法,距离指的是每个样本到质心的距离。那么,这里所说的质心是什么呢?

其实,质心指的是样本每个特征的均值所构成的一个坐标。举个例子:假如有两个数据(1,1)(2,2)则这两个样本的质心为(1.5,1.5)

 

编程要求:

根据提示,在右侧编辑器Begin-End处补充代码,计算样本间距离distance(x, y, p=2)方法:

  • x:第一个样本的坐标
  • y:第二个样本的坐标
  • p:等于1时为曼哈顿距离,等于2时为欧氏距离

构造计算所有样本质心的方法cal_Cmass(data)

  • data:数据样本

与将所有样本到质心距离按从小到大排序的方法sorted_list(data,Cmass)

  • data:数据样本
  • Cmass:数据样本质心

测试说明:

只需返回预测结果即可,程序内部会检测您的代码,计算正确则视为通过。如:

输入:[[2,3,4],[4,5,6],[5,6,7]] 输出:[0.5773502691896255,2.309401076758503,2.886751345948129]

输入:[[8,8,8],[7,7,7],[9,9,9]] 输出:[0.0, 1.7320508075688772, 1.7320508075688772]

#encoding=utf8
import numpy as np

#计算样本间距离
def distance(x, y, p=2):
    '''
    input:x(ndarray):第一个样本的坐标
          y(ndarray):第二个样本的坐标
          p(int):等于1时为曼哈顿距离,等于2时为欧氏距离
    output:distance(float):x到y的距离      
    '''
    #********* Begin *********#
    dis2 = np.sum(np.abs(x-y)**p)
    dis = np.power(dis2,1/p)
    return dis    

    #********* End *********#
#计算质心
def cal_Cmass(data):
    '''
    input:data(ndarray):数据样本
    output:mass(ndarray):数据样本质心
    '''
    #********* Begin *********#
    Cmass = np.mean(data,axis=0)

    #********* End *********#
    return Cmass
#计算每个样本到质心的距离,并按照从小到大的顺序排列
def sorted_list(data,Cmass):
    '''
    input:data(ndarray):数据样本
          Cmass(ndarray):数据样本质心
    output:dis_list(list):排好序的样本到质心距离
    '''
    #********* Begin *********#
    dis_list = []
    for i in range(len(data)):
        dis_list.append(distance(Cmass,data[i][:]))
    dis_list = sorted(dis_list)

    #********* End *********#
    return dis_list

第二关:动手实现k-均值

任务描述:

本关任务:使用python实现kmeans方法,并对鸢尾花数据进行聚类。

相关知识:

为了完成本关任务,你需要掌握:1.k-means算法原理,2.k-means算法流程,3.如何确定k的值。

一、数据集介绍

鸢尾花数据集是一类多重变量分析的数据集,一共有150个样本,通过花萼长度花萼宽度花瓣长度花瓣宽度 4个特征预测鸢尾花卉属于(SetosaVersicolourVirginica)三个种类中的哪一类。

数据集中部分数据如下所示:

花萼长度花萼宽度花瓣长度花瓣宽度
5.13.51.40.2
4.93.21.40.2
4.73.11.30.2

其中每一行代表一个鸢尾花样本各个属性的值。

数据集中部分标签如下图所示:

标签
0
1
2

标签中的值0,1,2分别代表鸢尾花三种不同的类别。

我们可以直接使用sklearn直接对数据进行加载,代码如下:

from sklearn.datasets import load_iris
#加载鸢尾花数据集
iris = load_iris()
#获取数据特征与标签
x,y = iris.data.astype(int),iris.target

 不过为了能够进行可视化我们只使用数据中的两个特征:

  1. from sklearn.datasets import load_iris
  2. iris = load_iris()
  3. x,y = iris.data,iris.target
  4. x = x[:,2:]

可视化数据分布:

  1. import matplotlib.pyplot as plt
  2. plt.scatter(x[:,0],x[:,1])
  3. plt.show()

可视化结果:

 我们可以先根据数据的真实标签查看数据类别情况:

  1. import matplotlib.pyplot as plt
  2. plt.scatter(x[:,0],x[:,1],c=y)
  3. plt.show()

效果如下:

 然后我们划分出训练集与测试集,训练集用来训练模型,测试集用来检测模型性能。代码如下:

  1. from sklearn.model_selection import train_test_split
  2. #划分训练集测试集,其中测试集样本数为整个数据集的20%
  3. train_feature,test_feature,train_label,test_label = train_test_split(x,y,test_size=0.2,random_state=666)

二、k-means算法原理

K-means算法是基于数据划分的无监督聚类算法,首先定义常数k,常数k表示的是最终的聚类的类别数,在确定了类别数k后,随机初始化k个类别的聚类中心(质心),通过计算每一个样本与聚类中心(质心)的距离,将样本点划分到距离最近的类别中。

三、k-means算法流程

k-means算法流程如下:

  1. 随机初始k个点,作为类别中心。
  2. 对每个样本将其标记为距离类别中心最近的类别。
  3. 将每个类别的质心更新为新的类别中心。
  4. 重复步骤2、3,直到类别中心的变化小于阈值。

过程如下图:

 

 

四、如何确定k的值

K-means算法中,K值作为一个超参数,它的值需要我们自己来确定,通常k默认5。当然我们也可以写一个循环,将k等于各个值的结果输出,选择最好的结果的k值。部分代码如下:

  1. for i in range(k):
  2. km = KMmeans(i)

编程要求:

根据提示,在右侧编辑器Begin-End处补充代码,实现kmeans方法,其中距离设为欧氏距离

测试说明:

程序会调用你实现的方法对鸢尾花数据进行聚类,若聚类结果与正确结果吻合度大于0.95则视为通关。

#encoding=utf8
import numpy as np

# 计算一个样本与数据集中所有样本的欧氏距离的平方
def euclidean_distance(one_sample, X):
    '''
    input:
        one_sample(ndarray):单个样本
        X(ndarray):所有样本
    output:
        distances(ndarray):单个样本到所有样本的欧氏距离平方
    '''
    #*********Begin*********#
    one_sample = one_sample.reshape(1, -1)
    distances = np.power(np.tile(one_sample, (X.shape[0], 1)) - X, 2).sum(axis=1)

    #*********End*********#
    return distances

# 从所有样本中随机选取k个样本作为初始的聚类中心
def init_random_centroids(k,X):
    '''
    input:
        k(int):聚类簇的个数
        X(ndarray):所有样本
    output:
        centroids(ndarray):k个簇的聚类中心
    '''
    #*********Begin*********#
    n_samples, n_features = np.shape(X)
    centroids = np.zeros((k, n_features))
    for i in range(k):
        centroid = X[np.random.choice(range(n_samples))]
        centroids[i] = centroid

    #*********End*********#
    return centroids

# 返回距离该样本最近的一个中心索引
def _closest_centroid(sample, centroids):
    '''
    input:
        sample(ndarray):单个样本
        centroids(ndarray):k个簇的聚类中心
    output:
        closest_i(int):最近中心的索引
    '''
    #*********Begin*********#
    distances = euclidean_distance(sample, centroids)
    closest_i = np.argmin(distances)

    #*********End*********#
    return closest_i

# 将所有样本进行归类,归类规则就是将该样本归类到与其最近的中心
def create_clusters(k,centroids, X):
    '''
    input:
        k(int):聚类簇的个数
        centroids(ndarray):k个簇的聚类中心
        X(ndarray):所有样本
    output:
        clusters(list):列表中有k个元素,每个元素保存相同簇的样本的索引
    '''
    #*********Begin*********#
    clusters = [[] for _ in range(k)]
    for sample_i, sample in enumerate(X):
        centroid_i = _closest_centroid(sample, centroids)
        clusters[centroid_i].append(sample_i)


    #*********End*********#
    return clusters

# 对中心进行更新
def update_centroids(k,clusters, X):
    '''
    input:
        k(int):聚类簇的个数
        X(ndarray):所有样本
    output:
        centroids(ndarray):k个簇的聚类中心
    '''
    #*********Begin*********#
    n_features = np.shape(X)[1]
    centroids = np.zeros((k, n_features))
    for i, cluster in enumerate(clusters):
        centroid = np.mean(X[cluster], axis=0)
        centroids[i] = centroid

    #*********End*********#
    return centroids

# 将所有样本进行归类,其所在的类别的索引就是其类别标签
def get_cluster_labels(clusters, X):
    '''
    input:
        clusters(list):列表中有k个元素,每个元素保存相同簇的样本的索引
        X(ndarray):所有样本
    output:
        y_pred(ndarray):所有样本的类别标签
    '''
    #*********Begin*********#
    y_pred = np.zeros(np.shape(X)[0])
    for cluster_i, cluster in enumerate(clusters):
        for sample_i in cluster:
            y_pred[sample_i] = cluster_i


    #*********End*********#
    return y_pred

# 对整个数据集X进行Kmeans聚类,返回其聚类的标签
def predict(k,X,max_iterations,varepsilon):
    '''
    input:
        k(int):聚类簇的个数
        X(ndarray):所有样本
        max_iterations(int):最大训练轮数
        varepsilon(float):最小误差阈值
    output:
        y_pred(ndarray):所有样本的类别标签
    '''
    #*********Begin*********#
    # 从所有样本中随机选取k样本作为初始的聚类中心
    centroids = init_random_centroids(k,X)

    # 迭代,直到算法收敛(上一次的聚类中心和这一次的聚类中心几乎重合)或者达到最大迭代次数
    for _ in range(max_iterations):

        # 将所有进行归类,归类规则就是将该样本归类到与其最近的中心
        clusters = create_clusters(k,centroids, X)
        former_centroids = centroids

        # 计算新的聚类中心
        centroids = update_centroids(k,clusters, X)

        # 如果聚类中心几乎没有变化,说明算法已经收敛,退出迭代
        diff = centroids - former_centroids
        if diff.any() < varepsilon:
            break
    y_pred = get_cluster_labels(clusters, X)

    #*********End*********#
    return y_pred









版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_58153897/article/details/127991261

十大经典数据挖掘算法之k-means算法-爱代码爱编程

1、K-means算法简介          K-means是最简单的聚类算法之一,简单地说就是把相似的东西分到一组,同 Classification (分类)不同,对于一个 classifier ,通常需要你告诉它“这个东西被分为某某类”这样一些例子,理想情况下,一个 classifier 会从它得到的训练集中进行“学习”,从而具备对未知数据进行分类的

K-均值算法的原理与实战-爱代码爱编程

K-均值(K-means)算法是一种常用的聚类算法。   当我们需要对未标记的数据划分类别时,往往用到的算法是聚类(clustering)。聚类是一种无监督的学习,它试图将数据集中的样本划分为若干个通常是不相交的子集,每个子集称为一个“簇”(cluster);相似的样本归到一个簇中,不相似的样本分到不同的簇中。   K-均值(K-means)算

常用聚类原理与应用(层次化聚类、k-means、均值漂移聚类)-爱代码爱编程

常用聚类原理与应用 声明:本文章为作者结课拓展小论文,仅供参考,欢迎批评指正。 摘要: 聚类分析是一种对多样本数据进行定量分类的一种多元统计分析方法,是机器学习中无监督学习的典型代表。聚类分析可以根据应用样本的不同上可以分为Q型聚类和R型聚类,其中聚类的标准均来源于样本的属性距离即相似程度。聚类算法常用于机器学习、数据分析等领域中,常用的聚类方法有层

机器学习(九) K-Means(K-均值)聚类算法介绍-爱代码爱编程

K-Means(K-均值)聚类算法介绍 监督学习和无监督学习 无监督学习和监督学习是机器学习最基本的两种类型。在理解聚类算法前必须了解这两类两种类型直接的差别 监督学习(supervised learning) 在监督学习中最常见的是回归和分类(注意和聚类区分),关于回归,是将输入的数据集按照一个函数(模型参数)进行训练学习,当要对新来的数据进行预

matlab数据挖掘技术与实践,量化投资——MATLAB数据挖掘技术与实践-爱代码爱编程

篇基础篇 章绪论2 1.1量化投资与数据挖掘的关系2 1.1.1什么是量化投资2 1.1.2量化投资的特点3 1.1.3量化投资的核心——量化模型5 1.1.4量化模型的主要产生方法——数据挖掘7 1.2数据挖掘的概念和原理8 1.2.1什么是数据挖掘8 1.2.2数据挖掘的原理10 1.3数据挖掘在量化投资中的应用11 1.3.

[Python从零到壹] 十三.机器学习之聚类算法四万字总结全网首发(K-Means、BIRCH、树状聚类、MeanShift)-爱代码爱编程

欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足之处也请海涵。Python系列整体框架包括基础语法10篇、网络爬虫30篇、可视化分析10篇、机器学习20篇

头歌平台(EduCoder)—— 数据挖掘算法原理与实践:k-近邻-爱代码爱编程

第1关:knn算法概述 任务描述 本关任务:使用python实现方法,找出目标样本最近的k个样本。 编程要求 根据提示,在右侧编辑器Begin-End处补充代码,实现topK方法。 测试说明 程序会调用你实现的方法,找出目标样本最近的k个样本的标签。如目标样本最近的5个样本为0,0,1,1,1则返回列表[0,0,1,1,1]。若返回结果与真实结

【数据挖掘】k-means算法原理与实现-爱代码爱编程

1、监督学习与无监督学习         根据训练数据是否拥有标记信息,学习任务可大致分为两大类:“监督学习”和“无监督学习”,分类和回归是前者的代表,而聚类则是后者的代表。 2、什么是k-means聚类算法?         该算法预先将数据分为k组,随机选取k个对象作为聚类中心,是一种迭代求解的聚类分析方法。 3、k-means算法实现代码(c

educoder 数据挖掘算法原理与实践:k-均值-爱代码爱编程

第1关:什么是质心 #encoding=utf8 import numpy as np #计算样本间距离 def distance(x, y, p=2): ''' input:x(ndarray):第一个样本的坐标 y(ndarray):第二个样本的坐标 p(int):等于1时为曼哈顿距离,等于2

【大数据分析与挖掘】K-Means聚类算法-爱代码爱编程

介绍 对于有监督的数据挖掘算法而已,数据集中需要包含标签变量(即因变量y的值)。但在有些场景下,并没有给定的y值,对于这类数据的建模,一般称为无监督的数据挖掘算法,最为典型的当属聚类算法。 K-Means聚类算法利用距离远近的思想将目标数据聚为指定的k个簇,进而使样本呈现簇内差异小,簇间差异大的特征。 聚类算法的目的就是依据已知的数据,将相似度高的样

Educode--数据挖掘算法原理与实践:k-近邻-爱代码爱编程

第1关:knn算法概述 任务描述 本关任务:使用python实现方法,找出目标样本最近的k个样本。 相关知识 为了完成本关任务,你需要掌握:1.knn算法思想,2.距离度量。 knn算法思想 k-近邻(k-nearest neighbor ,knn)是一种分类与回归的方法。我们这里只讨论用来分类的knn。所谓k最近邻,就是k个最近的邻居的意思,

python 数据处理数据挖掘(七):k-爱代码爱编程

声明:本文为学习笔记,侵权删 一、一些基本概念 K-Means是非监督学习的聚类算法,将一组数据分为K类(或者叫簇/cluster),每个簇有一个质心(centroid),同类的数据是围绕着质心被分类的。数据被分为了几类就有几个质心。 算法步骤: 1、先从原始数据集中随机选出K个数据,作为K个质心。 2、将剩余的数据分配到与之最相似的的质

机器学习强基计划7-爱代码爱编程

目录 0 写在前面 1 什么是聚类? 2 K均值聚类原理 2.1 原型聚类 2.2 K-means算法流程 3 Python实现