机器学习基础算法二:K-Means回归算法实验

K-Means回归算法实验

一、K-Means算法介绍

  • 原理: K-Means聚类是最常用的聚类算法,最初起源于信号处理,其目标是将数据点划分为K个类簇,找到每个簇的中心并使其度量最小化。该算法的最大优点是简单、便于理解,运算速度较快,缺点是只能应用于连续型数据,并且要在聚类前指定聚集的类簇数。
  • K-Means算法流程:
    1. 确定K值,即将数据集聚集成K个类簇或小组。
    2. 从数据集中随机选择K个数据点作为质心(Centroid)或数据中心。
    3. 分别计算每个点到每个质心之间的距离,并将每个点划分到离最近质心的小组,跟定了那个质心。
    4. 当每个质心都聚集了一些点后,重新定义算法选出新的质心。
    5. 比较新的质心和老的质心,如果新质心和老质心之间的距离小于某一个阈值,则表示重新计算的质心位置变化不大,收敛稳定,则认为聚类已经达到了期望的结果,算法终止。
    6. 如果新的质心和老的质心变化很大,即距离大于阈值,则继续迭代执行第三步到第五步,直到算法终止。

二、K-Means算法实现

  • 代码:
    import numpy as np
    import pandas as pd
    
    # 数据处理
    pd.set_option('display.max_rows', 1000)
    pd.set_option('display.max_columns', 1000)
    pd.set_option('display.width', 1000)  # 增加表格的列数行数和每行的宽度以此让数据集完整表示
    data = pd.read_csv(r"E:\Machine learning data\Iris\Iris.csv")
    data["Species"] = data["Species"].map({"setosa": 0, "versicolor": 1, "virginica": 2})  # 把花的种类名称映射成数字
    data.drop("Unnamed: 0", axis=1, inplace=True)  # 删除没有用的 Unamed: 0 的那一列
    t = data
    
    class KMeans:
    	"""使用Python语言实现聚类算法。"""
     def __init__(self,k,times):
       	 """初始化方法
       	 :parameter
    	    -----
     	   k : int
      	      表示聚类的个数
    
     	   times : int
          	  表示聚类迭代的个数
     	   """
    
       	 self.k = k
       	 self.times = times
    
        	def fit(self,X):
         	   """根据提供的训数据,对模型进行训练。
    
       	     :parameter
           	 ------
         	   X:  类数组类型,形状为:[样本数量,特征数量]
                待训练的样本特征属性。
         	   """
        	    X = np.asarray(X)
         	   # 设计随机种子,以便于可以产生相同的随机序列。(随机的结果可以重现)
        	    np.random.seed(0)
        	    # 从数组中随机选择k个点作为初始聚类中心。
         	   self.cluster_centers_ = X[np.random.randint(0, len(X), self.k)]
         	   self.labels_ = np.zeros(len(X))
    
         	   for t in range(self.times):
             	   for index, x in enumerate(X):
              	      # 计算每个样本聚类中心的距离
            	        dis = np.sqrt(np.sum((x - self.cluster_centers_) ** 2, axis=1))
              	      # 将最小距离的索引赋值给标签数组。索引的值就是当前点所属的簇。范围为[0,k-1]
                	    self.labels_[index] = dis.argmin()
                	    # 循环遍历每一个簇
                	    for i in range(self.k):
                  	      # 计算每个簇内所有点的均值,更新聚类中心
                    	    self.cluster_centers_[i] = np.mean(X[self.labels_ == i], axis=0)
       	 def predict(self, X):
         	   """根据参数传递的样本,对样本数据进行预测。(预测样本属于哪一个簇中)
          	  :parameter
          	  -------
          	  X:类数组类型。形状为:[样本数量,特征数量]
                    待预测的特征属性。
    
          	  :returns
           	 -----
           	 result:数组类型
           	     预测的结果。每一个X所属的簇。
        	    """
    
          	  X = np.asarray(X)
          	  result = np.zeros(len(X))
           	  for index,x in enumerate(X):
         	       # 计算样本到每个聚类中心的距离。
               	 dis = np.sqrt(np.sum((x-self.cluster_centers_) **2, axis= 1))
                    # 找到距离最近的聚类中心,划分类别。
             	   result[index] = dis.argmin()
           	   return result
    
    
      	  kmeans = KMeans(3,50)
      	  kmeans.fit(t)
      	  kmeans.cluster_centers_
     	  print(t[kmeans.labels_ == 0])
    

在这里插入图片描述
不知道为啥一直在执行, 得不出结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值