K-Prototypes聚类的Python实现
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实现相关推荐
- k-medoid(k中心点)聚类算法Python实现
k-means算法有个很大的缺点,就是对孤立点敏感性太高,孤立点即是脱离群众的点,与众不同的点,即在显示中与其他点不是抱在一团的点. 为了体现两者的不同,我特意温习了一下知识,在构造初始点的时候,自己 ...
- 无监督学习——K均值聚类的Python实现
目录 概要 一.K均值算法 二.K值的选取:手肘法 三.用聚类实现鸢尾花数据分类 四.应用案例 1. 读取数据 2. 绘制手肘图 3. 找到最佳K值 4. 分类结果可视化 机器学习类型和算法的分类 无 ...
- 手写K-Means(K均值聚类的python实现)
K-Means聚类算法原理 """ K-means impl, take square for example """ import ran ...
- k均值聚类的python代码_k-均值聚类Python代码实现
这里给出两种方式的k-均值实现,code主要来自于网络: # reference: https://mubaris.com/2017/10/01/kmeans-clustering-in-python ...
- k均值聚类算法python_K均值和其他聚类算法:Python快速入门
k均值聚类算法python This post was originally published here 这篇文章最初发表在这里 Clustering is the grouping of obje ...
- 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, ...
- Python OpenCV应用K均值聚类进行颜色量化
Python OpenCV应用K均值聚类进行颜色量化 1. 效果图 2. 颜色量化是什么? 3. MiniBatchKMeans & KMeans 4. 源码 参考 在这篇博客文章中,我将向您 ...
- K均值聚类关于初始聚类中心选取的一种改进(python程序)
本程序是K均值聚类关于初始聚类中心选取的一种改进,原理来自于周志华的机器学习,这里只是尝试用python实现下.刚开始学习python,可能有问题大家觉得有用就借鉴下,如果哪里有问题还望指正.关于K均 ...
- python机器学习案例系列教程——k均值聚类、k中心点聚类
全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 上一篇我们学习了层次聚类.层次聚类只是迭代的把最相近的两个聚类匹配起来.并没有给出能给出多少的分组.今天我们来研究一个K均值聚类.就是 ...
- python机器学习库sklearn——k均值聚类
全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 k均值聚类的相关的知识内容可以参考 http://blog.csdn.net/luanpeng825485697/article/de ...
最新文章
- python avg_python闭包
- mysql统计姓名为小明_Mysql 统计查询相同字段只统计一条
- 微软ASP.NET AJAX框架剖析
- c语言将一个实型变量f=55.5678,《C语言程序设计》第2章2 常量和变量
- java中 resource_Java中如何获取resource的源码分析
- ios信息交互 协议的使用
- proteus中的米字(14段)数码管用法
- 智能优化算法——布谷鸟搜索算法原理(附代码)
- 幅度谱、相位谱、能量谱等语音信号处理中的基础知识
- Java Base64 加密与解密
- 在线工具:将图片透明化
- 企业如何借助制造业ERP系统,做好生产排产管理?
- 使用计算机室刷卡上机,浅析高校计算机实验室综合信息管理系统
- 安卓逆向工程之工具使用JADX,JEB,GDA的安装使用
- 越狱Season 1-Episode 20: Tonight
- C语言中 真值/原码/补码/反码 的概念
- SRPG游戏开发(三)第二章 创建项目
- Java自定义注解开发
- 网易云音乐评论抓取及生成词云
- antd 的upload组件结合oss实现图片上传