数据挖掘-聚类分析(Python实现K-Means算法)

概念:

聚类分析(cluster analysis ):是一组将研究对象分为相对同质的群组(clusters)的统计分析技术。聚类分析也叫分类分析,或者数值分类。聚类的输入是一组未被标记的样本,聚类根据数据自身的距离或者相似度将其划分成若干个组,划分的原则是组内距离最小化而组间(外部)距离最大化。聚类和分类的不同在于:聚类所要求划分的类是未知的。

聚类度量的方法:分距离和相似度来度量。

?

?

聚类研究分析的方法:

1.层次的方法(hierarchical  method)

2.划分方法(partitioning method)

3.基于密度的方法(density-based method)DBSCAN

4.基于网格的方法(grid-based method)

5.基于模型的方法(model-based method)

?

?K-Means 算法:

?受离群点的影响较大,由于其迭代每次的中心点到全部样本点的距离和的平均值。

优点:

  • 原理简单
  • 速度快
  • 对大数据集有比较好的伸缩性

缺点:

  • 需要指定聚类 数量K
  • 对异常值敏感
  • 对初始值敏感

?以欧式距离来衡量距离大小,使用误差平方和(Sum of the Squared Error,SSE作为聚类的目标函数:

?

k表示k个聚类中心,ci表示第几个中心,dist表示的是欧几里得距离

?

?算法步骤;

?创建k个点作为初始的质心点(随机选择)

?当任意一个点的簇分配结果发生改变时

?       对数据集中的每一个数据点

?              对每一个质心

?                     计算质心与数据点的距离

?              将数据点分配到距离最近的簇

?       对每一个簇,计算簇中所有点的均值,并将均值作为质心

?算法图示:

?

Python代码实现K-Means算法:

有关于 .A 的用法:(flatten()函数可以是多维数组变换成一维数组, .A 则使得matrix 形式转化成 array 形式)

>>> import numpy as np
>>> demo_a2 = np.mat([[1,3],[2,4],[3,5]])
>>> demo_a2
matrix([[1, 3],
        [2, 4],
        [3, 5]])
>>> demo_a2.flatten()
matrix([[1, 3, 2, 4, 3, 5]])
>>> demo_a2.flatten().A
array([[1, 3, 2, 4, 3, 5]])
>>> demo_a2.flatten().A[0]
array([1, 3, 2, 4, 3, 5])

#定义一个欧式距离的函数 :

#coding=gbk
‘‘‘
Created on 2018年7月17日

@author: Administrator
‘‘‘
# k-means 算法python实现

import numpy as np

def distEclud(vecA, vecB):  #定义一个欧式距离的函数
    return np.sqrt(np.sum(np.power(vecA - vecB, 2)))

print(‘----test_distEclud-----‘)
vecA, vecB = np.array([1,1]), np.array([2,1])
distance = distEclud(vecA, vecB)
print(distance) # 1.0 计算两点之间的距离

随机设置k个中心点:

def randCent(dataSet, k):  #第一个中心点初始化
    n = np.shape(dataSet)[1]
    centroids = np.mat(np.zeros([k, n]))  #创建 k 行 n列的全为0 的矩阵
    for j in range(n):
        minj = np.min(dataSet[:,j]) #获得第j 列的最小值
        rangej = float(np.max(dataSet[:,j]) - minj)     #得到最大值与最小值之间的范围
        #获得输出为 K 行 1 列的数据,并且使其在数据集范围内
        centroids[:,j] = np.mat(minj + rangej * np.random.rand(k, 1))
    return centroids

print(‘----test_randCent-----‘)
dataSet1 = np.array([[1,2],[3,6],[8,10],[12,23],[10,11],[13,18]])
print(dataSet1[1,:])
r = randCent(dataSet1, 2)
print(r)
# [[ 8.83544015 16.75467081]
#  [ 2.85688493  4.4799291 ]]

np.random.seed(666) #定义一个随机种子
rand_num = np.random.rand(3,1)  #输出为3行1 列,随机数在 0 到 1 之间
print(rand_num)
# [[0.70043712]
#  [0.84418664]
#  [0.67651434]]
test = np.mat(np.zeros([3,2]))  #此处的 zeros 函数内的矩阵形式需要加中括号 []
print(test)
# [[0. 0.]    #打印出 3行 2列的矩阵
#  [0. 0.]
#  [0. 0.]] 

定义KMeans函数:

#参数: dataSet 样本点, K 簇的个数
#disMeans 距离, 默认使用欧式距离, createCent 初始中心点的选取
def KMeans(dataSet, k, distMeans= distEclud, createCent= randCent):
    m = np.shape(dataSet)[0]    #得到行数,即为样本数
    clusterAssement = np.mat(np.zeros([m,2]))   #创建 m 行 2 列的矩阵
    centroids = createCent(dataSet, k)      #初始化 k 个中心点
    clusterChanged = True
    while clusterChanged:
        clusterChanged = False
        for i in range(m):
            minDist = np.inf   #初始设置值为无穷大
            minIndex = -1
            for j in range(k):
                #  j循环,先计算 k个中心点到1 个样本的距离,在进行i循环,计算得到k个中心点到全部样本点的距离
                distJ = distMeans(centroids[j,:], dataSet[i,:])
                if distJ <  minDist:
                    minDist = distJ #更新 最小的距离
                    minIndex = j
            if clusterAssement[i,0] != minIndex:    #如果中心点不变化的时候, 则终止循环
                clusterChanged = True
            clusterAssement[i,:] = minIndex, minDist**2 #将 index,k值中心点 和  最小距离存入到数组中
        print(centroids)

        #更换中心点的位置
        for cent in range(k):
            ptsInClust = dataSet[np.nonzero(clusterAssement[:,0].A == cent)[0]] #分别找到属于k类的数据
            centroids[cent,:] = np.mean(ptsInClust, axis = 0)   #得到更新后的中心点
    return centroids, clusterAssement 

print(‘------test-----‘)
demo_a = np.array([[1,0],[0,2],[0,0]])
non_a = np.nonzero(demo_a)
print(demo_a)
# [[1 0]
#  [0 2]
#  [0 0]]
print(non_a)
# 输出的第一行为 行数, 第二行为列数,意思为   1行1列的数 和2行2列的数 是非0数
# (array([0, 1], dtype=int64), array([0, 1], dtype=int64))

demo_a1 = np.array([1,2,0,0,1]) #当只有一行时
non_a1 = np.nonzero(demo_a1)
print(non_a1)   # (array([0, 1, 4], dtype=int64),)  

a1 = np.inf > 100000
print(a1)       #  True   inf 是无穷大

print(‘---------- test KMeans ---------‘)
dataSet = np.mat([[ 0.90796996 ,5.05836784],[-2.88425582 , 0.01687006],
                    [-3.3447423 , -1.01730512],[-0.32810867 , 0.48063528]
                    ,[ 1.90508653 , 3.530091  ]
                    ,[-3.00984169 , 2.66771831]
                    ,[-3.38237045 ,-2.9473363 ]
                    ,[ 2.22463036 ,-1.37361589]
                    ,[ 2.54391447 , 3.21299611]
                    ,[-2.46154315 , 2.78737555]
                    ,[-3.38237045 ,-2.9473363 ]
                    ,[ 2.8692781  ,-2.54779119]
                    ,[ 2.6265299  , 3.10868015]
                    ,[-2.46154315 , 2.78737555]
                    ,[-3.38237045 ,-2.9473363 ]
                    ,[ 2.80293085 ,-2.7315146 ]])
print(dataSet)
center, cluster = KMeans(dataSet, 2)
print(‘----‘)
print(center)
# [[-1.05990877 -2.0619207 ]
#  [-0.03469197  2.95415497]]
print(‘----‘)
print(cluster)
# [[ 1.          5.31632331]
#  [ 0.          7.6496132 ]
#  [ 0.          6.31168598]
#  [ 1.          6.20439303]
#  [ 1.          4.09444295]
#  [ 1.          8.93356179]
#  [ 0.          6.17778903]
#  [ 0.         11.26196081]
#  [ 1.          6.71620993]
#  [ 1.          5.917422  ]
#  [ 0.          6.17778903]
#  [ 0.         15.67457959]
#  [ 1.          7.1059799 ]
#  [ 1.          5.917422  ]
#  [ 0.          6.17778903]
#  [ 0.         15.36988591]]

python中kmeans的参数:

sklearn.cluster.KMeans(
    n_clusters=8,
    init=‘k-means++‘,
    n_init=10,
    max_iter=300,
    tol=0.0001,
    precompute_distances=‘auto‘,
    verbose=0,
    random_state=None,
    copy_x=True,
    n_jobs=1,
    algorithm=‘auto‘
    )
n_clusters: 簇的个数,即你想聚成几类
init: 初始簇中心的获取方法
n_init: 获取初始簇中心的更迭次数,为了弥补初始质心的影响,算法默认会初始10个质心,实现算法,然后返回最好的结果。
max_iter: 最大迭代次数(因为kmeans算法的实现需要迭代)
tol: 容忍度,即kmeans运行准则收敛的条件
precompute_distances:是否需要提前计算距离,这个参数会在空间和时间之间做权衡,如果是True 会把整个距离矩阵都放到内存中,auto 会默认在数据样本大于featurs*samples 的数量大于12e6 的时候False,False 时核心实现的方法是利用Cpython 来实现的
verbose: 冗长模式(不太懂是啥意思,反正一般不去改默认值)
random_state: 随机生成簇中心的状态条件。
copy_x: 对是否修改数据的一个标记,如果True,即复制了就不会修改数据。bool 在scikit-learn 很多接口中都会有这个参数的,就是是否对输入数据继续copy 操作,以便不修改用户的输入数据。这个要理解Python 的内存机制才会比较清楚。
n_jobs: 并行设置
algorithm: kmeans的实现算法,有:’auto’, ‘full’, ‘elkan’, 其中 ‘full’表示用EM方式实现
虽然有很多参数,但是都已经给出了默认值。所以我们一般不需要去传入这些参数,参数的。可以根据实际需要来调用。

?基于密度的方法;

?DBSCAN (需要指定半径,对离群点的寻找作用很大):

?大圆:核心对象,周围半径内有多于min_samples 个点

?小圆:非核心对象,周围少于 min_samples 个点

?黑色点:离群点和任何核心对象之间的距离大于阈值

??

参考:https://blog.csdn.net/taoyanqi8932/article/details/53727841

原文地址:https://www.cnblogs.com/junge-mike/p/9335057.html

时间: 2024-11-05 15:54:47

数据挖掘-聚类分析(Python实现K-Means算法)的相关文章

Python实现K近邻算法&lt;KNN&gt;_分类器

收集数据 数据来源:http://archive.ics.uci.edu/ml/datasets/Haberman%27s+Survival 文本数据如下图所示: 31,65,4,1 33,58,10,1 33,60,0,1 34,59,0,2 34,66,9,2 这是关于乳腺癌已手术患者存活时间(寿命)的样本集,文本文件中共包含306个样本,样本包含的属性有: 1. 患者做手术时的年龄 opAge 2. 患者做手术的年份-1900 opYear,比如1970年做的手术,则opYear属性的值为

聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用

4 用python实现K均值算法 x=np.random.randint(1,100,[20,1]) y=np.zeros(20) k=3 def initcenter(x,k): return x[:k] def nearest(kc,i): d = (abs(kc - i)) w = np.where(d ==np.min(d)) return w [0] [0] kc = initcenter(x,k) nearest(kc,14) for i in range(x.shape[0]):

聚类--K均值算法

聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用    1.用python实现K均值算法 K-means是一个反复迭代的过程,算法分为四个步骤:(x,k,y) import numpy as np x = np.random.randint(1,50,[20,1]) y = np.zeros(20) k = 3 # 选取数据空间中的K个对象作为初始中心,每个对象代表一个聚类中心:def initcenter(x, k): kc def initcenter(x,k)

用Python从零开始实现K近邻算法

K近邻算法 (或简称kNN)是易于理解和实现的算法,而且是你解决问题的强大工具. http://python.jobbole.com/87407/ 在本教程中,你将基于Python(2.7)从零开始实现kNN算法.该实现主要针对分类问题,将会用鸢尾花分类问题来演示. 这篇教程主要针对Python程序员,或者你可以快速上手Python,并且对如何从零实现kNN算法感兴趣. kNN算法图片,来自Wikipedia,保留所有权利 什么是kNN kNN算法的模型就是整个训练数据集.当需要对一个未知数据实

K-means算法

K-means算法很简单,它属于无监督学习算法中的聚类算法中的一种方法吧,利用欧式距离进行聚合啦. 解决的问题如图所示哈:有一堆没有标签的训练样本,并且它们可以潜在地分为K类,我们怎么把它们划分呢?     那我们就用K-means算法进行划分吧. 算法很简单,这么做就可以啦: 第一步:随机初始化每种类别的中心点,u1,u2,u3,--,uk; 第二步:重复以下过程: 然后 ,就没有然后了,就这样子. 太简单, 不解释.

机器学习经典算法具体解释及Python实现--K近邻(KNN)算法

(一)KNN依旧是一种监督学习算法 KNN(K Nearest Neighbors,K近邻 )算法是机器学习全部算法中理论最简单.最好理解的.KNN是一种基于实例的学习,通过计算新数据与训练数据特征值之间的距离,然后选取K(K>=1)个距离近期的邻居进行分类推断(投票法)或者回归.假设K=1.那么新数据被简单分配给其近邻的类.KNN算法算是监督学习还是无监督学习呢?首先来看一下监督学习和无监督学习的定义.对于监督学习.数据都有明白的label(分类针对离散分布,回归针对连续分布),依据机器学习产

Fuzzy C Means 算法及其 Python 实现——写得很清楚,见原文

Fuzzy C Means 算法及其 Python 实现 转自:http://note4code.com/2015/04/14/fuzzy-c-means-%E7%AE%97%E6%B3%95%E5%8F%8A%E5%85%B6-python-%E5%AE%9E%E7%8E%B0/ 1.  算法向  算法的扩展 在  算法中,如果要将数据集合  划分为  个类,使得任意数据对象  必须属于并且仅属于一个类,同时每一个类至少包含一个数据对象,那么可以用一个  的矩阵  来表示,矩阵中的任意一个元素

k近邻算法的Python实现

k近邻算法的Python实现 0. 写在前面 这篇小教程适合对Python与NumPy有一定了解的朋友阅读,如果在阅读本文的源代码时感到吃力,请及时参照相关的教程或者文档. 1. 算法原理 k近邻算法(k Nearest Neighbor)可以简称为kNN.kNN是一个简单直观的算法,也是机器学习从业者入门首选的算法.先看一个简单的应用场景. 小例子 设有下表,命名为为表1 电影名称 打斗镜头数量 接吻镜头数量 电影类型 foo1 3 104 爱情片 foo2 2 100 爱情片 foo3 1

K均值算法-python实现

测试数据展示: #coding:utf-8__author__ = 'similarface''''实现K均值算法 算法摘要:-----------------------------输入:所有数据点A,聚类个数k输出:k个聚类的中心点 随机选取k个初始的中心点repeat: 计算每个点和中心点的距离,将点分配给最近的中心簇中 计算Ck,更新簇的中心点until 中心点稳定 -----------------------------'''import sysimport randomimport