【数据挖掘】聚类之k-means(转载)
1.算法简述
分类是指分类器(classifier)根据已标注类别的训练集,通过训练可以对未知类别的样本进行分类。分类被称为监督学习(supervised learning)。如果训练集的样本没有标注类别,那么就需要用到聚类。聚类是把相似的样本聚成一类,这种相似性通常以距离来度量。聚类被称为无监督学习(unspervised learning)。
k-means是聚类算法中常用的一种,其中k的含义是指有k个cluster。由聚类的定义可知,一个样本应距离其所属cluster的质心是最近的(相较于其他k-1个cluster)。实际上,k-means的本质是最小化目标函数:
x为样本点,c为cluster。为了表示cluster,最简单有效的是取所有样本点平均,即质心(cluster centroid);这便是取名means的来由。
k-means算法流程如下:
选取初始k个质心(通常随机选取)
循环重复直至收敛
{ 对每个样本,计算出与k个质心距离最近的那个,将其归为距离最新质心所对应的cluster
重新计算质心,当质心不再变化即为收敛
}
代码参考[1,2],结果可视化请参考[2]
import numpy as np
import scipy.spatial.distance as ssd
import matplotlib.pyplot as plt def read_file(fn):
raw_file=open(fn)
dataSet=[]
for raw_row in raw_file.readlines():
row=raw_row.strip().split('\t')
dataSet.append((float(row[0]),float(row[1]))) return np.array(dataSet) def firstCentroids(k,dataSet):
"""create the first centroids""" num_columns=dataSet.shape[1]
centroids=np.zeros((k,num_columns))
for j in range(num_columns):
minJ=min(dataSet[:,j])
rangeJ=max(dataSet[:,j])-minJ
for i in range(k):
centroids[i,j]=minJ+rangeJ*np.random.uniform(0,1)
return np.array(centroids) def kmeans(k,dataSet):
num_rows,num_columns=dataSet.shape
centroids=firstCentroids(k,dataSet) #store the cluster that the samples belong to
clusterAssment=np.zeros((num_rows,2))
clusterChanged=True
while clusterChanged:
clusterChanged=False #find the closet centroid
for i in range(num_rows):
minDis=np.inf;minIndex=-1
for j in range(k):
distance=ssd.euclidean(dataSet[i,:],centroids[j,:])
if distance<minDis:
minDis=distance;minIndex=j if(clusterAssment[i,0]!=minIndex): clusterChanged=True
clusterAssment[i,:]=minIndex,minDis**2 #update the centroid location
for cent in range(k):
ptsInCent=dataSet[np.nonzero(clusterAssment[:,0]==cent)[0]]
centroids[cent,:]=np.mean(ptsInCent,axis=0) return centroids,clusterAssment
缺点:
- k-means是局部最优,因而对初始质心的选取敏感。换句话说,选取不同的初始质心,会导致不同的分类结果(当然包括差的了)。
- 选择能达到目标函数最优的k值是非常困难的。
2. Referrence
[1] Peter Harrington, machine learning in action.
[2] zouxy09, 机器学习算法与Python实践之(五)k均值聚类(k-means).
[3] the top ten algorithm in data mining, CRC Press.
【数据挖掘】聚类之k-means(转载)的更多相关文章
- 软件——机器学习与Python,聚类,K——means
K-means是一种聚类算法: 这里运用k-means进行31个城市的分类 城市的数据保存在city.txt文件中,内容如下: BJ,2959.19,730.79,749.41,513.34,467. ...
- 【十大经典数据挖掘算法】k
[十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 引言 k-means与kNN虽 ...
- [数据挖掘] - 聚类算法:K-means算法理解及SparkCore实现
聚类算法是机器学习中的一大重要算法,也是我们掌握机器学习的必须算法,下面对聚类算法中的K-means算法做一个简单的描述: 一.概述 K-means算法属于聚类算法中的直接聚类算法.给定一个对象(或记 ...
- ML: 聚类算法-K均值聚类
基于划分方法聚类算法R包: K-均值聚类(K-means) stats::kmeans().fpc::kmeansruns() K-中心点聚类(K-Medoids) ...
- 聚类算法:K均值、凝聚层次聚类和DBSCAN
聚类分析就仅根据在数据中发现的描述对象及其关系的信息,将数据对象分组(簇).其目标是,组内的对象相互之间是相似的,而不同组中的对象是不同的.组内相似性越大,组间差别越大,聚类就越好. 先介绍下聚类的不 ...
- 常见聚类算法——K均值、凝聚层次聚类和DBSCAN比较
聚类分析就仅根据在数据中发现的描述对象及其关系的信息,将数据对象分组(簇).其目标是,组内的对象相互之间是相似的,而不同组中的对象是不同的.组内相似性越大,组间差别越大,聚类就越好. 先介绍下聚类的不 ...
- KNN 与 K - Means 算法比较
KNN K-Means 1.分类算法 聚类算法 2.监督学习 非监督学习 3.数据类型:喂给它的数据集是带label的数据,已经是完全正确的数据 喂给它的数据集是无label的数据,是杂乱无章的,经过 ...
- 【机器学习】聚类算法——K均值算法(k-means)
一.聚类 1.基于划分的聚类:k-means.k-medoids(每个类别找一个样本来代表).Clarans 2.基于层次的聚类:(1)自底向上的凝聚方法,比如Agnes (2)自上而下的分裂方法,比 ...
- 聚类之K均值聚类和EM算法
这篇博客整理K均值聚类的内容,包括: 1.K均值聚类的原理: 2.初始类中心的选择和类别数K的确定: 3.K均值聚类和EM算法.高斯混合模型的关系. 一.K均值聚类的原理 K均值聚类(K-means) ...
随机推荐
- 理解竞争条件( Race condition)漏洞
这几天一个叫做"Dirty COW"的linux内核竞争条件漏洞蛮火的,相关公司不但给这个漏洞起了个洋气的名字,还给它设计了logo(见下图),首页,Twitter账号以及网店.恰 ...
- 【bzoj2957】【楼房重建】另类的线段树(浅尝ACM-H)
[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=62609346 向大(hei)佬(e)势力学(di ...
- [POI2006]Periods of Words
题目大意: 给定一个长度为$n(n\leq10^6)$的字符串$S$,定义一个串$S$的最大周期为一个不为$S$的字符串$Q$,满足$Q$为$S$的前缀且$S$为$QQ$的前缀.求字符串$S$的每一个 ...
- 设置iframe高度自适应屏幕高度
写在前面: 最近在搭建项目前台页面框子的时候,把iframe设置成了固定的高度,导致不同的电脑尺寸访问的时候,高度差异较大,故查了下,将iframe设置成自动适应屏幕高度的方式,这里记录下. 还是直接 ...
- iOS 代理 重定向消息 forwardInvocation
今天简单研究一下iOS的重定向消息forwardInvocation: 首先看看Invocation类: @interface NSInvocation : NSObject { @private _ ...
- sql server 性能调优 资源等待之内存瓶颈的三种等待类型
原文:sql server 性能调优 资源等待之内存瓶颈的三种等待类型 一.概述 这篇介绍Stolen内存相关的主要三种等待类型以及对应的waittype编号,CMEMTHREAD(0x00B9),S ...
- zookeeper 学习笔记1(转)
本文转自https://www.cnblogs.com/fanguangdexiaoyuer/p/7077520.html 感谢作者 可以设置观察的操作:exists,getChildren,getD ...
- threadlocal彻底理解
如果你定义了一个单实例的java bean,它有若干属性,但是有一个属性不是线程安全的,比如说HashMap.并且碰巧你并不需要在不同的线程中共享这个属性,也就是说这个属性不存在跨线程的意义.那么你不 ...
- 全面理解java自动装箱和拆箱(转)
自动装箱和拆箱从Java 1.5开始引入,目的是将原始类型值转自动地转换成对应的对象.自动装箱与拆箱的机制可以让我们在Java的变量赋值或者是方法调用等情况下使用原始类型或者对象类型更加简单直接. 如 ...
- 常用函数 __MySQL必知必会
----------------------使用数据处理函数 ---------------------- 常见的文本处理函数 Left() 返回串左边的字符Length() 返回串的长度Locate ...