机器学习算法建模与求解
·
一、实验内容
1、对于下表中的数据,对1990年-2005年内的数据建立人口自然增长率对于国民总收入、CPI增长率和人均GDP的三元线性回归模型。


2、下载UCI中wine数据集:http://archive.ics.uci.edu/ml/datasets/Wine。所下载数据可以用txt打开,其中每一行数据为一种Wine的记录,每条记录包含14个维度,其中第一维为该Wine类别,后面13维为具体的Wine属性。请基于所有的178个Wine样本对Wine的13个维度进行PCA降维分析,将贡献率之和大于90%的成分提取,并将原13维属性数据映射为新数据。
3、
(1)随机生成均值、方差各不相同,且相互之间有少量交叉的3个类,每类30个样本,用不同的颜色进行展示。
(2)通过keamns聚类分析,将所有的数据分成3类、4类、5类,每一类用不同颜色展示。共形成4张图。
4、随机生成完全不交叉的2个类,每个类包含30个样本,用SVM进行分类和返回所有支撑向量,并以合适方式进行Figure展示。
二、实验源程序
1、对于下表中的数据,对1990年-2005年内的数据建立人口自然增长率对于国民总收入、CPI增长率和人均GDP的三元线性回归模型。
import pandas as pd
import statsmodels.api as sm
data = {
'y': [15.73,15.04,14.39, 12.98, 11.6, 11.45, 11.21, 10.55, 10.42, 10.06, 9.14, 8.18, 7.58, 6.95, 6.45, 6.01, 5.87, 5.89, 5.38],
'x1': [15037,17001,18718, 21826, 26937, 35260, 48108, 59811, 70142, 78061, 83024, 88479, 98000, 108068, 119096, 135174, 159587, 184089, 213132],
'x2': [18.8,18,3.1, 3.4, 6.4, 14.7, 24.1, 17.1, 8.3, 2.8, -0.8,-1.4, 0.4, 0.7, -0.8, 1.2, 3.9, 1.8, 1.5],
'x3': [1366,1519,1644, 1893, 2311, 2998, 4044, 5046, 5846, 6420, 6796, 7159, 7858, 8622, 9398, 10542, 12336, 14040, 16024]
}
df = pd.DataFrame(data)
X = sm.add_constant(df[['x1', 'x2', 'x3']])
y = df['y']
model = sm.OLS(y, X)
results = model.fit()
print(results.summary())

2、下载UCI中wine数据集:http://archive.ics.uci.edu/ml/datasets/Wine。所下载数据可以用txt打开,其中每一行数据为一种Wine的记录,每条记录包含14个维度,其中第一维为该Wine类别,后面13维为具体的Wine属性。请基于所有的178个Wine样本对Wine的13个维度进行PCA降维分析,将贡献率之和大于90%的成分提取,并将原13维属性数据映射为新数据。
import pandas as pd
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
# 1. 读取数据并设置列名
file_path = "C:/Users/L1307/Desktop/数据统计与分析实验/wine/wine.data"
column_names = [
'Class', 'Alcohol', 'Malic acid', 'Ash', 'Alcalinity of ash', 'Magnesium', 'Total phenols',
'Flavanoids', 'Nonflavanoid phenols', 'Proanthocyanins', 'Color intensity', 'Hue',
'OD280/OD315 of diluted wines', 'Proline'
]
data = pd.read_csv(file_path, names=column_names)
# 2. 分离特征和目标类
X = data.drop(columns=['Class'])
y = data['Class']
# 3. 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 4. 使用PCA并找到贡献率累计大于90%的主成分数
pca = PCA()
X_pca = pca.fit_transform(X_scaled)
cumulative_variance = pca.explained_variance_ratio_.cumsum()
n_components_90 = (cumulative_variance >= 0.9).argmax() + 1
# 5. 以最优成分数重新运行PCA,并将数据映射到新空间
pca_optimal = PCA(n_components=n_components_90)
X_pca_optimal = pca_optimal.fit_transform(X_scaled)
print("满足累计贡献率大于90%的主成分数:", n_components_90)
print("标准化后的数据形状:", X_scaled.shape)
print("经过PCA降维后的数据形状:", X_pca_optimal.shape)
print("降维后的数据前几行:")
print(pd.DataFrame(X_pca_optimal).head())
print("各主成分的方差贡献率:")
print(pca_optimal.explained_variance_ratio_)
print("累计方差贡献率:")
print(pca_optimal.explained_variance_ratio_.cumsum())

