实验内容:
1.对鸢尾花数据集(iris.csv)的4个特征——萼片长度(sepal_len)、萼片宽度(sepal_wid)、花瓣长度(petal_len)、花瓣宽度(petal_wid)进行标准化。(分别使用最小最大规范化、零均值规范化、小数定标规范化)。
2.用主成分分析方法对鸢尾花数据集(iris.csv)进行维归约。
3.数据元组中age的值如下(按递增序):13,15,16,18,19,20,20,21,22,22,25,25,25,30,33,33,35,35,36,40,45,46,52,70。
问题:
(1)使用等深分箱(箱深为3)的平均值平滑方法对上述数据进行平滑。
(2)使用最小-最大规范化方法,将age的属性值35转换到[0,1.0]区间。
(3)使用z-score规范化方法转换age的属性值35,其中age的标准差为12.94年。
(4)使用小数定标规范化转换age属性值35。
(5)画出属性age宽度为10的等宽直方图。
实验代码:
#1
import numpy as np
import pandas as pd
data=pd.read_csv('D:/Users/Administrator/Desktop/iris1.csv',usecols=[0,1,2,3])
#指定读取哪几列,不要列名 names=None
data=np.array(data,dtype='float64')#类型装换
#data=np.array(date[:,3])
#print(data)
def min_max(data):
M=(data-data.min())/(data.max()-data.min())
print('最小最大规范化为:\n',M)
def z_score(data):
Z=(data-np.median(data))/np.var(data)
print('零均值标准化为:\n',Z)
def V_m(data):
V=data/10
print('小数定标规范化为:\n',V)
min_max(data)
z_score(data)
V_m(data)
#2.
from sklearn import decomposition
def PCA(data):
pca = decomposition.PCA()
pca.fit(data)
pca.n_components = 4
X_reduced = pca.fit_transform(data)
return(X_reduced)
print(PCA(data))
#3.
import numpy as np
import math
from sklearn import preprocessing
import matplotlib.pyplot as plt
age=np.array([13,15,16,18,19,20,20,21,22,22,25,25,25,30,33,33,35,35,36,40,45,46,52,70])
#x.sort()升序排序
# 等深分箱法,深度为3
# 数据长度除以深度3,则为划分的数组行数
depth = age.reshape(int(age.size/3),3)
# 划分后的等深箱
print('划分后的等深箱:\n',depth)
# 按平均值平滑,初始化mean_depth
mean_depth = np.full([5,3],0)
#等深分箱法、均值平滑技术
for i in range(0,5):
for j in range(0,3):
#第i行算数平均值
mean_depth[i][j]=int(depth[i].mean())
# 按平均值平滑后的等深箱
print('问题1-平均值平滑后的等深箱:\n',mean_depth)
dep=np.array([35,35])
depth_d=dep.reshape(int(dep.size/2),2)
min_max_sklearn=preprocessing.MinMaxScaler()
age_minmax=min_max_sklearn.fit_transform(depth_d)
print('问题2-最小-最大规范化为:\n',age_minmax)
def z_score(dep):
Z=(35-np.mean(age))/12.4
print('问题3-z_score规范化为:\n',Z)
def V_m(dep):
V=dep/100
print('问题4-小数定标规范化为:\n',V)
z_score(dep)
V_m(dep)
#问题5--直方图
fig = plt.figure(figsize=(9,4))
plt.hist(age,bins = 10,rwidth=10) # 指定条形的相对宽度
plt.title('年龄直方图');
plt.xlabel("年龄")
plt.ylabel("个数")
plt.show()