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