kmeans算法及python代码参考

本文详细介绍了如何使用Python实现Pearson相关系数计算及K-means聚类算法,包括代码实现和核心逻辑分析。

# -*- coding:gb2312 -*-

'''

Created on 2011-10-21

 @author: chenjinandy

'''

from math import sqrt

def pearson(v1,v2):

  # Simple sums

  sum1=sum(v1)

  sum2=sum(v2)

  # Sums of the squares

  sum1Sq=sum([pow(v,2) for v in v1])

  sum2Sq=sum([pow(v,2) for v in v2])    

  # Sum of the products

  pSum=sum([v1[i]*v2[i] for i in range(len(v1))])

  # Calculate r (Pearson score)

  num=pSum-(sum1*sum2/len(v1))

  den=sqrt((sum1Sq-pow(sum1,2)/len(v1))*(sum2Sq-pow(sum2,2)/len(v1)))

  if den==0: return 0

  return 1.0-num/den  

v1=[1.22,1.33,4.55,6.45,6.31,4.12]

v2=[1.22,1.33,4.55,6.45,6.31,4.12]

print pearson(v1,v2) 

dataset=[(1,0),(0,1),(1,1),(2,1),(1,2),(2,2),(3,2),(6,6),(7,6),(8,6),(6,7),(7,7),(8,7),(9,7),(7,8),(8,8),(9,8),(8,9),(9,9)] 

print dataset

#kmeans 的pythondex实现 

def isequal(v1,v2):

    if (v1[0]*10==v2[0]*10)and(v1[1]*10==v2[1]*10):

        return 1

    else:

        return 0

def order(dataset,k):

    type=[]

    temp=0

    for i in range(len(dataset)):

        for j in range(k):

            if pearson(dataset[i],dataset[j])<pearson(dataset[i],dataset[temp]):

                                               temp=j

        type.append(temp)

        print dataset[i]

        print "被归为第 %s" %temp+"类"    

    return type

def newcenter(dataset,num,type):

    cnt=0

    sumx=0.0

    sumy=0.0

    point=(0.0,0.0)

    for i in range(len(dataset)):

        if type[i]==num:

            sumx+=dataset[i][0]

            sumy+=dataset[i][1]

            cnt+=1

    sumx=sumx/cnt

    sumy=sumy/cnt

    point=(sumx,sumy)

    return point

def cluster(dataset,k):

    center=[]

    oldcenter=[]

    for i in range(k):

       # print i,dataset[i]

        cen=dataset[i]

        center.append(cen)

        oldcen=(0.0,0.0)

        oldcenter.append(oldcen)

    cnt=0

    while cnt!=k:

        type=order(dataset,k)

        for i in range(k):

            center[i]=newcenter(dataset,i,type)

            if isequal(center[i],oldcenter[i]):

                cnt+=1

            else:

                oldcenter[i]=center[i]               

    for i in range(k):

        print "属于类别 %s" %i+"的点有如下:"

        for j in range(len(dataset)):

            if type[j]==i:

                print dataset[j]

for i in range(len(dataset)):

    print dataset[i]

cluster(dataset,3)

 

### KMeans聚类算法Python实现 以下是KMeans聚类算法的一个标准Python实现代码: ```python import numpy as np from scipy.spatial.distance import cdist class KMeans: def __init__(self, k=3, max_iters=100, tol=1e-4): self.k = k # 聚类数量 self.max_iters = max_iters # 最大迭代次数 self.tol = tol # 收敛条件阈值 self.centroids = None # 中心点 def initialize_centroids(self, data): """ 随机初始化质心 """ indices = np.random.choice(range(data.shape[0]), size=self.k, replace=False) self.centroids = data[indices] def assign_clusters(self, data): """ 计算每个点到各质心的距离并分配类别 """ distances = cdist(data, self.centroids, metric="euclidean") # 欧几里得距离矩阵 cluster_labels = np.argmin(distances, axis=1) # 找到最近的质心索引 return cluster_labels def update_centroids(self, data, clusters): """ 更新质心位置 """ new_centroids = [] for i in range(self.k): points_in_cluster = data[clusters == i] if len(points_in_cluster) > 0: centroid = np.mean(points_in_cluster, axis=0) new_centroids.append(centroid) else: new_centroids.append(self.centroids[i]) return np.array(new_centroids) def fit(self, data): """ 运行K-Means算法直到收敛或达到最大迭代次数 """ self.initialize_centroids(data) for _ in range(self.max_iters): old_centroids = self.centroids.copy() clusters = self.assign_clusters(data) self.centroids = self.update_centroids(data, clusters) # 判断是否满足收敛条件 centroid_shifts = np.linalg.norm(self.centroids - old_centroids, axis=1) if np.all(centroid_shifts < self.tol): break return clusters # 测试代码 if __name__ == "__main__": from sklearn.datasets import make_blobs X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0) kmeans_model = KMeans(k=4, max_iters=300, tol=1e-4) labels = kmeans_model.fit(X) print("Cluster Labels:", labels[:10]) # 输出前十个样本所属的簇编号 ``` #### 实现说明 此代码实现了完整的KMeans聚类过程,具体功能如下: - **`initialize_centroids()`**: 初始化质心的位置。通过随机选取数据集中的一些点作为初始质心[^1]。 - **`assign_clusters()`**: 将每个数据点分配给离它最近的质心所在簇[^2]。 - **`update_centroids()`**: 基于当前分组情况更新新的质心位置[^1]。 - **`fit()`**: 反复执行上述两个操作直至质心不再显著移动或者达到了预设的最大迭代次数。 此外,在测试部分使用了 `sklearn.datasets.make_blobs` 来生成模拟数据用于验证算法效果。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值