Ứng dụng kmean trong phân loại sản phẩm
Trang 2LỜI NÓI ĐẦU
Ngày nay không ai có thể phủ nhận vai trò cực kỳ quan trọng của máy tính trongnghiên cứu khoa học kỹ thuật cũng như trong đời sống Máy tính đã làm được những điều kỳdiệu và giải được những vấn đề tưởng chừng nan giải Càng ngày càng có nhiều người tự hỏi,liệu máy tính có khả năng suy nghĩ như con người hay chưa? Chúng ta sẽ không trả lời câuhỏi ấy Thay vào đó, chúng ta sẽ nêu ra những khác biệt chủ yếu giữa cách làm việc của máytính và bộ óc con người
Một máy tính, dù có mạnh đến đâu chăng nữa, đều phải làm việc theo một chươngtrình chính xác đã được hoạch định trước bởi các chuyên gia Bài toán càng phức tạp thì việclập trình càng công phu Trong khi đó con người làm việc bằng cách học tập và rèn luyện, khilàm việc con người có khả năng liên tưởng, kết nối sự việc này với sự việc khác, và quantrọng hơn hết, họ có thể sáng tạo
Ngày nay, các website giới thiệu, mua bán sản phẩm trực tuyến ngày càng nhiều trêninternet Có rất nhiều hình thức giới thiệu sản phẩm tới khách hàng, nhưng làm sao để khikhách hàng mua xong sản phẩm này mà lại có hứng thú để mua sản phẩm khác mới là vẫn đềđặt ra với các trang web bán hàng trực tuyến Những website thông minh như vậy sẽ có giáthành rất cao và ít cửa hàng có thể bỏ tiền ra đầu tư
Điều khó khăn của khả năng phân loại này là dữ liệu đầu vào phải được chuẩn hóa mộtcác chính xác đề chương trình có thể phân loại được sản phẩm vào đúng nhóm phù hợp.Với một số phương pháp truyền thống, phân loại các nhóm sản phẩm dựa theo mã củanhóm trong các sản phẩm Với cách làm này, hoàn toàn phụ thuộc vào việc sắp đặt của ngườinhập dữ liệu
Việc sử dụng Kmean để phân cụm tự động cho các sản phẩm sẽ giúp cho việc phânloại mềm dẻo hơn, dựa trên các tiêu chí của sản phẩm mà ta có thể phân loại sản phẩm nàythuộc các nhóm nào Từ đó đưa ra những gợi ý cần thiết làm vừa lòng những vị khách hàngkhó tính nhất
Trang 3I Một số phương pháp phân cụm dữ liệu điển hình
1 Phương pháp phân cụm phân hoạch
Ý tưởng chính của phương pháp này là phân một tập dữ liệu có n phần tử cho trước thành k nhóm dữ liệu sao cho mỗi phần tử dữ liệu chỉ thuộc về một nhóm dữ liệu và mỗi
nhóm dữ liệu có tối thiểu một phần tử dữ liệu Các thuật toán phân hoạch có độ phức tạp rấtlớn khi xác định nghiệm tối ưu toàn cục cho vấn đề PCDL, vì nó phải tìm kiếm tất cả các cáchphân hoạch có thể được Chính vì vậy, trên thực tế người ta thường đi tìm giải pháp tối ưu cục
bộ cho vấn đề này bằng cách sử dụng một hàm tiêu chuẩn để đánh giá chất lượng của các cụmcũng như để hướng dẫn cho quá trình tìm kiếm phân hoạch dữ liệu Với chiến lược này, thôngthường người ta bắt đầu khải tạo một phân hoạch ban đầu cho tập dữ liệu theo phép ngẫunhiên hoặc theo heuristic và liên tục tinh chỉnh nó cho đến khi thu được một phân hoạchmong muốn, thoả mãn các điều kiện ràng buộc cho trước Các thuật toán phân cụm phânhoạch cố gắng cải tiến tiêu chuẩn phân cụm bằng cách tính các giá trị độ đo tương tự giữa cácđối tượng dữ liệu và sắp xếp các giá trị này, sau đó thuật toán lựa chọn một giá trị trong dãysắp xếp sao cho hàm tiêu chuẩn đạt giá trị tối thiểu Như vậy, ý tưởng chính của thuật toánphân cụm phân hoạch tối ưu cục bộ là sử dụng chiến lược tham ăn để tìm kiếm nghiệm
Lớp các thuật toán phân cụm phân hoạch bao gồm các thuật toán đề xuất đầu tiêntrong lĩnh vực KPDL cũng là các thuật toán được áp dụng nhiều trong thực tế Sau đây là một
số thuật toán kinh điển áp dụng phương pháp phân hoạch được kế thừa sử dụng rộng rãi:
2 Thuật toán k-means
Thuật toán phân cụm phân hoạch k- means do MacQueen đề xuất trong lĩnh vực thống
kê năm 1967, mục đích của tuật toán k- means là sinh ra k cụm dữ liệu {C 1 , C 2 , …, C k } từ một tập dữ liệu ban đầu gồm n đối tượng trong không gian d chiều X i =(x i1 , x i2 , …, x id ), (i 1 ,n),
sao cho hàm tiêu chuẩn:
1
2( ) đạt cực tiểu Trong đó: m i là trọng tâm của
cụm C i , D là khoảng cách giữa hai đối tượng.
Trọng tâm của một cụm là một vector, trong đó giá trị của mỗi phần tử của nó là trungbình cộng các thành phần tương ứng của các đối tượng vector dữ liệu trong cụm đang xét
Tham số đầu vào của thuật toán là số cụm k, tập CSDL gồm n phần tử và tham số đầu ra của thuật toán là các trọng tâm của cụm dữ liệu Độ đo khoảng cách D giữa các đối tượng dữ liệu
Trang 4thường được sử dụng là khoảng cách Euclide, bởi đây là mô hình khoảng cách dễ để lấy đạohàm và xác định các cực trị tối thiểu Hàm tiêu chuẩn và độ đo khoảng cách có thể được xác
định cụ thể hơn tuỳ vào ứng dụng hoặc các quan điểm của người dùng Thuật toán k- means
bao gồm các bước cơ bản sau:
INPUT: Một CSDL gồm n đối tượng và số cụm cần phân là k.
OUTPUT: Các cụm C i (i=1 k) sao cho hàm tiêu chuẩn E đạt giá trị tối thiểu.
Thuật toán tiến hành 4 bước sau:
Bước 1: Khởi tạo
Chọn k đối tượng m j (j=1…k) là trọng tâm ban đầu của k cụm từ tập dữ liệu đầu vào
(việc lựa chọn này có thể ngẫu nhiên hoặc chọn theo kinh nghiệm chuyên gia)
Bước 2: Tính khoảng cách
Đối với mỗi đối tượng X i (1 ≤ i ≤ n), tính khoảng cách của nó tới mỗi trọng tâm m j
với j=1,…,k, sau đó tìm trọng tâm gần nhất đối với mỗi đối tượng.
Bước 3: Cập nhật lại trong tâm
Đối với mỗi j=1,…,k, cập nhật trọng tâm cụm m j bằng cách xác định trung bìnhcộng của các vector đối tượng dữ liệu
Bước 4: Điều kiện dừng
Lặp lại bước 2 và bước b cho đến khi các trọng tâm của cụm không thay đổi
Hình 2 .Thuật toán k-means Thuật toán k-means được chứng minh là hội tụ và có độ phức tạp tính toán là: O((n.k.d).. flop ) Trong đó, n là số đối tượng dữ liệu, k là số cụm dữ liệu, d là số chiều của
vector đối tượng dữ liệu, là số vòng lặp, flop là thời gian để thực hiện để thực hiện một phép
tính cơ sở như phép cộng, trừ, nhân, chia,… Như vậy, do thuật toán k-means phân tích phân
cụm đơn giản nên có thể áp dụng đối với tập dữ liệu lớn Tuy nhiên, nhược điểm của thuật
toán k-means là chỉ áp dụng với dữ liệu có thuộc tính số và khám phá ra các cụm có dạng hình cầu, không những vậy mà thuật toán k-means rất nhậy cảm với nhiễu và các phần tử ngoại lai
trong dữ liệu Hình sau diễn tả, mô phỏng về một số hình dạng cụm dữ liệu khám phá được
bởi thuật toán k-means:
Trang 5Hình 2 .Hình dạng cụm dữ liệu được khám phá bởi thuật toán k-means
Hơn nữa, chất lượng PCDL của thuật toán k-means phụ thuộc nhiều vào các tham số đầu vào như: số cụm k và k trọng tâm khởi tạo ban đầu Trong trường hợp, các trọng tâm khởi
tạo ban đầu mà quá lệch so với các trọng tâm của cụm tự nhiên thì kết quả phân cụm của thuật
toán k-means là rất thấp, nghĩa là các cụm dữ liệu được khám phá rất lệch so với các cụm
trong thực tế Trên thực tế người ta chưa có một giải pháp tối ưu nào để chọn các tham số đầu
vào, giải pháp thường được sử dụng nhất là thử nghiệm với các giá trị đầu vào k cụm dữ liệu
khác nhau rồi sau đó chọn giải pháp tốt nhất
Đến nay, đã có rất nhiều thuật toán kế thừa tư tưởng của thuật toán k-means áp dụng
trong KPDL để giải quyết tập dữ liệu có kích thước rất lớn đang được áp dụng rất hiệu quả và
phổ biến như thuật toán PAM, CLARA, CLARANS, k-medoid, k-prototypes,…
II Ứng dụng kmean trong phân cụm website
1 Giới thiệu
Ngày nay, các website giới thiệu, mua bán sản phẩm trực tuyến ngày càng nhiều trêninternet Có rất nhiều hình thức giới thiệu sản phẩm tới khách hàng, nhưng làm sao để khikhách hàng mua xong sản phẩm này mà lại có hứng thú để mua sản phẩm khác mới là vẫn đềđặt ra với các trang web bán hàng trực tuyến Những website thông minh như vậy sẽ có giáthành rất cao và ít cửa hàng có thể bỏ tiền ra đầu tư
Điều khó khăn của khả năng phân loại này là dữ liệu đầu vào phải được chuẩn hóa mộtcác chính xác đề chương trình có thể phân loại được sản phẩm vào đúng nhóm phù hợp.Với một số phương pháp truyền thống, phân loại các nhóm sản phẩm dựa theo mã củanhóm trong các sản phẩm Với cách làm này, hoàn toàn phụ thuộc vào việc sắp đặt của ngườinhập dữ liệu
Việc sử dụng Kmean để phân cụm tự động cho các sản phẩm sẽ giúp cho việc phânloại mềm dẻo hơn, dựa trên các tiêu chí của sản phẩm mà ta có thể phân loại sản phẩm nàythuộc các nhóm nào Từ đó đưa ra những gợi ý cần thiết làm vừa lòng những vị khách hàngkhó tính nhất
1.1 Phát biểu bài toán
Cho một cơ sở dữ liệu có bảng chính là dữ liệu các sản phẩm Các sản phẩm gồm sốlượng, giá, màu sắc, chất liệu, nhà sản xuất Tất cả đều là khóa ngoại liên kết tới các bảngkhác
Trang 6Từ giả thiết, xây dựng ứng dụng phân chia số sản phẩm có trong csdl thành các nhómkhác nhau sao cho các sản phẩm trong cùng một nhóm có tính chất giống nhau nhất.
Ý tưởng bài toán :
Chọn ra n sản phẩm ngẫu nhiên làm trọng tâm để phân nhóm với n là số nhóm cầnphân
Sử dụng Kmean để phân chia các sản phẩm vào các nhóm
Tính lại trọng tâm của từng nhóm
Phân chia lại nhóm
Lặp lại cho đến khi trọng tâm bước trước bằng trọng tâm bước sau
Các bước này đều được chương trình xử lý tự động Mỗi khi thêm một sản phẩm mới,chúng ta đã có dữ liệu trọng tâm của các nhóm Ta sẽ so sánh sản phẩm mới này với cáctrọng tâm và từ đó phân được vào đúng nhóm mà không cần phân nhóm lại cho toàn bộsản phẩm
1.2 Các bước giải quyết giải quyết bài toán
1.2.1. Xây dựng tập dữ liệu là các sản phẩm
Người sử dụng sẽ vào quản trị của website và nhập dữ liệu từng sản phẩm Trước tiêncần nhập các bảng là bảng khóa ngoại của bảng sản phẩm như bảng màu sắc, kích cỡ, chấtliệu, nhà sản xuất…
Dữ liệu sẽ được nhập vào từng nhóm sao cho các nhóm, các tính chất của sản phẩmđược phân bổ rõ ràng giúp việc phân loại được thể hiện rõ nhất Việc gợi ý mua cũng được rõràng nhất
Trang 7Danh sách các sản phẩm sau khi nhập
Dữ liệu được lưu trong bảng sản phẩm
Đầu vào sẽ là danh sách các sản phẩm và 6 thuộc tính: Price, Quantity, Color,Manufacturer, Size, Material Các thuộc tính này đã được mã hóa bằng các con số đồng nhất
để dễ dàng cho việc tính toán với các công thức toán học
Trang 8Ta sẽ phân thành 4 nhóm, mỗi nhóm sẽ gồm các sản phẩm có tính chất tương tự nhaunhất
1.2.1.1. Sử dụng Kmean đề phân chia sản phẩm vào các nhóm
III Cài đặt chương trình thử nghiệm
/// Thuật toán phân cụm K-Mean
/// Trả về mảng 1 chiều, các phần tử trong mảng có giá trị bằng nhau sẽ cùng một cụm
///</summary>
///<param name="n">Số tập dữ liệu</param>
///<param name="m">Số thuộc tính của dữ liệu</param>
///<param name="input">Dữ liệu đầu vào</param>
///<param name="numGroup">Số cụm</param>
publicint[] Execute(int n, int m, float[,] input, int numGroup)
{
if (numGroup > n) returnnull;
var oldCenter = newfloat[numGroup, m];
Center = newfloat[numGroup, m];
var result = newint[n];
for (int i = 0; i < n; i++)
bool check = true;
var distance = newfloat[numGroup];
Trang 9//tim toa do tam
float[,] newCenter = oldCenter;
for (int i = 0; i < n; i++)
var result = newfloat[dt.Rows.Count, endCol - startCol];
for (int i = 0; i < dt.Rows.Count; i++)
Trang 10privatestaticreadonlystring strConStr =
ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
#region DB Access Functions
privatestaticSqlConnection con;
publicstaticSqlConnection GetConnect()
{
if (con == null)
con = newSqlConnection(strConStr);
if (con.State == ConnectionState.Closed)
Trang 11using (SqlConnection conn = GetConnect())
{
using (var ds = newDataSet()) {
using (var da = newSqlDataAdapter()) {
da.SelectCommand = cmd; da.SelectCommand.Connection = conn; da.Fill(ds); return ds.Tables[0]; }
}
}
}
}
finally {
}
}
publicstaticSqlDataReader ExecuteReader(SqlCommand cmd) {
try {
if (cmd.Connection != null) {
return cmd.ExecuteReader(); }
else {
using (SqlConnection conn = GetConnect()) {
cmd.Connection = conn; return cmd.ExecuteReader(); }
}
}
finally {
}
}
publicstaticDataSet GetDsData(SqlCommand cmd) {
try {
if (cmd.Connection != null) {
using (var ds = newDataSet())
Trang 12{
using (var da = newSqlDataAdapter()) {
da.SelectCommand = cmd; da.Fill(ds); return ds; }
}
}
else {
using (SqlConnection conn = GetConnect()) {
using (var ds = newDataSet()) {
using (var da = newSqlDataAdapter()) {
da.SelectCommand = cmd; da.SelectCommand.Connection = conn; da.Fill(ds); return ds; }
}
}
}
}
finally {
}
}
publicstaticDataTable GetTable(string sql) {
SqlConnection conn = GetConnect(); var dt=newDataTable(); var ad = newSqlDataAdapter(sql, conn); ad.Fill(dt); return dt; }
publicstaticvoid ExeCuteNonquery(SqlCommand cmd) {
try {
SqlConnection conn = GetConnect(); cmd.Connection = conn; cmd.ExecuteNonQuery(); }
finally {
Trang 13SqlConnection conn = GetConnect();
var cmd = newSqlCommand(sql, conn);
SqlConnection conn = GetConnect();
var cmd = newSqlCommand(sql, conn);
Trang 14cmd.CommandType = CommandType.Text;
return (int) ExecuteScalar(cmd);
var hashmd5 = newMD5CryptoServiceProvider();
keyArray = hashmd5.ComputeHash(Encoding.UTF8.GetBytes("THANHNV")); }
else keyArray = Encoding.UTF8.GetBytes("THANHNV");
var tdes = newTripleDESCryptoServiceProvider
ICryptoTransform cTransform = tdes.CreateEncryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0,
Trang 15keyArray = hashmd5.ComputeHash(Encoding.UTF8.GetBytes("THANHNV")); }
else keyArray = Encoding.UTF8.GetBytes("THANHNV");
var tdes = newTripleDESCryptoServiceProvider
ICryptoTransform cTransform = tdes.CreateDecryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0,
float min = float.MaxValue;
string nhom="", center="";
for (int i = 0; i < dtGroup.Rows.Count; i++)
nhom = dtGroup.Rows[i]["Group_Kmean"].ToString();
center = dtGroup.Rows[i]["Center_Kmean"].ToString();
Trang 16ddlUSize.SelectedValue, ddlUMaterial.SelectedValue, ddlUGroupProduct.SelectedValue,nhom,center);
ProductController.Product_Update(ViewState["Id"].ToString(),
Session["upload"] == null ? "" : Session["upload"].ToString(), txtName.Text,
txtDescription.Text,
txtPrice.Text, txtQuantity.Text, ddlUColor.SelectedValue, ddlUManufacturer.SelectedValue, ddlUSize.SelectedValue, ddlUMaterial.SelectedValue,
3.1.4 Mã nguồn phân loại toàn bộ sản phẩm
DataTable dt = ProductController.Product_GetAll();
constint m = 5;//số tiêu chí phân cụm (màu sắc, chất liệu, hãng sx, kích cỡ)
int numgroup = int.Parse(SqlDataProvider.ExecuteScalar("Select NumGroup from
var km = newKMean();
float[,] data = km.ConvertDataTable(ProductController.Product_GetAll(), 5, 10); int[] result = km.Execute(dt.Rows.Count, m,data, numgroup);
//lấy center
var center=newstring[numgroup];
for (int i = 0; i < numgroup; i++)