K-means是基于欧氏距离的基础聚类算法,一般作为聚类算法入门选手,其主要思想是初始任选k个基本点,计算各点离初始点的欧式距离,选择距离最近的初始点,将其归为一类;一轮结束后,重新计算每类的聚类中心,循环上述过程直至 max_iter。
#n个m维样本点,选取k个初始聚类中心,进行max次迭代
while(max):
for i in range(k):
for j in range(n):
#计算每个样本点j到聚类中心i的距离,并将距离小的归为一类
for i in range(k):
#计算并修改每类新的聚类中心坐标
基本思想:
引用代码如下
import numpy as np
import matplotlib.pyplot as plt
# 两点距离
def distance(e1, e2):
return np.sqrt((e1[0]-e2[0])**2+(e1[1]-e2[1])**2)
# 集合中心
def means(arr):
return np.array([np.mean([e[0] for e in arr]), np.mean([e[1] for e in arr])])
# arr中距离a最远的元素,用于初始化聚类中心
def farthest(k_arr, arr):
f = [0, 0]
max_d = 0
for e in arr:
d = 0
for i in range(k_arr.__len__()):
d = d + np.sqrt(distance(k_arr[i], e))
if d > max_d:
max_d = d
f = e
return f
# arr中距离a最近的元素,用于聚类
def closest(a, arr):
c = arr[1]
min_d = distance(a, arr[1])
arr = arr[1:]
for e in arr:
d = distance(a, e)
if d < min_d:
min_d = d
c = e
return c
if __name__=="__main__":
## 生成二维随机坐标,手上有数据集的朋友注意,理解arr改起来就很容易了
## arr是一个数组,每个元素都是一个二元组,代表着一个坐标
## arr形如:[ (x1, y1), (x2, y2), (x3, y3) ... ]
arr = np.random.randint(100, size=(100, 1, 2))[:, 0, :]
## 初始化聚类中心和聚类容器
m = 5
r = np.random.randint(arr.__len__() - 1)
k_arr = np.array([arr[r]])
cla_arr = [[]]
for i in range(m-1):
k = farthest(k_arr, arr)
k_arr = np.concatenate([k_arr, np.array([k])])
cla_arr.append([])
## 迭代聚类
n = 20
cla_temp = cla_arr
for i in range(n): # 迭代n次
for e in arr: # 把集合里每一个元素聚到最近的类
ki = 0 # 假定距离第一个中心最近
min_d = distance(e, k_arr[ki])
for j in range(1, k_arr.__len__()):
if distance(e, k_arr[j]) < min_d: # 找到更近的聚类中心
min_d = distance(e, k_arr[j])
ki = j
cla_temp[ki].append(e)
# 迭代更新聚类中心
for k in range(k_arr.__len__()):
if n - 1 == i:
break
k_arr[k] = means(cla_temp[k])
cla_temp[k] = []
## 可视化展示
col = ['HotPink', 'Aqua', 'Chartreuse', 'yellow', 'LightSalmon']
for i in range(m):
plt.scatter(k_arr[i][0], k_arr[i][1], linewidth=10, color=col[i])
plt.scatter([e[0] for e in cla_temp[i]], [e[1] for e in cla_temp[i]], color=col[i])
plt.show()
本篇需用到的库:numpy、pandas、matplotlib、scikit-learn
库的安装可参考我的上篇文章进行安装 如何解决Python下载包问题
sklearn.cluster.KMeans(n_cluster=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’)
t-SNE的主要用途是可视化和探索高维数据,主要目标是将多维数据集转换为低维数据集。
主要原理:
import pandas as pd
import numpy as np
from pandas import DataFrame, Series
from sklearn.cluster import KMeans
from sklearn.cluster import Birch
import matplotlib.pyplot as plt
# 读取文件
datafile = 'E:/programming/data analysis/exp_c/cluster.xlsx' # 文件所在位置,u为防止路径中有中文名称,此处没有,可以省略
outfile = 'E:/programming/data analysis/exp_c/cluster1.xlsx' # 设置输出文件的位置
data = pd.read_excel(datafile) # datafile是excel文件,所以用read_excel,如果是csv文件则用read_csv
d = DataFrame(data)
d.head()
# 聚类
mod = KMeans(n_clusters=3, max_iter=1500,random_state=1234,algorithm='auto') # 聚成3类数据,并发数为4,最大循环次数为500
mod.fit_predict(d) # y_pred表示聚类的结果
# 聚成3类数据,统计每个聚类下的数据量,并且求出他们的中心
r1 = pd.Series(mod.labels_).value_counts()
r2 = pd.DataFrame(mod.cluster_centers_)
r = pd.concat([r2, r1], axis=1)
r.columns = list(d.columns) + [u'类别数目']
print(r)
# 给每一条数据标注上被分为哪一类
r = pd.concat([d, pd.Series(mod.labels_, index=d.index)], axis=1)
r.columns = list(d.columns) + [u'聚类类别']
print(r.head())
r.to_excel(outfile) # 如果需要保存到本地,就写上这一# 列
# 可视化过程
from sklearn.manifold import TSNE
ts = TSNE(n_components=2, init='random')
ts.fit_transform(r)
ts = pd.DataFrame(ts.embedding_)
a = ts[r[u'聚类类别'] == 0]
plt.plot(a[0], a[1], 'r.')
a = ts[r[u'聚类类别'] == 1]
plt.plot(a[0], a[1], 'go')
a = ts[r[u'聚类类别'] == 2]
plt.plot(a[0], a[1], 'b*')
plt.show()
*注:sklearn在不断升级,如若运行中出现 *FutureWarning: The default learning rate in TSNE will change from 200.0 to ‘auto’ in 1.2.
warnings.warn(等类似警告,可通过此篇文章如何修复scikit-learn中的Future Warning解决。
参考文献
1.https://blog.csdn.net/weixin_41724761/article/details/89786414
2.https://blog.csdn.net/qq_37509235/article/details/82925781
3.https://zhuanlan.zhihu.com/p/78798251
4.https://blog.csdn.net/weixin_40683253/article/details/81288900
5. t-SNE:可视化效果最好的降维算法