红酒数据集降维后执行聚簇
Wine 数据集包含来自 3 种不同起源的葡萄酒的共 178 条记录(共 178 种葡萄酒),13 个属 性是葡萄酒的 13 种化学成分,通过化学分析可以推断葡萄酒的起源。
要求使用主成分分析方法,将 13 个维度的数据分别降维到 2 个、 3 个、 5 个和 7 个维度, 并使用 2 个维度、3 个维度、5 个维度和 7 个维度的新数据集运行第二次作业中实现的聚簇 程序,对比聚簇后的结果。
程序代码
'''
-*- coding:utf-8 -*-
时间:2019-6-14 星期五
作者:zzx
功能:红酒数据集降维后执行聚簇
'''
import random
import numpy as np
from sklearn import preprocessing
def selectInitMeanVec(Data,k):#选择初始均值向量
indexInitMeanVec = random.sample(range(m), k)
initMeanVec = Data[indexInitMeanVec, :]
return initMeanVec
def calcDistance(Data, k, MeanVec):#计算距离并归入簇中
Dist = np.zeros((k, 1))
Label = np.zeros((m, 1))
for i in range(m):
for j in range(k):
a = Data[i, :]-MeanVec[j, :]
Dist[j] = np.sqrt(sum(a**2))
Label[i] = np.argmin(Dist)
return Label
def updateMeanVec(Data, Label, k, oldMeanVec):#更新均值向量
newMeanVec = np.zeros((k, n))
numSamples = np.zeros((k, 1), dtype=int)
for i in range(k):
num = 0
D = np.zeros((k, 0))
for j in range(m):
if Label[j] == i:
D = np.append(D, Data[j, :])
num += 1
numSamples[i] = num
D = np.reshape(D, (-1, n))
newMeanVec[i, :] = np.mean(D, axis=0)
#如果本次更新后某一簇中无样本,取上一次均值向量为本次均值向量
if num == 0:
newMeanVec[i, :] = oldMeanVec[i, :]
return newMeanVec, numSamples
if __name__ == '__main__':
data = np.loadtxt("wine.csv", delimiter=',')[:, 0:7]
'''
[:, 0:7]代表1`7列 7维
改变[:, m:n]中m,n值
n-m=2#2维
n-m=3#3维
n-m=5#5维
n-m=13#13维
'''
print(data)
Data = preprocessing.scale(data)
k = 3
global m, n
m, n = Data.shape
initMeanVec = selectInitMeanVec(Data, k)
oldMeanVec = initMeanVec.copy()
Label = calcDistance(Data, k, initMeanVec)
for i in range(200):
newMeanVec, numSamples = updateMeanVec(Data, Label, k, oldMeanVec)
oldMeanVec = newMeanVec.copy()
Label = calcDistance(Data, k, newMeanVec)
# print(Label, Data)
print('---第%d轮迭代完成'%(i+1))
print(numSamples)
for L in Label:
if 0 in L:
print("第一个簇包含:第%d个" %l)
elif 1 in L:
print("第二个簇包含:第%d个" %l)
elif 2 in L:
print("第三个簇包含:第%d个" %l)
else:
pass
l += 1