用python实现K-Means均值聚类算法

以下代码仿照《机器学习实战》一书,在其基础上稍加修改:

import numpy as np
import matplotlib.pyplot as plt
def loadDataSet(filename):
     dataMat=[]
     fr=open(filename)
     for line in fr.readlines():
          curLine=line.strip().split('\t')
          fltLine=list(map(float,curLine))
          dataMat.append(fltLine)
     return dataMat

def distEclud(vecA,vecB):   #计算两个向量之间的欧氏距离
     return np.sqrt(np.sum(np.power(vecA-vecB,2)))

def randCent(dataSet,k):  #随机产生均值向量
     n=np.shape(dataSet)[1]
     centroids=np.mat(np.zeros((k,n)))
     for j in range(n):
          minJ=min(dataSet[:,j])
          rangeJ=float(max(dataSet[:,j])-minJ)
          centroids[:,j]=minJ+rangeJ*np.random.rand(k,1)  #防止均值向量在簇的边界
     return centroids

def kMeans(dataSet,k,distMeas=distEclud,createCent=randCent):
     m=np.shape(dataSet)[0]
     clusterAssment=np.mat(np.zeros((m,2)))
     centroids=createCent(dataSet,k)
     clusterChanged=True
     while clusterChanged:
          clusterChanged=False
          for i in range(m):
               minDist=float('inf')
               minIndex=-1
               for j in range(k):
                    distJI=distMeas(centroids[j,:],dataSet[i,:])
                    if distJI<minDist:
                         minDist=distJI
                         minIndex=j
               if clusterAssment[i,0]!=minIndex:
                    clusterChanged=True
                    clusterAssment[i,:]=minIndex,minDist**2
          for cent in range(k):
               ptsInClust=dataSet[np.nonzero(clusterAssment[:,0].A==cent)[0]]
               centroids[cent,:]=np.mean(ptsInClust,axis=0)
     return centroids,clusterAssment

if __name__=="__main__":
     dataSet=np.mat(loadDataSet("G:\\IDLE\\testSet.txt"))
     centroids,clusterAssment=kMeans(dataSet,4,distMeas=distEclud,createCent=randCent)
     plt.figure()
     for each in dataSet.tolist():
          plt.scatter(each[0],each[1],s=50,c='blueviolet')
     for vector in centroids.tolist():
          plt.scatter(vector[0],vector[1],c='k',s=200,marker='+')
     plt.title('K-Means')
     plt.grid()
     plt.show()

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: K-means 聚类是一种无监督学习算法,用于将一组数据点分成 K 个类别。下面是用 Python 实现 K-means 聚类的基本步骤: 1. 导入所需的库 ```python import numpy as np from sklearn.cluster import KMeans ``` 2. 准备数据集 ```python data = np.array([ [1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0] ]) ``` 3. 初始化 KMeans 对象 ```python kmeans = KMeans(n_clusters=2, random_state=0) ``` 4. 训练模型 ```python kmeans.fit(data) ``` 5. 获取聚类结果 ```python labels = kmeans.labels_ ``` 6. 获取聚类中心 ```python centroids = kmeans.cluster_centers_ ``` 7. 可视化聚类结果 ```python import matplotlib.pyplot as plt plt.scatter(data[:,0], data[:,1], c=labels) plt.scatter(centroids[:,0], centroids[:,1], marker='x', s=200, linewidths=3, color='r') plt.show() ``` 上述代码将数据集分为 2 个类别,并用红色叉号表示聚类中心。 ### 回答2: K-means聚类是一种常用的无监督学习算法,其目标是将数据集划分为K个不重叠的簇,使得簇内的数据点相似度较高,簇间的相似度较低。 首先,我们需要假设要聚类的数据点是由N个d维向量表示的,其中N表示数据点的数量,d表示每个数据点的维度。 K-means聚类算法步骤如下: 1. 随机初始化K个簇的质心(centroids),每个簇的质心是一个d维向量。 2. 对于每个数据点,计算其与所有质心的欧氏距离,将数据点分配给距离最近的质心所对应的簇。 3. 更新每个簇的质心,即计算当前簇内所有数据点的均值,作为新的质心。 4. 重复步骤2和步骤3,直到达到停止条件(例如达到最大迭代次数,或者簇中心不再变化)。 下面是使用Python实现K-means聚类的示例代码: ```python import numpy as np def kmeans(X, K, max_iterations): # 随机初始化K个簇的质心 centroids = X[np.random.choice(range(len(X)), K, replace=False)] for _ in range(max_iterations): # 计算每个数据点与质心的距离 distances = np.linalg.norm(X[:, np.newaxis] - centroids, axis=-1) # 分配每个数据点到距离最近的簇 labels = np.argmin(distances, axis=1) # 更新每个簇的质心 new_centroids = np.empty_like(centroids) for i in range(K): cluster_points = X[labels == i] new_centroids[i] = np.mean(cluster_points, axis=0) centroids = new_centroids return labels # 示例用法 data = np.random.rand(100, 2) # 生成100个二维随机数据点 K = 3 # 聚类的簇数 max_iterations = 100 # 最大迭代次数 labels = kmeans(data, K, max_iterations) ``` 上述代码使用numpy库进行矩阵运算,首先随机初始化K个簇的质心,然后迭代计算每个数据点与质心的距离,分配数据点到距离最近的簇,并更新每个簇的质心,直到迭代结束。最后返回聚类结果labels,即每个数据点所属的簇的标签。 注意,K-means聚类算法实现还有一些改进和优化的方法(如K-means++初始化、二分K-means等),上述代码仅提供了基本的实现思路。 ### 回答3: K-means聚类是一种常用的无监督学习算法,用于将数据集划分为K个不同的簇。下面是使用Python实现K-means聚类的具体过程: 1. 导入必要的库: ```python import numpy as np import matplotlib.pyplot as plt ``` 2. 定义K-means类: ```python class KMeans: def __init__(self, k): self.k = k def fit(self, X): # 初始化聚类中心 centroid_indices = np.random.choice(range(X.shape[0]), size=self.k, replace=False) centroids = X[centroid_indices] while True: # 计算每个样本与聚类中心的距离 distances = np.linalg.norm(X[:, np.newaxis, :] - centroids, axis=-1) # 分配数据点到最近的聚类中心 labels = np.argmin(distances, axis=-1) # 更新聚类中心 new_centroids = np.array([X[labels == i].mean(axis=0) for i in range(self.k)]) # 判断是否达到收敛 if np.all(centroids == new_centroids): break centroids = new_centroids # 返回聚类结果 return labels ``` 3. 导入数据集: ```python X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]]) ``` 4. 创建K-means对象并进行聚类: ```python kmeans = KMeans(k=2) labels = kmeans.fit(X) ``` 5. 可视化聚类结果: ```python plt.scatter(X[:, 0], X[:, 1], c=labels) plt.show() ``` 这样就完成了使用Python实现K-means聚类的过程。通过计算样本与聚类中心的距离并不断更新聚类中心,最终实现了数据集的聚类

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值