资源简介

数据挖掘k-means k-medoids python代码实现 含测试数据

资源截图

代码片段和文件信息

from numpy import *
import matplotlib.pyplot as plt


# calculate Euclidean distance 欧几里得度量
def euclDistance(vector1 vector2):
    return sqrt(sum(power(vector2 - vector1 2)))  # 求这两个矩阵的距离,vector1、2均为矩阵

# init centroids with random samples
# 在样本集中随机选取k个样本点作为初始质心
def initCentroids(dataSet k):
    numSamples dim = dataSet.shape  # 矩阵的行数、列数
    centroids = zeros((k dim))  # 感觉要不要你都可以
    for i in range(k):
        index = int(random.uniform(0 numSamples))  # 随机产生一个浮点数,然后将其转化为int型
        centroids[i :] = dataSet[index :]
    return centroids


# k-means cluster
# dataSet为一个矩阵
# k为将dataSet矩阵中的样本分成k个类
def kmeans(dataSet k):
    numSamples = dataSet.shape[0]  # 读取矩阵dataSet的第一维度的长度即获得有多少个样本数据
    # first column stores which cluster this sample belongs to
    # second column stores the error between this sample and its centroid
    clusterAssment = mat(zeros((numSamples 2)))  # 得到一个N*2的零矩阵
    clusterChanged = True

    ## step 1: init centroids
    centroids = initCentroids(dataSet k)  # 在样本集中随机选取k个样本点作为初始质心

    while clusterChanged:
        clusterChanged = False
        ## for each sample
        for i in range(numSamples):  # range
            minDist = 100000.0
            minIndex = 0
            ## for each centroid
            ## step 2: find the centroid who is closest
            # 计算每个样本点与质点之间的距离,将其归内到距离最小的那一簇
            for j in range(k):
                x1=centroids[j :]
                x2=dataSet[i :]
                distance = euclDistance(centroids[j :] dataSet[i :])
                if distance < minDist:
                    minDist = distance
                    minIndex = j

                    ## step 3: update its cluster
            # k个簇里面与第i个样本距离最小的的标号和距离保存在clusterAssment中
            # 若所有的样本不在变化,则退出while循环
            if clusterAssment[i 0] != minIndex:
                clusterChanged = True
                clusterAssment[i :] = minIndex minDist ** 2  # 两个**表示的是minDist的平方

        ## step 4: update centroids 更新质心
        for j in range(k):
            # clusterAssment[:0].A==j是找出矩阵clusterAssment中第一列元素中等于j的行的下标,返回的是一个以array的列表,第一个array为等于j的下标
            pointsInCluster = dataSet[nonzero(clusterAssment[: 0].A == j)[0]]  # 将dataSet矩阵中相对应的样本提取出来
            # xx=clusterAssment[: 0].A == j
            # yy=nonzero(clusterAssment[: 0].A == j);
            # zz=nonzero(clusterAssment[: 0].A == j)[0];
            #print(findMedioio(pointsInCluster))
            centroids[j :] = mean(pointsInCluster axis=0)  # 计算标注为j的所有样本的平均值
            #centroids[j :] = findMedioio(pointsInCluster)  # 计算标注为j的所有样本的平均值

    print(‘Congratulations cluster complete!‘)
    return centroids clusterAssment
#k-medoids中用于寻找质心
def findMedioio(pointsInCluster):
    minDist = 10000000.0
    minIndex=0
    for i in range(pointsInCluster.shape[0]):#循环作为质心
        currDist=0
        for j in range(pointsInCluster.shape[0]):
            currDist+=euclDistance(p

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2019-01-06 15:43  k-means_k-medoids\
     文件        4859  2019-01-06 15:21  k-means_k-medoids\KMeans.py
     文件        4107  2019-01-02 19:04  k-means_k-medoids\KMeans2.py
     文件        1112  2019-01-06 15:42  k-means_k-medoids\MainPro.py
     文件       15288  2019-01-06 11:32  k-means_k-medoids\test.csv
     文件        1755  2019-01-01 16:17  k-means_k-medoids\testSet.txt
     文件        1126  2019-01-06 10:15  k-means_k-medoids\__init__.py
     文件        1139  2019-01-06 15:38  k-means_k-medoids\__init__2.py

评论

共有 条评论