# 5.6 支持向量机
#汽车评价数据,6个特征变量,1个分类标签,共1728条记录
#要求取1690条记录作为训练集,余下的作为测试集,计算预测准确率
import numpy as np
import pandas as pd
import os
os.chdir("C:\\Users\\Administrator\\Desktop") #更改工作路径,注意双\\ 任何操作前可以先将常用包和路径先设置好
# 1.读取数据
data = pd.read_excel("car.xlsx")
datah = data.head(6) # 展示前6行
print(datah)
a1 a2 a3 a4 a5 a6 d
0 4 4 2 2 3 2 3
1 4 4 2 2 3 3 3
2 4 4 2 2 3 1 3
3 4 4 2 2 2 2 3
4 4 4 2 2 2 3 3
5 4 4 2 2 2 1 3
# 2. 变量选择(因变量和自变量)与数据集划分(训练集和测试集)
x = data.iloc[:1690,:6].values # 训练集自变量
y = data.iloc[:1690,6].values # 训练集因变量
x1= data.iloc[1691:,:6].values # 测试集自变量
y1= data.iloc[1691:,6].values # 测试集因变量
# 3.支持向量机分类模型构建
# 导入支持向量机的模块
from sklearn import svm
# 创建支持向量机分类器
clf = svm.SVC(kernel='rbf') # 核函数的选择,linear 、poly、rbf、sigmoid分别表示线性、多项式、高斯、s核函数
# 用fit来拟合数据
clf.fit(x, y)
# 考查模型的训练效果
rv=clf.score(x, y) # 训练集的准确率
# 用训练集学习到的规律应用到测试集上进行预测
R=clf.predict(x1)
# 计算预测值与真实值之间的偏差
Z=R - y1
# 计算预测正确的比例
Rs=len(Z[Z==0])/len(Z)
# 输出预测结果及准确率
print('预测结果为:',R)
print('预测准确率为:',Rs)
预测结果为: [4 3 1 1 3 1 4 3 1 4 3 3 3 3 3 3 3 3 3 3 3 1 3 1 4 3 1 4 3 3 1 3 1 4 3 1 4]
预测准确率为: 0.7027027027027027
# 5.7 K均值聚类
# K表示类别数,选取K个初始类中心,计算每个样本到每个类中心的距离,样本离哪个类别最近就聚到这一类
# 然后重新计算每个类的中心,重新将每个样本按照距离最近原则再进行归类
# 重复上述过程,一直到类别不发生变化为止
# 定义K均值聚类的函数
def K_mean(data,knum):
#输入:data--聚类特征数据集,要求为数据结构要求为numpy数值数组
#输入:knum--聚类个数
#返回值,data后面加一列类别,显示类别
import pandas as pd
import numpy as np
p=len(data[0,:]) #聚类数据维度
cluscenter=np.zeros((knum,p)) #定预定义元素为全0的初始聚类中心
lastcluscenter=np.zeros((knum,p)) #定预定义元素为全0的旧聚类中心
#初始聚类中心和旧聚类中心初始化,取数据的前knum行作为初始值
for i in range(knum):
cluscenter[i,:]=data[i,:]
lastcluscenter[i,:]=data[i,:]
#预定义聚类类别一维数组,用于存放每次计算样本的所属类别
clusindex=np.zeros((len(data)))
while 1:
for i in range(len(data)):
#计算第i个样本到各个聚类中心的欧式距离
#预定义sumsquare,用于存放第i个样本到各个聚类中心的欧式距离
sumsquare=np.zeros((knum))
for k in range(knum):
sumsquare[k]=sum((data[i,:]-cluscenter[k,:])**2)
sumsquare=np.sqrt(sumsquare)
#第i个样本到各个聚类中心的欧式距离进行升序排序
s=pd.Series(sumsquare).sort_values()
#判断第i个样本的类归属(距离最小,即s序列中第0个位置的index)
clusindex[i]=s.index[0]
#将聚类结果添加到聚类数据最后一列
clusdata=np.hstack((data,clusindex.reshape((len(data),1))))
#更新聚类中心,新的聚类中心为对应类别样本特征的均值
for i in range(knum):
cluscenter[i,:]=np.mean(clusdata[clusdata[:,p]==i,:-1],0).reshape(1,p)
#新的聚类中心与旧的聚类中心相减
t=abs(lastcluscenter-cluscenter)
#如果新的聚类中心与旧的聚类中心一致,即聚类中心不发生变化,
#返回聚类结果,并退出循环
if sum(sum(t))==0:
return clusdata
break
#如果更新的聚类中心与旧的聚类中心不一致,
#将更新的聚类中心赋给旧的聚类中心,进入下一次循环
else:
for k in range(knum):
lastcluscenter[k,:]=cluscenter[k,:]
# 调用函数进行运算
D=pd.read_excel('D.xlsx',header=None)
D=D.values
r=K_mean(D,2)
x0=r[r[:,2]==0,0]
y0=r[r[:,2]==0,1]
x1=r[r[:,2]==1,0]
y1=r[r[:,2]==1,1]
import matplotlib.pyplot as plt
plt.plot(x0,y0,'r*')
plt.plot(x1,y1,'bo')
[<matplotlib.lines.Line2D at 0x23d6cf71760>]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PwWjOiyA-1651217914699)(output_5_1.png)]
# 上述例子是自己写K均值聚类函数,并调用。Python中本身包含K均值聚类模块,可直接运用
# 案例:利用31个地区农村居民人均可支配收入进行聚类分析
data=pd.read_excel('农村居民人均可支配收入来源2016.xlsx') # 读取数据
X=data.iloc[:,1:] # 选择聚类变量
from sklearn.preprocessing import StandardScaler #导入标准化的包
scaler = StandardScaler()
scaler.fit(X)
X=scaler.transform(X) # 数据标准化处理
from sklearn.cluster import KMeans # 导入K均值聚类包
model = KMeans(n_clusters = 4, random_state=0, max_iter = 500) # 参数分别表示聚类数,初始状态,最大迭代次数
model.fit(X)
c=model.labels_ # 获取对象中的label属性
Fs=pd.Series(c,index=data['地区'])
Fs=Fs.sort_values(ascending=True) # 按聚类数升序排列
print(Fs)
地区
新疆 0
云南 0
山东 0
西藏 0
福建 0
黑龙江 0
海南 0
辽宁 0
内蒙古 0
河北 0
吉林 0
浙江 1
天津 1
江苏 1
甘肃 2
重庆 2
陕西 2
青海 2
贵州 2
四川 2
河南 2
广东 2
湖南 2
湖北 2
宁夏 2
江西 2
安徽 2
山西 2
广西 2
上海 3
北京 3
dtype: int32