聚类算法Kmens和密度峰值聚类

本文详细介绍了KMeans聚类算法的原理、改进方法(包括熵权法、PCA降维和Kmeans++初始化)以及Python代码实现。同时,还探讨了密度峰值算法的步骤,包括计算点的密度和delta,确定聚类中心,并提供了代码示例。通过实例展示了两种算法的执行过程和效果。

目录

Kmeans算法

原理

改进

代码

效果 

密度峰值算法

原理

代码

效果 


Kmeans算法

原理

kmeans算法的原理是不断地迭代聚类中心点,主要步骤如下:

(1) 从 n个数据对象任意选择 k 个对象作为初始聚类中心;

(2) 根据每个聚类对象的均值(中心对象),计算每个对象与这些中心对象的距离;并根据最小距离重新对相应对象进行划分;

(3) 重新计算每个(有变化)聚类的均值(中心对象);

(4) 计算标准测度函数,当满足一定条件,如函数收敛时,则算法终止;如果条件不满足则回到步骤(2)。

图片源地址「Python机器学习实战」聚类算法(1)——K-Means聚类|数据点|kmeans_网易订阅

改进

对于数据的处理我们可以利用pca以及熵权法进行一定的降维和权重的改变,使得部分不太合理的数据维数,变得权重更小,部分重要的数据权重变大。从而改善我们的聚类质量。

而利用kmeans++可以使得初始选点更加合理,减少因为初始点位不合引起的聚类暴毙。

其中利用的方法有:

        熵权法

        PCA降维

        利用Kmeans++

代码

from numpy import *
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
import numpy as np
import time
import itertools

INF = 999999999.0

def assess_clustering(list1, list2):
    a = b = c = d = 0
    for j in range(len(list1)):
        if list1[j][0] == list1[j][1] and list2[j][0] == list2[j][1]:
            a = a + 1
        elif list1[j][0] == list1[j][1] and list2[j][0] != list2[j][1]:
            b = b + 1
        elif list1[j][0] != list1[j][1] and list2[j][0] == list2[j][1]:
            c = c + 1
        else:
            d = d + 1
    jc = a / (a + b + c)
    fmi = sqrt(a / (a + b) * a / (a + c))
    Rand = (a + d) / len(list1)
    return jc, fmi, Rand


def loadDataSet(fileName, splitChar='\t'):
    """
    输入:文件名
    输出:数据集
    描述:从文件读入数据集
    """
    dataSet = []
    ori_labels = []
    with open(fileName) as fr:
        for line in fr.readlines():
            curline = line.strip().split(splitChar)
            ori_labels.append(curline.pop(-1))
            fltline = list(map(float, curline))
            dataSet.append(fltline)
    return dataSet, ori_labels

# 归一化
def Normalization(dataSet, W=[1] * 666):
    row = shape(dataSet)[0]
    col = shape(dataSet)[1]
    sum = 0
    mean, si = [], []

    for j in range(col):
        for i in range(row):
            sum += dataSet[i][j]
        mean.append(sum / row)
        sum = 0

    for j in range(col):
        for i in range(row):
            sum += (dataSet[i][j] - mean[j]) ** 2
        si.append(sqrt(sum / row))
        sum = 0

    for j in range(col):
        for i in range(row):
            dataSet[i][j] = (dataSet[i][j] - mean[j]) / si[j] * W[j]
    return dataSet


def PCA_function(dataSet):
    pca = PCA(n_components=2)
    pca.fit(np.array(dataSet))
    new_dataSet = pca.transform(np.array(dataSet))
    k1_spss = pca.components_.T
    weight = (np.dot(k1_spss, pca.explained_variance_ratio_)) / np.sum(pca.explained_variance_ratio_)
    weighted_weight = weight / np.sum(weight)

    return list(new_dataSet), list(weighted_weight)


# 熵权法
def entropy(data0):
    # 返回每个样本的指数
    # 样本数,指标个数
    n, m = np.shape(data0)
    # 一行一个样本,一列一个指标
    # 下面是归一化
    maxium = np.max(data0, axis=0)
    minium = np.min(data0, axis=0)
    data = (data0 - minium) * 1.0 / (maxium - minium)
    ##计算第j项指标,第i个样本占该指标的比重
    sumzb = np.sum(data, axis=0)
    data = data / sumzb
    # 对ln0处理
    a = data * 1.0
    a[np.where(data == 0)] = 0.0001
    #    #计算每个指标的熵
    e = (-1.0 / np.log(n)) * np.sum(data * np.log(a), axis=0)
    #    #计算权重
    w = (1 - e) / np.sum(1 - e)
    return w  # sha##熵权法


def createDataSet():
    """
    输出:数据集
    描述:生成数据集
    """
    dataSet = [[0, 0], [0, 1], [0, 2], [0, 3], [0, 4],
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值