k个簇中心,平均法重新计算各个簇中心,簇心几乎不移动。
输入:簇的数;数据集;
输出:k个簇
方法:从数据集中找出k个对象当作原始的簇心;
import numpy as np
a=np.array([(3,4),(3,6),(7,3),(4,7),(3,8),(8,5),(4,5),(4,1),(7,4),(5,5)])
lines=""
for i in a:
for j in a:
dis=np.sqrt(np.sum((j-i)**2))
lines += str(dis)+","
lines+='\n'
file=open("result.csv",mode="w",encoding="utf-8")
file.write(lines)
file.close()
1,计算距离;
问题1:
解答:本例结果一样
问题2:
解答:针对于,其它数据集,不同的簇中心结果可能不一样。
"""
随机取k个中心点
计算所有点到中心点到距离
将所有点放入中心点所在到簇
更新中心点
如果中心点不变,结束迭代
迭代
"""
import numpy as np
#获取数据集
def loadDataSet(filename):
return np.loadtxt(filename,delimiter=',',dtype=np.float)
#取k个中心点
def initCenters(dataset,k):
"""
返回的k个中心点
dataset:数据集
k:中心点的个数
return:
"""
centersIndex=np.random.choice(len(dataset),k,replace=False)
return dataset[centersIndex]
#计算距离
def distance(x,y):
return np.sqrt(np.sum((x-y)**2))
#kmeans的核心算法
def kmeans(dataset,k):
"""
dataset:数据集
k:中心点的个数
return:k个簇
"""
#初始化中心点
# centers=initCenters(dataset,k)
centers=np.array([[4,5],[5,5]],dtype=np.float)
n,m=dataset.shape
#用于存储每个样本属于哪个簇
clusters=np.full(n,np.nan)
#迭代
flag=True
while flag:
flag=False
#计算所有点到簇中心的距离
for i in range(n):
minDist,clustersIndex=99999999,0
for j in range(len(centers)):
dist=distance(dataset[i],center[j])
if dist<minDist:
#为样本分簇
minDist=dist
clustersIndex=j
if clusters[i]!=clustersIndex:
clusters[i]=clustersIndex
flag=True
print(centers)
print(clusters)
#更新簇中心
for i in range(k):
subdataset=dataset[np.where(clusters==i)] #得到下标
centers[i]=np.mean(subdataset,axis=0)
return clusters
if __name__=='__main__':
dataset=loadDataSet('data.txt')
print(kmeans(dataset,2))
聚类作用:
观察样本分布,数据预处理;
k-means算法
通常对于任何数据集k-means都不能达到全局最优,只能达到局部最优。