3、
(1)随机生成均值、方差各不相同,且相互之间有少量交叉的3个类,每类30个样本,用不同的颜色进行展示。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
# 设置随机种子,以便结果可复现
np.random.seed(42)
# 生成三个类的数据
class1_mean = [2, 2]
class1_cov = [[1, 0], [0, 1]]
class1_samples = np.random.multivariate_normal(class1_mean, class1_cov, 30)
class2_mean = [4, 4]
class2_cov = [[1.5, 0.5], [0.5, 1.5]]
class2_samples = np.random.multivariate_normal(class2_mean, class2_cov, 30)
class3_mean = [3, 6]
class3_cov = [[2, 0], [0, 2]]
class3_samples = np.random.multivariate_normal(class3_mean, class3_cov, 30)
# 将三个类的数据合并
all_samples = np.vstack((class1_samples, class2_samples, class3_samples))
labels = np.concatenate((np.zeros(30), np.ones(30), 2 * np.ones(30)))
# 定义颜色映射
cmap = ListedColormap(['r', 'g', 'b'])
# 绘制散点图
plt.scatter(all_samples[:, 0], all_samples[:, 1], c=labels, cmap=cmap)
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Three Classes with Different Means and Variances')
plt.show()
(2)通过keamns聚类分析,将所有的数据分成3类、4类、5类,每一类用不同颜色展示。共形成4张图。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from matplotlib.colors import ListedColormap
# 生成三个类的数据
def generate_data():
class1_mean = [2, 2]
class1_cov = [[1, 0], [0, 1]]
class1_samples = np.random.multivariate_normal(class1_mean, class1_cov, 30)
class2_mean = [4, 4]
class2_cov = [[1.5, 0.5], [0.5, 1.5]]
class2_samples = np.random.multivariate_normal(class2_mean, class2_cov, 30)
class3_mean = [3, 6]
class3_cov = [[2, 0], [0, 2]]
class3_samples = np.random.multivariate_normal(class3_mean, class3_cov, 30)
return np.vstack((class1_samples, class2_samples, class3_samples))
def plot_original_data(all_samples):
cmap_original = ListedColormap(['r', 'g', 'b'])
plt.scatter(all_samples[:, 0], all_samples[:, 1], c=np.concatenate((np.zeros(30), np.ones(30), 2 * np.ones(30))), cmap=cmap_original)
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Original Data')
plt.show()
def plot_kmeans_clustering(all_samples, n_clusters, cmap_colors):
kmeans = KMeans(n_clusters=n_clusters)
kmeans.fit(all_samples)
labels = kmeans.labels_
cmap = ListedColormap(cmap_colors)
plt.scatter(all_samples[:, 0], all_samples[:, 1], c=labels, cmap=cmap)
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title(f'K-Means Clustering ({n_clusters} classes)')
plt.show()
if __name__ == "__main__":
all_samples = generate_data()
# 绘制原始未聚类的散点图
plot_original_data(all_samples)
# 绘制K-Means聚类分成3类的散点图
plot_kmeans_clustering(all_samples, 3, ['y', 'm', 'c'])
# 绘制K-Means聚类分成4类的散点图
plot_kmeans_clustering(all_samples, 4, ['orange', 'purple', 'lime', 'pink'])
# 绘制K-Means聚类分成5类的散点图
plot_kmeans_clustering(all_samples, 5, ['brown', 'aqua', 'navy', 'teal', 'violet'])






4、随机生成完全不交叉的2个类,每个类包含30个样本,用SVM进行分类和返回所有支撑向量,并以合适方式进行Figure展示。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import SVC
from sklearn.datasets import make_blobs
# 生成完全不交叉的两个类的数据
X, y = make_blobs(n_samples=60, centers=2, cluster_std=1.5, random_state=42)
# 创建SVM分类器对象
clf = SVC(kernel='linear')
# 训练SVM分类器
clf.fit(X, y)
# 获取支撑向量
support_vectors = clf.support_vectors_
# 绘制数据点和分类边界
plt.scatter(X[:, 0], X[:, 0], c=y, cmap='viridis')
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
# 创建网格来评估模型
xx = np.linspace(xlim[0], xlim[1], 30)
yy = np.linspace(ylim[0], ylim[1], 30)
YY, XX = np.meshgrid(yy, xx)
xy = np.vstack([XX.ravel(), YY.ravel()]).T
Z = clf.decision_function(xy).reshape(XX.shape)
# 绘制分类边界和填充区域
ax.contour(XX, YY, Z, colors='k', levels=[-1, 0, 1], alpha=0.5,
linestyles=['--', '-', '--'])
ax.scatter(support_vectors[:, 0], support_vectors[:, 1], s=100,
linewidth=1, facecolors='none', edgecolors='r')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('SVM Classification of Two Non-Overlapping Classes')
plt.show()
print("支撑向量:")

更多推荐

所有评论(0)