k-prototypes聚类
前一篇讲述了K-Prototypes聚类的原理以及它的伪代码,本篇根据上一篇内容编写了实现K-Prototypes的Python代码。

# -*- coding: utf-8 -*-import numpy as np
import random
from collections import Counterdef dist(x, y):return np.sqrt(sum((x-y)**2))def sigma(x, y):return len(x) - sum(x == y)def findprotos(data, k):m, n = data.shapenum = random.sample(range(m), k)O = []C = []for i in range(n):try:if isinstance(data[0, i], int) or isinstance(data[0, i], float):O.append(i)elif isinstance(data[0, i], str):C.append(i)else:raise ValueError("the %d column of data is not a number or a string column" % i)except TypeError as e:print(e)O_data = data[:, O]C_data = data[:, C]O_protos = O_data[num, :]C_protos = C_data[num, :]return O, C, O_data, C_data, O_protos, C_protosdef KPrototypes(data, k, max_iters=10, gamma=0):m, n = data.shapeO, C, O_data, C_data, O_protos, C_protos = findprotos(data, k)cluster = NoneclusterShip = []clusterCount = {}sumInCluster = {}freqInCluster = {}for i in range(m):mindistance = float('inf')for j in range(k):distance = dist(O_data[i,:], O_protos[j,:]) + \gamma * sigma(C_data[i,:], C_protos[j,:])if distance < mindistance:mindistance = distancecluster = jclusterShip.append(cluster)if  clusterCount.get(cluster) == None:clusterCount[cluster] = 1else:clusterCount[cluster] += 1for j in range(len(O)):if sumInCluster.get(cluster) == None:sumInCluster[cluster] = [O_data[i,j]] + [0] * (len(O) - 1)else:sumInCluster[cluster][j] += O_data[i,j]O_protos[cluster,j] = sumInCluster[cluster][j] / clusterCount[cluster]for j in range(len(C)):if freqInCluster.get(cluster) == None:freqInCluster[cluster] = [Counter(C_data[i,j])] + [Counter()] * (len(C) - 1)else:freqInCluster[cluster][j] += Counter(C_data[i,j])C_protos[cluster,j] = freqInCluster[cluster][j].most_common()[0][0]for t in range(max_iters):for i in range(m):mindistance = float('inf')for j in range(k):distance = dist(O_data[i, :], O_protos[j, :]) + \gamma * sigma(C_data[i, :], C_protos[j, :])if distance < mindistance:mindistance = distancecluster = jif clusterShip[i] != cluster:oldCluster = clusterShip[i]clusterShip[i] = clusterclusterCount[cluster] += 1clusterCount[oldCluster] -= 1for j in range(len(O)):sumInCluster[cluster][j] += O_data[i,j]sumInCluster[oldCluster][j] -= O_data[i,j]O_protos[cluster,j] = sumInCluster[cluster][j] / clusterCount[cluster]O_protos[oldCluster, j] = sumInCluster[oldCluster][j] / clusterCount[oldCluster]for j in range(len(C)):freqInCluster[cluster][j] += Counter(C_data[i,j])freqInCluster[oldCluster][j] -= Counter(C_data[i,j])C_protos[cluster,j] = freqInCluster[cluster][j].most_common()[0][0]C_protos[oldCluster,j] = freqInCluster[oldCluster][j].most_common()[0][0]return clusterShipif __name__ == "__main__":from sklearn.datasets import load_irisimport pandas as pdiris = load_iris()O, C, O_data, C_data, O_protos, C_protos = findprotos(iris.data, 3)print(O)print("==============")print(C)print("==============")print(O_data)print("==============")print(C_data)print("==============")print(O_protos)print(O_protos[1,1])print("==============")print(C_protos)cluster = KPrototypes(data=iris.data,k=3, max_iters=30)print(cluster)s2 = pd.DataFrame(np.concatenate([iris.data, np.array([cluster]).T], axis=1))s2.to_csv("c:/users/ll/desktop/s2.csv")

上述代码对iris数据集进行了聚类,展现图形如下:

library(grid)
library(ggplot2)s1 <- read.csv('s1.csv', header=T)
s2<- read.csv('s2.csv', header=T)
p1 <- ggplot(s1, aes(X0,X1, color=as.factor(X4))) + geom_point()
p2 <- ggplot(s2, aes(X0,X1, color=as.factor(X4))) + geom_point()
grid.newpage()
vp1 <- viewport(x=0, y=0.5, width=1,height=0.5, just=c('left','bottom'))
vp2 <- viewport(x=0, y=0, width=1,height=0.5, just=c('left','bottom'))
print(p1, vp=vp1)
print(p2, vp=vp2)

