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

knime回归问题 模型优化_聚类


不知道为啥一直在执行, 得不出结果