虽然其思想能够追溯到1957年的Hugo Steinhaus,术语“k-均值”于1967年才被James MacQueen首次使用。标准算法则是在1957年被Stuart Lloyd作为一种脉冲码调制的技术所提出,但直到1982年才被贝尔实验室公开出版。在1965年,E.W.Forgy发表了本质上相同的方法,所以这一算法有时被称为Lloyd-Forgy方法。更高效的版本则被Hartigan and Wong提出(1975/1979)
K-Means算法是无监督的聚类算法,算法简单,聚类效果好,即使是在巨大的数据集上也非常容易部署实施。正因为如此,它在很多领域都得到的成功的应用,如市场划分、机器视觉、 地质统计学、天文学和农业等。K-Means算法有大量的变体,包括初始化优化K-Means++以及大数据应用背景下的k-means||和Mini Batch K-Means
import numpy as np
# 数据
X = np.array([[1, 2], [2, 2], [6, 8], [7, 8]])
# 随机初始化的聚类中心
C = np.array([[1.0, 2.0], [2.0, 2.0]])
n = 5
for i in range(n):
# 求每个聚类中心到每个样本的距离
DIS = []
for c in C:
dis = np.sqrt(np.sum((X - c)**2,axis=1))
DIS.append(dis)
# 将样本归类
DIS= np.array(DIS)
min_index = np.argmin(DIS,axis=0)
# 重新计算 样本中心
for l in range(len(C)):
x = X[min_index == l]
C[l] = np.mean(x,axis=0)
print(C)
import random
import pandas as pd
import math
a = [['H',70],['I',500],['J',600],['K',700],['L',800],['M',900],['N',1000],["A",10],["B",20],["C",30],["D",40],['F',50],['G',60]]
# 第二个元素越大,采到的概率越大,请采样1w次,然后统计频率
a.sort(key=lambda x:x[1])
a_sum = sum(i[1] for i in a)
n = []
# 计算每个样本距离占据总距离的百分比,用于后续权重处理
for i in a:
n.append(math.ceil(i[1]/a_sum * 100))
x = []
# 距离越远,添加次数越多,被随机选到的概率越大
for i in range(len(a)):
for s in range(n[i]):
x.append(a[i])
p = []
for i in range(10000):
p.append(x[random.randint(0,len(x)-1)])
df = pd.DataFrame(p)
df1 = df.groupby(by=[0]).count()
print(df1)
'''
# 效果如下
[1, 1, 1, 1, 2, 2, 2, 11, 13, 15, 17, 19, 21]
1
0
A 89
B 99
C 91
D 106
F 188
G 190
H 191
I 1056
J 1198
K 1446
L 1576
M 1807
N 1963
'''
import random
import pandas as pd
'''
利用随机打点发,0-1的随机数乘以距离总和,打一个点,循环累加样本点的距离,直到距离大于打点距离
输出当前的样本点,为聚类中心点。
'''
a = [['H',70],['I',500],['J',600],['K',700],['L',800],['M',900],['N',1000],["A",10],["B",20],["C",30],["D",40],['F',50],['G',60]]
# 第二个元素越大,采到的概率越大,请采样1w次,然后统计频率
A = []
for j in range(10000):
point = random.random()*sum([i[-1] for i in a])
res = 0
for i in a:
res += i[-1]
if res>point:
A.append(i[0])
break
A = pd.Series(A)
print(A.value_counts())
'''
# 效果如下
N 2082
M 1920
L 1629
K 1450
J 1201
I 1112
H 139
G 130
F 116
D 104
C 55
B 39
A 23
'''