以目标变量为着色点,可以看出聚类后的分类和原始的分类非常接近,说明聚类效果比较好。

github地址: KPrototypes聚类

K-Prototypes聚类的Python实现相关推荐

  1. k-medoid(k中心点)聚类算法Python实现

    k-means算法有个很大的缺点,就是对孤立点敏感性太高,孤立点即是脱离群众的点,与众不同的点,即在显示中与其他点不是抱在一团的点. 为了体现两者的不同,我特意温习了一下知识,在构造初始点的时候,自己 ...

  2. 无监督学习——K均值聚类的Python实现

    目录 概要 一.K均值算法 二.K值的选取:手肘法 三.用聚类实现鸢尾花数据分类 四.应用案例 1. 读取数据 2. 绘制手肘图 3. 找到最佳K值 4. 分类结果可视化 机器学习类型和算法的分类 无 ...

  3. 手写K-Means(K均值聚类的python实现)

    K-Means聚类算法原理 """ K-means impl, take square for example """ import ran ...

  4. k均值聚类的python代码_k-均值聚类Python代码实现

    这里给出两种方式的k-均值实现,code主要来自于网络: # reference: https://mubaris.com/2017/10/01/kmeans-clustering-in-python ...

  5. k均值聚类算法python_K均值和其他聚类算法:Python快速入门

    k均值聚类算法python This post was originally published here 这篇文章最初发表在这里 Clustering is the grouping of obje ...

  6. Python,OpenCV中的K均值聚类——K-Means Cluster

    Python,OpenCV中的K均值聚类 1. 效果图 2. 原理 2.1 什么是K均值聚类? 2.2 K均值聚类过程 2.3 cv2.kmeans(z, 2, None, criteria, 10, ...

  7. Python OpenCV应用K均值聚类进行颜色量化

    Python OpenCV应用K均值聚类进行颜色量化 1. 效果图 2. 颜色量化是什么? 3. MiniBatchKMeans & KMeans 4. 源码 参考 在这篇博客文章中,我将向您 ...

  8. K均值聚类关于初始聚类中心选取的一种改进(python程序)

    本程序是K均值聚类关于初始聚类中心选取的一种改进,原理来自于周志华的机器学习,这里只是尝试用python实现下.刚开始学习python,可能有问题大家觉得有用就借鉴下,如果哪里有问题还望指正.关于K均 ...

  9. python机器学习案例系列教程——k均值聚类、k中心点聚类

    全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 上一篇我们学习了层次聚类.层次聚类只是迭代的把最相近的两个聚类匹配起来.并没有给出能给出多少的分组.今天我们来研究一个K均值聚类.就是 ...

  10. python机器学习库sklearn——k均值聚类

    全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 k均值聚类的相关的知识内容可以参考 http://blog.csdn.net/luanpeng825485697/article/de ...

最新文章

  1. python avg_python闭包
  2. mysql统计姓名为小明_Mysql 统计查询相同字段只统计一条
  3. 微软ASP.NET AJAX框架剖析
  4. c语言将一个实型变量f=55.5678,《C语言程序设计》第2章2 常量和变量
  5. java中 resource_Java中如何获取resource的源码分析
  6. ios信息交互 协议的使用
  7. proteus中的米字(14段)数码管用法
  8. 智能优化算法——布谷鸟搜索算法原理(附代码)
  9. 幅度谱、相位谱、能量谱等语音信号处理中的基础知识
  10. Java Base64 加密与解密
  11. 在线工具:将图片透明化
  12. 企业如何借助制造业ERP系统,做好生产排产管理?
  13. 使用计算机室刷卡上机,浅析高校计算机实验室综合信息管理系统
  14. 安卓逆向工程之工具使用JADX,JEB,GDA的安装使用
  15. 越狱Season 1-Episode 20: Tonight
  16. C语言中 真值/原码/补码/反码 的概念
  17. SRPG游戏开发(三)第二章 创建项目
  18. Java自定义注解开发
  19. 网易云音乐评论抓取及生成词云
  20. antd 的upload组件结合oss实现图片上传

热门文章

  1. 华为手机备份的通讯录是什么文件_华为手机通讯录如何备份?
  2. 跨境电商如何用Facebook社媒平台开发海外精准客户
  3. 卓海科技冲刺创业板:拟募资5.47亿 相宇阳控制52.9%股权
  4. rj45管脚定义_“RJ45接口”定义标准是什么?
  5. 计算机名格式不对,电脑文件粘贴以后格式不对怎么办
  6. 关于两个电源串并联的问题
  7. 分析Crash 日志一
  8. 如何理解当代中国----《十亿消费者》摘录(转)
  9. 基于Matlab的多线激光中心坐标值提取
  10. 我所收藏的重点大学BBS资源