0.2 Kmeans

Kmeans

*  kmeans算法过程描述如下所示:

1.创建k个点作为起始质心点,c1,c2,…,ck 
          2.重复以下过程直到收敛

遍历所有样本xi,根据距离确定每一个样本的类别。 
                确定类别后,计算每一个样本到各自质心的距离,然后求和。和用来和前一次计算出来的距离和比较,已确定是否收敛。 
                对每一个类,计算所有样本的均值并将其作为新的质心(对于点而言,就是所有x坐标的平均值作为质心的x坐标,所有
                y坐标的平均值作为y坐标的均值)

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import datasets

datasets.make_blobs?
x,y=datasets.make_blobs(n_features=3,centers=3)
def init(x,centers=3,):
    '''
    根据x每一个特征的数值范围,产生centers个数据点:
    '''
    array=[]
    for i in x.T:
        maxx,minx=np.max(x),np.min(x)
        array.append(np.random.random(centers)*(maxx-minx)+minx)
    return np.array(array).T
def distance(x,k):
    '''
    几何距离,返回每一点的标签
    '''
    return np.argmin(np.array([np.sqrt(np.sum((x-i)**2,axis=1))for i in k]).T,axis=1) 
    
k=init(x,centers=3)
plt.plot(x[:,0],x[:,1],'*')
plt.plot(k[:,0],k[:,1],'b*')
plt.show()

for i in range(10):
    '''
    计算新的k,循环
    '''
    k=np.array([np.mean(x[kinds==i],axis=0) for i in set(kinds)])
    kinds=distance(x,k) 
    #print(k.shape,len(set(kinds)))
plt.plot(x[:,0],x[:,1],'*')
plt.plot(k[:,0],k[:,1],'r*')
plt.show()
### 改进 KMeans 算法以实现自适应聚类 #### 自适应模糊聚类算法 一种有效的改进方式是引入模糊逻辑来增强传统 K-Means 的灵活性。该方法不仅考量了数据点间的欧氏距离,还综合评估了局部密度与整体分布特性[^1]。这种策略有助于克服原始版本对于初始参数敏感的问题。 #### 动态调整簇数量 为了提升模型鲁棒性,在每次迭代过程中允许自动调节预期的簇数目而非固定不变。具体而言,依据当前解的质量动态增减潜在中心节点的数量,从而更好地拟合实际场景下的复杂结构变化趋势。 #### 加入遗传算法优化机制 结合进化论思想设计了一套全新的寻优流程:利用种群初始化代替随机选取种子;借助交叉变异操作探索更广阔的搜索空间;最终筛选出最优个体作为新一轮迭代起点。此方案显著提高了全局收敛速度并降低了陷入局部极值的风险[^4]。 ```python import numpy as np from sklearn.cluster import KMeans from deap import base, creator, tools, algorithms def genetic_kmeans(data, n_clusters=3, generations=50, population_size=100): # 定义适合度函数 def eval_fitness(individual): kmeans = KMeans(n_clusters=int(np.round(individual)), random_state=0).fit(data) return (-kmeans.inertia_,) # 创建工具箱 toolbox = base.Toolbox() # 设置基因编码范围 MIN_CLUSTERS, MAX_CLUSTERS = 2, int(len(data)/2) IND_SIZE = 1 creator.create("FitnessMax", base.Fitness, weights=(1.0,)) creator.create("Individual", list, fitness=creator.FitnessMax) toolbox.register("attr_float", lambda: np.random.uniform(MIN_CLUSTERS, MAX_CLUSTERS)) toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_float, n=IND_SIZE) toolbox.register("population", tools.initRepeat, list, toolbox.individual) toolbox.register("mate", tools.cxBlend, alpha=0.5) toolbox.register("mutate", tools.mutGaussian, mu=0, sigma=1, indpb=0.2) toolbox.register("select", tools.selTournament, tournsize=3) toolbox.register("evaluate", eval_fitness) pop = toolbox.population(n=population_size) hof = tools.HallOfFame(1) stats = tools.Statistics(lambda ind: ind.fitness.values) stats.register("avg", np.mean) stats.register("std", np.std) stats.register("min", np.min) stats.register("max", np.max) _, logbook = algorithms.eaSimple(pop, toolbox, cxpb=0.7, mutpb=0.2, ngen=generations, halloffame=hof, verbose=False, stats=stats) best_n_clusters = round(hof[0][0]) final_kmeans = KMeans(n_clusters=best_n_clusters, random_state=0).fit(data) return final_kmeans.labels_ # 示例用法 data = [[...], [...]] # 替换为您的数据集 labels = genetic_kmeans(data=data, generations=100, population_size=200) print(labels) ``` #### 多密度自适应 DBSCAN (Multi-DBSCAN) 不同于传统的单一ε半径定义邻居关系的方式,多密度自适应 DBSCAN 提出了基于局部密度差异性的新型邻域判定准则。这种方法能够更加精准地区分不同区域内的核心对象及其边界情况,进而获得更为合理的分组效果[^5]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值