目录
Kmeans算法
原理
kmeans算法的原理是不断地迭代聚类中心点,主要步骤如下:
(1) 从 n个数据对象任意选择 k 个对象作为初始聚类中心;
(2) 根据每个聚类对象的均值(中心对象),计算每个对象与这些中心对象的距离;并根据最小距离重新对相应对象进行划分;
(3) 重新计算每个(有变化)聚类的均值(中心对象);
(4) 计算标准测度函数,当满足一定条件,如函数收敛时,则算法终止;如果条件不满足则回到步骤(2)。

改进
对于数据的处理我们可以利用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],

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

875

被折叠的 条评论
为什么被折叠?



