import numpy as np
from sklearn import datasets
#1.导入数据,需要其所有的特征数据,target数据为计算聚类准确度
def load_iris_data():
#导入数据集,结构为[data:特征,target:类别,target_name:类别对应名称]
#数据量为150个数据点,每个数据点对应4维特征,和一个类别,类别为0,1,2
iris = datasets.load_iris()
#将data特征传入x
x = iris.data
#将target类别传入y
y = iris.target
return x, y
def get_index(x_center, X_data):
min_dis = 100000
min_index = 0
for m in range(len(x_center)):
# print(m)
# print(X_data[j], x_center[m])
# 6.在第三层循环中,计算每个数据点到每个中心的距离
# 使用曼哈顿为distance = np.sum(np.abs(x_center - x_data))
# 使用欧几里得为distance = np.sqrt(np.sum((x_center - x_data) ** 2))
distance = np.sum(np.abs(x_center[m] - X_data[j]))
if distance < min_dis:
min_dis = distance
min_index = m
# print(distance)
return min_index
#1.导入数据,调用load_iris_data函数
X_data, y_target = load_iris_data()
#2.确定k值,随机选取k个数据点特征作为初始center
#使用np.random.permutation函数,打乱顺序,随机排列序列。
k = 3
a = 0.000001
#np.random.seed(1)
i = np.random.permutation(X_data.shape[0])
x_center = X_data[i[:k]]
#print(x_center)
#print(y_target[[2, 76, 112]])
#print(np.array([y_target[2], y_target[76], y_target[112]]))
#3.确定最大聚类迭代次数,外层for循环,即聚类迭代次数循环
max_num = 5000
for i in range(max_num):
if i % 500 == 0:
print(i)
#4.第二层循环,循环所有的数据点
#初始化聚类簇的列表或者字典
#初始化聚类结果列表
label_list = []
for j in range(len(x_center)):
# print(len(x_center))
label_list.append([])
# print(label_list)
y_test = []
for j in range(X_data.shape[0]):#150
print(j)
print(X_data[j])
#5.第三层循环,循环所有的中心
#print(min_index)
#print(label_list)
min_index = get_index(x_center, X_data)
#7.计算其最小的距离,将该数据点分为该中心点的类别中
label_list[min_index].append(X_data[j])
y_test.append(min_index)
#print(len(label_list))
#print(label_list[1])
#8.计算各新的中心点,使用np.mean(),通过for循环簇个数
x_center_new = []
for j in range(len(label_list)):#3
x_center_new.append(np.mean(np.array(label_list[j]), axis=0))
x_center_new = np.array(x_center_new)
#print(x_center_new)
#9.计算新中心点与老中心点是否变化超过阈值,超过即停止
if np.mean(np.abs(x_center_new-x_center)) <= a:
break
#10.返回结果列表
print(np.array(y_test))
#11.emtropy熵值和purity纯度
结果:
0
500
1000
1500
2000
2500
3000
3500
4000
4500
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 2 2 2 1 2 1 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2
2 1 1 1 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 1 1 1 2 1 1 1 1
1 1 2 1 1 1 1 1 2 1 2 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 2 1 1 1 2 1
1 1]
草稿:
# k_means
import numpy as np
from sklearn import datasets
from sklearn.datasets import load_iris
x = datasets.load_iris().data
y = datasets.load_iris().target
z = datasets.load_iris().target_names
# print(load_iris())
i = np.random.permutation(x.shape[0])
print(i)
en = x[i[:3]]
print(en)
# print(np.random.permutation(x.shape[0]))
print(x)
print(y)
print(z)
草稿结果:
[ 32 30 50 96 44 103 145 110 99 124 48 15 23 61 28 71 46 16
127 39 67 69 45 55 10 138 108 111 38 92 33 143 74 19 80 35
87 139 25 53 137 9 146 11 133 135 42 68 123 82 37 72 54 21
114 100 22 122 14 120 62 13 115 148 77 41 8 131 140 144 119 43
57 112 141 95 1 93 121 18 31 12 86 84 66 88 73 128 83 118
49 0 20 89 63 147 75 64 90 78 97 65 91 34 129 125 105 130
98 149 101 60 134 2 107 29 70 47 6 7 116 126 59 109 36 104
52 136 142 76 4 58 3 24 94 85 56 40 26 117 5 79 106 81
113 51 102 17 132 27]
[[5.2 4.1 1.5 0.1]
[4.8 3.1 1.6 0.2]
[7. 3.2 4.7 1.4]]
[[5.8 2.7 5.1 1.9]
[6.8 3.2 5.9 2.3]
[6.7 3.3 5.7 2.5]
[6.7 3. 5.2 2.3]
[6.3 2.5 5. 1.9]
[6.5 3. 5.2 2. ]
[6.2 3.4 5.4 2.3]
[5.9 3. 5.1 1.8]]#此处x有150行,部分省略
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2]
['setosa' 'versicolor' 'virginica']
#以上代码用换行分开,方便浏览