一.理解什么是K-means算法
资料:
对于K-means++算法的理解,我觉得一篇博客写的很好:
https://www.cnblogs.com/wang2825/articles/8696830.html
1.1 算法过程:
(1)随机选取K个对象作为初始聚类中心;
(2)将数据样本集合中的样本按照最小距离原则分配到最邻近聚类;
(3)根据聚类的结果,重新计算K个聚类的中心,并作为新的聚类中心;
(4)重复步骤2.3直到聚类中心不再变化。
1.2 数学表达式:
n:样本数。
k:样本分为k类。
rnk:第n个样本点是否属于第k类,属于则rnk=1, 不属于则rnk=0。
μK:第k个中心点。
K-means 要做的就是最小化:
这个函数。
迭代的方法:
1、固定μK,得到rnk。
2、固定rnk,求出最优的μK。
求rnk求μk
二.基于K-means的K-means++算法
2.1 算法:
(1) 使用K-means算法时,我们可以在输入的数据集中随机的选择k个点作为初始的聚类中心,但是随机选择初始点可能会造成聚类的结果和数据的实际分布相差很大。k-means++算法选择初始聚类中心的基本思想是:初始的聚类中心之间的相互距离要尽可能的远。
(2) 从输入的数据点集合中随机选择一个点作为第一个聚类中心。
(3) 对于数据集中的每一个点x,计算它与最近聚类中心的距离D(x)。
(4) 选择一个新的数据点作为新的聚类中心,选择的原则是:D(x)较大的点,被选取作为聚类中心的概率较大。对于每个点,我们都计算其和最近的一个聚类中心的距离D(x)并保存在一个数组里,然后把这些距离加起来得到Sum(D(x))。再取一个随机值Random(0 < Random < Sum)然后用Random -= D(x),直到其<=0,此时的点就是下一个聚类中心。
(5)重复3和4直到k个聚类中心被选出来。
Note:
由于 K-means 算法的分类结果会受到初始点的选取而有所区别,因此有提出这种算法的改进: K-means++ 。
其实这个算法也只是对初始点的选择有改进而已,其他步骤都一样。初始质心选取的基本思路就是,初始的聚类中心之间的相互距离要尽可能的远。
因为老师给出的代码里面已经实现了K-means,考虑初始点不同可能带来的效果不一样,所以我在老师的基础上用了K-means++。在最后的代码中,我会放出老师的K-means实现代码,和我自己写的K-means++代码。
三. 欧几里得距离和曼哈顿距离
3.1 欧几里得距离:Euclidean distance
jianyi
曼哈顿距离: Manhattan distance
3.2构造欧几里得距离函数
如图,matrix1和matrix2分别代表了两个向量,易得这两个向量的距离就是5:
四.与matrix相关的代码
4.1 创建零矩阵
示例:创建一个3*3的矩阵
4.2矩阵的行数和列数
五.K-means++代码
import pandas as pd
from numpy import *
import math
import random
def readfile(filepath):
file=np.loadtxt(filepath,encoding='utf-8-sig')
return file
def distEclud(vecA, vecB): #计算欧几里得距离
return np.sqrt(np.sum(np.square(vecA - vecB)))
def proCenter(length,DataSet,distArray,center): #disarray 存放聚类中心的坐标,center 第一个聚类中心的坐标
proArray=np.zeros([(DataSet.shape[